ETH Price: $3,591.06 (-2.80%)

Token

ERC-20: 203_Collection (203)
 

Overview

Max Total Supply

102 203

Holders

50

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
bkkbros.eth
Balance
1 203
0x9d3f31110d4e440460b8e605c55a54a261ab8224
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:
Collection

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-30
*/

//
//
//                                                     ..',;;,'.    .;;;;;;;;;;;;;;;;;;;;;;;;;,'..        .                                             
//                                                  'cx0XNWWWNNKko,..lONWWWWWWWWWWWWWWWWWWWWWWWNX0ko:.   .,.                                            
//                                                ;xXWWWWWWWWWWWWWNOl..;xXWWWWWWWWWWWWWWWWWWWWWWWWWWWKx;.                                               
//                                              .dNWWWWWWWWWWWWWWWWWWXd;.'l0NWWWWWWWWWWWWWWWWWWWWWWWWWWNO;                                              
//                                             .xWWWWWWWWWWWWWWWWWWWWWWNOc..;lxXWWWWWWWWWWWWWWWWWWWWWWWWWXo.                                            
//                                             cNWWWWWWWWWWWWWWWWWWWWWWWWWKd,..'o0NWWWWWWWWWWWWWWWWWWWWWWWNd.                                           
//                                            .dWWWWWWWWWNx;ckXWWWWWWWWWWWWWNKOc..',,,,,,,,,,,:o0WWWWWWWWWWNc                                           
//                                             dWWWWWWWWWWk;. 'oKWWWWWWWWWWWWWWWKd,             .dNWWWWWWWWWk.                                          
//                                             :XWWWWWWWWWWNOl. .:kNWWWWWWWWWWWWWWNkc.           'OWWWWWWWWW0'                                          
//                                             .oNWWWWWWWWWWWWXx;. ,oKWWWWWWWWWWWWWWWKo,         ;KWWWWWWWWW0'                                          
//                                              .cKWWWWWWWWWWWWWNOl. .ckNWWWWWWWWWWWWWWNk:.    .c0WWWWWWWWWWd.                                          
//                                                .o0WWWWWWWWWWWWWWXd;. ,dKWWWWWWWWWWWWWWWKkxxkKWWWWWWWWWWW0,                                           
//                                                  .:kXWWWWWWWWWWWWWNOc. .cOKNWWWWWWWWWWWWWWWWWWWWWWWWWWWK;                                            
//                                                     'o0WWWWWWWWWWWWWWKd,. .,dKWWWWWWWWWWWWWWWWWWWWWWWNk'                                             
//                                                       .:kXWWWWWWWWWWWWWNOc;. .cONWWWWWWWWWWWWWWWWWWNO:.                                              
//                                                          'oKWWWWWWWWWWWWWWWKd,  ,oOXWWWWWWWWWWWWXOo,                                                 
//                                                            .:kXWWWWWWWWWWWWWWNOc.  .;loxkkkkxdl;'.                                                   
//                                                               ,oKWWWWWWWWWWWWWWWKd.                                                                  
//                                                                 .:kNWWWWWWWWWWWWXd.                                                                  
//                                                                    ,dKWWWWWWWWNO,                                                                    
//                                                                      .:kNWWWWKl.                                                                     
//                                                                         ,dO0x'                                                                       
//                                                                            .                                                                         
//                                                                                                                                                      
//                                                                                                                                                      
   

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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");

        (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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @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/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;
    
    // Base URI
    string private _baseURI;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;


    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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;

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @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 _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 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 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 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 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 || 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 {
        _setApprovalForAll(_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 _owners[tokenId] != address(0);
    }

    /**
     * @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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `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);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

        _afterTokenTransfer(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);

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

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

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

        _afterTokenTransfer(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 from incorrect 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);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @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` and `to` are never both zero.
     *
     * 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

//                                                                                                                                                      
//                                                                                                                                                      
//                                    ..'.         ..'.  .'..                  .;,                           .,,.                                       
//                             ,dxl.  lXNO'        cXNK;,0NXc                  ;X0'                          ,OO,                                       
//                             oWWK,  oWW0'        'lol.;XWNl                  ;X0'      ..           ..      ..                     .                  
//                ,lxO0Oko;. ,xKWWNOl.oWWKookOkx:. 'dxo.;XMWl  .cdxd:..:dkkkxdcoX0'  .cxkkkkd;.   'okkxkkd;  .dd.  .cxkkkd:cx;.lx::dkkOko.              
//              .dNWKxod0WNk',xKWWNOl.oWWWXOx0NWWx.cNMX;;XWWl.;OWWKl..kNO:'';cdKW0' :KKo,.';kXx. ;KKc...;kXl ;XX; ;KXd,'':kNWo'OWKd:'':OWk.             
//             .dWWNd;,,lKWWx. oWWK,  oWWXc  .xWWK,cNMX;;XWWkxXWXd. .dWk.      lN0',KNl.....,OWo :NXo,.. .'. ;XX;'0Nl     .OWo'OWd.    :NK,             
//             '0WWWNNNNNNNN0, oWWK,  oWW0,   oWWK,cNMX;;XMW00WWK:  .OWl       ;X0'cWNkdddddxOKo. ;ok000Oxl' ;XX;;XK,      dWo'ONc     ;XK,             
//             .kWWXl''',ccc;. oWWK,  oWW0,   oWWK,cNMX;;XWWo'kWWXl..kWd.      cN0':NX:......,:. .'. ..,:kN0,;XX;,KX:     .kMo'ONc     ;XK,             
//              ,0WW0occxKX0:  oWWK,  oWW0'   oWWK,cNMX;;XWWl .xNWNx.;KXo.. ..c0W0'.dNk,.  .cK0,.oNx'   .lXK,;XX;.oN0:...;kNWo'ONc     ;XK,             
//               .ckKXNNKOd,   :00k'  c00x.   c00k';O0k,'k00:  .o000o.'d00Okkkdokx. .:xOkkkOOd,  .lOOkkkkOx, 'kk'  ;dOkxxdoOWo.d0;     ,kk'             
//                  .....       ...    ...     ...  ...  ...     ....   ..''..  ..     ..''..       .'''..    ..  .,..... .ONc ..       ..              
//                                                                                                                cXKl,',:kXd.                          
// 

pragma solidity ^0.8.12;

contract Collection is ERC721, ERC721Enumerable, Ownable {
    
    using Counters for Counters.Counter;

    address public artistAddress = 0xFBda58BCAafE5242f3f4aeDDe42dC2966D4d5B48;
    address public developerAddress = 0xdaf5cFd45FeC6Cc49ea969739376dBF6136c4024;
    uint public constant artistShare = 90;
    uint public constant devShare = 10;

    uint public constant sum = 100;

    uint public constant maxPieces = 203;
    
    uint public saleState = 0;

    uint[2] public price = [499000000000000000,600000000000000000];

    mapping(address => uint) public SReditions;
    mapping(address => bool) public GAeditions;
    mapping(address => bool) public WLClaimed;

    // Diamond hand + Dario + CWS + WL Giveway
    bytes32 public merkleRoot;

    string uri = "https://api.ethikdesign.fr/";

    Counters.Counter private _tokenIdCounter;

    constructor() ERC721("203_Collection", "203") {}


    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }

    

    function updateSRWallet(address[] memory collectors, uint[] memory editions) public onlyOwner{
        for(uint i=0; i<collectors.length;i++){
            SReditions[collectors[i]] = editions[i];
        }
    }

    function updateGAWallet(address[] memory collectors) public onlyOwner{
        for(uint i=0; i<collectors.length;i++){
            GAeditions[collectors[i]] = true;
        }
    }

    //Allow sale state progression
    function moveSale() public onlyOwner{
        saleState+=1;
    }

    //Setup Step 2 WL mint
    function setMerkeleRoots(bytes32 root) public onlyOwner {
        merkleRoot = root;
    }
    
 

    //Free Mint allocated to Giveaway 
    function mintGA() public {

        //Check drop state.
        require (saleState > 0, "Drop state not open yet");

        //Check if Supply still on.
        require (totalSupply() < maxPieces, "All the pieces have been sold");

        // Verify the merkle proof.
        require (GAeditions[msg.sender] != false,"Now winner of giveaway");
    
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);
        
        GAeditions[msg.sender]=false;
    }

    //Free Mint allocated to SR collectors
    function mintSR() public {

        //Check drop state.
        require (saleState > 0, "Drop state not open yet");

        //Check if Supply still on.
        require (totalSupply() < maxPieces, "All the pieces have been sold");

        // Verify the merkle proof.
        require (SReditions[msg.sender] != 0,"Not owner of SR piece or already claimed");
        
        //Check if mint not over Supply.
        require (totalSupply() + SReditions[msg.sender] < maxPieces, "Mint above max supply");

        
        for (uint i=0;i < SReditions[msg.sender]*3; i++){
            uint256 tokenId = _tokenIdCounter.current();
            _tokenIdCounter.increment();
            _safeMint(msg.sender, tokenId);
        }

        SReditions[msg.sender]=0;
    }

    //Whitelist mint  
    function mintWL(uint pieceNbr, bytes32[] memory merkleProof) public payable{
        
        //Check drop state.
        require (saleState > 1, "Drop state not open yet");

        //Check if Supply still on.
        require (totalSupply() < maxPieces, "All the pieces have been sold");

        //Check if mint not over Supply.
        require (totalSupply() + 1 < maxPieces, "Mint above max supply");

        //Cap max piece per transaction.
        require (pieceNbr < 3, "Max piece per transaction reached");

        // Verify the merkle proof.
        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(merkleProof, merkleRoot, node), "Invalid Merkle-proof");
        require(msg.value >= price[0] * pieceNbr, "Ether value sent is below the price");

        //Verify if claimed.
        require(WLClaimed[msg.sender]!=true, "Piece already claimed");

        //Check actual token ID and send to caller
        for (uint i = 0; i < pieceNbr; i++) {
            uint256 tokenId = _tokenIdCounter.current();
            _tokenIdCounter.increment();
            _safeMint(msg.sender, tokenId);
        }

        //Flag piece as claimed 
        WLClaimed[msg.sender] = true;

    }

    //Public mint  
    function mintOP() public payable{
        
        //Check drop state.
        require (saleState > 2, "Drop state not open yet");


        //Check if Supply still on.
        require (totalSupply() < maxPieces, "All the pieces have been sold");

        //Check if mint not over Supply.
        require (totalSupply() + 1 < maxPieces, "Mint above max supply");

        require(msg.value >= price[1], "Ether value sent is below the price");
        
        //Check actual token ID and send to caller
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);

    }


    //Withdraw funds  

    function withdraw() public payable{
        uint256 balance = address(this).balance;
        uint toDeveloper = balance * (devShare) / (sum);
        uint toArtist = balance * (artistShare) / (sum);
        payable(developerAddress).transfer(toDeveloper);
        payable(artistAddress).transfer(toArtist);
        assert(address(this).balance == 0);
    }


    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    // The following functions are overrides required by Solidity.

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

}

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":[{"internalType":"address","name":"","type":"address"}],"name":"GAeditions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"SReditions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WLClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"artistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artistShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"maxPieces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintGA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintOP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintSR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pieceNbr","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"moveSale","outputs":[],"stateMutability":"nonpayable","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":"","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":[],"name":"saleState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkeleRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"address[]","name":"collectors","type":"address[]"}],"name":"updateGAWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collectors","type":"address[]"},{"internalType":"uint256[]","name":"editions","type":"uint256[]"}],"name":"updateSRWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405273fbda58bcaafe5242f3f4aedde42dc2966d4d5b48600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073daf5cfd45fec6cc49ea969739376dbf6136c4024600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600f5560405180604001604052806706eccddb2eeb800067ffffffffffffffff168152602001670853a0d2313c000067ffffffffffffffff168152506010906002620000fe929190620002ef565b506040518060400160405280601b81526020017f68747470733a2f2f6170692e657468696b64657369676e2e66722f0000000000815250601690805190602001906200014c92919062000340565b503480156200015a57600080fd5b506040518060400160405280600e81526020017f3230335f436f6c6c656374696f6e0000000000000000000000000000000000008152506040518060400160405280600381526020017f32303300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001df92919062000340565b508060019080519060200190620001f892919062000340565b5050506200021b6200020f6200022160201b60201c565b6200022960201b60201c565b62000455565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82600281019282156200032d579160200282015b828111156200032c578251829067ffffffffffffffff1690559160200191906001019062000303565b5b5090506200033c9190620003d1565b5090565b8280546200034e906200041f565b90600052602060002090601f016020900481019282620003725760008555620003be565b82601f106200038d57805160ff1916838001178555620003be565b82800160010185558215620003be579182015b82811115620003bd578251825591602001919060010190620003a0565b5b509050620003cd9190620003d1565b5090565b5b80821115620003ec576000816000905550600101620003d2565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200043857607f821691505b602082108114156200044f576200044e620003f0565b5b50919050565b6153ce80620004656000396000f3fe6080604052600436106102515760003560e01c80636c0360eb11610139578063c87b56dd116100b6578063dd7239ae1161007a578063dd7239ae14610867578063e4c2fa20146108a4578063e86e6038146108cd578063e985e9c5146108e4578063f2fde38b14610921578063f72009f31461094a57610251565b8063c87b56dd1461078d578063caccd7f7146107ca578063cf933f86146107f5578063d0bfb81014610820578063d7eb3f3a1461083c57610251565b806395d89b41116100fd57806395d89b41146106db578063a22cb46514610706578063aed04fae1461072f578063b88d4fde1461075a578063c75158bd1461078357610251565b80636c0360eb1461060657806370a0823114610631578063715018a61461066e578063853255cc146106855780638da5cb5b146106b057610251565b80632eb4a7ab116101d25780634f6ccce7116101965780634f6ccce7146104d257806355f804b31461050f57806359892bf1146105385780635fe6442c14610561578063603f4d521461059e5780636352211e146105c957610251565b80632eb4a7ab1461040e5780632f745c59146104395780633ccfd60b1461047657806340d66bcf1461048057806342842e0e146104a957610251565b80630a33ced4116102195780630a33ced41461033b5780631621c27b1461036657806318160ddd1461037d57806323b872dd146103a857806326a49e37146103d157610251565b806301ffc9a714610256578063046520151461029357806306fdde03146102aa578063081812fc146102d5578063095ea7b314610312575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906136f4565b610987565b60405161028a919061373c565b60405180910390f35b34801561029f57600080fd5b506102a8610999565b005b3480156102b657600080fd5b506102bf610a31565b6040516102cc91906137f0565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613848565b610ac3565b60405161030991906138b6565b60405180910390f35b34801561031e57600080fd5b50610339600480360381019061033491906138fd565b610b48565b005b34801561034757600080fd5b50610350610c60565b60405161035d919061394c565b60405180910390f35b34801561037257600080fd5b5061037b610c65565b005b34801561038957600080fd5b50610392610edf565b60405161039f919061394c565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca9190613967565b610eec565b005b3480156103dd57600080fd5b506103f860048036038101906103f39190613848565b610f4c565b604051610405919061394c565b60405180910390f35b34801561041a57600080fd5b50610423610f67565b60405161043091906139d3565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906138fd565b610f6d565b60405161046d919061394c565b60405180910390f35b61047e611012565b005b34801561048c57600080fd5b506104a760048036038101906104a29190613a1a565b611139565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613967565b6111bf565b005b3480156104de57600080fd5b506104f960048036038101906104f49190613848565b6111df565b604051610506919061394c565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613b7c565b611250565b005b34801561054457600080fd5b5061055f600480360381019061055a9190613d50565b6112d8565b005b34801561056d57600080fd5b5061058860048036038101906105839190613dc8565b6113f0565b604051610595919061373c565b60405180910390f35b3480156105aa57600080fd5b506105b3611410565b6040516105c0919061394c565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb9190613848565b611416565b6040516105fd91906138b6565b60405180910390f35b34801561061257600080fd5b5061061b6114c8565b60405161062891906137f0565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190613dc8565b61155a565b604051610665919061394c565b60405180910390f35b34801561067a57600080fd5b50610683611612565b005b34801561069157600080fd5b5061069a61169a565b6040516106a7919061394c565b60405180910390f35b3480156106bc57600080fd5b506106c561169f565b6040516106d291906138b6565b60405180910390f35b3480156106e757600080fd5b506106f06116c9565b6040516106fd91906137f0565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190613e21565b61175b565b005b34801561073b57600080fd5b50610744611771565b604051610751919061394c565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190613f02565b611776565b005b61078b6117d8565b005b34801561079957600080fd5b506107b460048036038101906107af9190613848565b61193b565b6040516107c191906137f0565b60405180910390f35b3480156107d657600080fd5b506107df611aae565b6040516107ec91906138b6565b60405180910390f35b34801561080157600080fd5b5061080a611ad4565b604051610817919061394c565b60405180910390f35b61083a60048036038101906108359190614048565b611ad9565b005b34801561084857600080fd5b50610851611e0f565b60405161085e91906138b6565b60405180910390f35b34801561087357600080fd5b5061088e60048036038101906108899190613dc8565b611e35565b60405161089b919061373c565b60405180910390f35b3480156108b057600080fd5b506108cb60048036038101906108c691906140a4565b611e55565b005b3480156108d957600080fd5b506108e2611f66565b005b3480156108f057600080fd5b5061090b600480360381019061090691906140ed565b612106565b604051610918919061373c565b60405180910390f35b34801561092d57600080fd5b5061094860048036038101906109439190613dc8565b61219a565b005b34801561095657600080fd5b50610971600480360381019061096c9190613dc8565b612292565b60405161097e919061394c565b60405180910390f35b6000610992826122aa565b9050919050565b6109a1612324565b73ffffffffffffffffffffffffffffffffffffffff166109bf61169f565b73ffffffffffffffffffffffffffffffffffffffff1614610a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0c90614179565b60405180910390fd5b6001600f6000828254610a2891906141c8565b92505081905550565b606060008054610a409061424d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6c9061424d565b8015610ab95780601f10610a8e57610100808354040283529160200191610ab9565b820191906000526020600020905b815481529060010190602001808311610a9c57829003601f168201915b5050505050905090565b6000610ace8261232c565b610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b04906142f1565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5382611416565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb90614383565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610be3612324565b73ffffffffffffffffffffffffffffffffffffffff161480610c125750610c1181610c0c612324565b612106565b5b610c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4890614415565b60405180910390fd5b610c5b8383612398565b505050565b60cb81565b6000600f5411610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190614481565b60405180910390fd5b60cb610cb4610edf565b10610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb906144ed565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6e9061457f565b60405180910390fd5b60cb601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dc1610edf565b610dcb91906141c8565b10610e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e02906145eb565b60405180910390fd5b60005b6003601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e5a919061460b565b811015610e97576000610e6d6017612451565b9050610e79601761245f565b610e833382612475565b508080610e8f90614665565b915050610e0e565b506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6000600a80549050905090565b610efd610ef7612324565b82612493565b610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3390614720565b60405180910390fd5b610f47838383612571565b505050565b60108160028110610f5c57600080fd5b016000915090505481565b60155481565b6000610f788361155a565b8210610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb0906147b2565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600047905060006064600a83611028919061460b565b6110329190614801565b905060006064605a84611045919061460b565b61104f9190614801565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156110b9573d6000803e3d6000fd5b50600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611122573d6000803e3d6000fd5b506000471461113457611133614832565b5b505050565b611141612324565b73ffffffffffffffffffffffffffffffffffffffff1661115f61169f565b73ffffffffffffffffffffffffffffffffffffffff16146111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90614179565b60405180910390fd5b8060158190555050565b6111da83838360405180602001604052806000815250611776565b505050565b60006111e9610edf565b821061122a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611221906148d3565b60405180910390fd5b600a828154811061123e5761123d6148f3565b5b90600052602060002001549050919050565b611258612324565b73ffffffffffffffffffffffffffffffffffffffff1661127661169f565b73ffffffffffffffffffffffffffffffffffffffff16146112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c390614179565b60405180910390fd5b6112d5816127d8565b50565b6112e0612324565b73ffffffffffffffffffffffffffffffffffffffff166112fe61169f565b73ffffffffffffffffffffffffffffffffffffffff1614611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134b90614179565b60405180910390fd5b60005b82518110156113eb57818181518110611373576113726148f3565b5b602002602001015160126000858481518110611392576113916148f3565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806113e390614665565b915050611357565b505050565b60136020528060005260406000206000915054906101000a900460ff1681565b600f5481565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b690614994565b60405180910390fd5b80915050919050565b6060600280546114d79061424d565b80601f01602080910402602001604051908101604052809291908181526020018280546115039061424d565b80156115505780601f1061152557610100808354040283529160200191611550565b820191906000526020600020905b81548152906001019060200180831161153357829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c290614a26565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61161a612324565b73ffffffffffffffffffffffffffffffffffffffff1661163861169f565b73ffffffffffffffffffffffffffffffffffffffff161461168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590614179565b60405180910390fd5b61169860006127f2565b565b606481565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116d89061424d565b80601f01602080910402602001604051908101604052809291908181526020018280546117049061424d565b80156117515780601f1061172657610100808354040283529160200191611751565b820191906000526020600020905b81548152906001019060200180831161173457829003601f168201915b5050505050905090565b61176d611766612324565b83836128b8565b5050565b600a81565b611787611781612324565b83612493565b6117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd90614720565b60405180910390fd5b6117d284848484612a25565b50505050565b6002600f541161181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490614481565b60405180910390fd5b60cb611827610edf565b10611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185e906144ed565b60405180910390fd5b60cb6001611873610edf565b61187d91906141c8565b106118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b4906145eb565b60405180910390fd5b60106001600281106118d2576118d16148f3565b5b0154341015611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90614ab8565b60405180910390fd5b60006119226017612451565b905061192e601761245f565b6119383382612475565b50565b60606119468261232c565b611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c90614b4a565b60405180910390fd5b60006003600084815260200190815260200160002080546119a59061424d565b80601f01602080910402602001604051908101604052809291908181526020018280546119d19061424d565b8015611a1e5780601f106119f357610100808354040283529160200191611a1e565b820191906000526020600020905b815481529060010190602001808311611a0157829003601f168201915b505050505090506000611a2f6114c8565b9050600081511415611a45578192505050611aa9565b600082511115611a7a578082604051602001611a62929190614ba6565b60405160208183030381529060405292505050611aa9565b80611a8485612a81565b604051602001611a95929190614ba6565b604051602081830303815290604052925050505b919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b605a81565b6001600f5411611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1590614481565b60405180910390fd5b60cb611b28610edf565b10611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f906144ed565b60405180910390fd5b60cb6001611b74610edf565b611b7e91906141c8565b10611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb5906145eb565b60405180910390fd5b60038210611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890614c3c565b60405180910390fd5b600033604051602001611c149190614ca4565b604051602081830303815290604052805190602001209050611c398260155483612be2565b611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90614d0b565b60405180910390fd5b826010600060028110611c8e57611c8d6148f3565b5b0154611c9a919061460b565b341015611cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd390614ab8565b60405180910390fd5b60011515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6790614d77565b60405180910390fd5b60005b83811015611db1576000611d876017612451565b9050611d93601761245f565b611d9d3382612475565b508080611da990614665565b915050611d73565b506001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60146020528060005260406000206000915054906101000a900460ff1681565b611e5d612324565b73ffffffffffffffffffffffffffffffffffffffff16611e7b61169f565b73ffffffffffffffffffffffffffffffffffffffff1614611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890614179565b60405180910390fd5b60005b8151811015611f6257600160136000848481518110611ef657611ef56148f3565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f5a90614665565b915050611ed4565b5050565b6000600f5411611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa290614481565b60405180910390fd5b60cb611fb5610edf565b10611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec906144ed565b60405180910390fd5b60001515601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415612089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208090614de3565b60405180910390fd5b60006120956017612451565b90506120a1601761245f565b6120ab3382612475565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121a2612324565b73ffffffffffffffffffffffffffffffffffffffff166121c061169f565b73ffffffffffffffffffffffffffffffffffffffff1614612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d90614179565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614e75565b60405180910390fd5b61228f816127f2565b50565b60126020528060005260406000206000915090505481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061231d575061231c82612bf9565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661240b83611416565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61248f828260405180602001604052806000815250612cdb565b5050565b600061249e8261232c565b6124dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d490614f07565b60405180910390fd5b60006124e883611416565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061252a57506125298185612106565b5b8061256857508373ffffffffffffffffffffffffffffffffffffffff1661255084610ac3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661259182611416565b73ffffffffffffffffffffffffffffffffffffffff16146125e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125de90614f99565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264e9061502b565b60405180910390fd5b612662838383612d36565b61266d600082612398565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126bd919061504b565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461271491906141c8565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127d3838383612d46565b505050565b80600290805190602001906127ee9291906135e5565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e906150cb565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a18919061373c565b60405180910390a3505050565b612a30848484612571565b612a3c84848484612d4b565b612a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a729061515d565b60405180910390fd5b50505050565b60606000821415612ac9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bdd565b600082905060005b60008214612afb578080612ae490614665565b915050600a82612af49190614801565b9150612ad1565b60008167ffffffffffffffff811115612b1757612b16613a51565b5b6040519080825280601f01601f191660200182016040528015612b495781602001600182028036833780820191505090505b5090505b60008514612bd657600182612b62919061504b565b9150600a85612b71919061517d565b6030612b7d91906141c8565b60f81b818381518110612b9357612b926148f3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bcf9190614801565b9450612b4d565b8093505050505b919050565b600082612bef8584612ed3565b1490509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cc457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cd45750612cd382612f48565b5b9050919050565b612ce58383612fb2565b612cf26000848484612d4b565b612d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d289061515d565b60405180910390fd5b505050565b612d4183838361318c565b505050565b505050565b6000612d6c8473ffffffffffffffffffffffffffffffffffffffff166132a0565b15612ec6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d95612324565b8786866040518563ffffffff1660e01b8152600401612db79493929190615203565b6020604051808303816000875af1925050508015612df357506040513d601f19601f82011682018060405250810190612df09190615264565b60015b612e76573d8060008114612e23576040519150601f19603f3d011682016040523d82523d6000602084013e612e28565b606091505b50600081511415612e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e659061515d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ecb565b600190505b949350505050565b60008082905060005b8451811015612f3d576000858281518110612efa57612ef96148f3565b5b60200260200101519050808311612f1c57612f1583826132c3565b9250612f29565b612f2681846132c3565b92505b508080612f3590614665565b915050612edc565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613022576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613019906152dd565b60405180910390fd5b61302b8161232c565b1561306b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306290615349565b60405180910390fd5b61307760008383612d36565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130c791906141c8565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461318860008383612d46565b5050565b6131978383836132da565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131da576131d5816132df565b613219565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613218576132178382613328565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561325c5761325781613495565b61329b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461329a576132998282613566565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016133358461155a565b61333f919061504b565b9050600060096000848152602001908152602001600020549050818114613424576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506134a9919061504b565b90506000600b60008481526020019081526020016000205490506000600a83815481106134d9576134d86148f3565b5b9060005260206000200154905080600a83815481106134fb576134fa6148f3565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061354a57613549615369565b5b6001900381819060005260206000200160009055905550505050565b60006135718361155a565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b8280546135f19061424d565b90600052602060002090601f016020900481019282613613576000855561365a565b82601f1061362c57805160ff191683800117855561365a565b8280016001018555821561365a579182015b8281111561365957825182559160200191906001019061363e565b5b509050613667919061366b565b5090565b5b8082111561368457600081600090555060010161366c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136d18161369c565b81146136dc57600080fd5b50565b6000813590506136ee816136c8565b92915050565b60006020828403121561370a57613709613692565b5b6000613718848285016136df565b91505092915050565b60008115159050919050565b61373681613721565b82525050565b6000602082019050613751600083018461372d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613791578082015181840152602081019050613776565b838111156137a0576000848401525b50505050565b6000601f19601f8301169050919050565b60006137c282613757565b6137cc8185613762565b93506137dc818560208601613773565b6137e5816137a6565b840191505092915050565b6000602082019050818103600083015261380a81846137b7565b905092915050565b6000819050919050565b61382581613812565b811461383057600080fd5b50565b6000813590506138428161381c565b92915050565b60006020828403121561385e5761385d613692565b5b600061386c84828501613833565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138a082613875565b9050919050565b6138b081613895565b82525050565b60006020820190506138cb60008301846138a7565b92915050565b6138da81613895565b81146138e557600080fd5b50565b6000813590506138f7816138d1565b92915050565b6000806040838503121561391457613913613692565b5b6000613922858286016138e8565b925050602061393385828601613833565b9150509250929050565b61394681613812565b82525050565b6000602082019050613961600083018461393d565b92915050565b6000806000606084860312156139805761397f613692565b5b600061398e868287016138e8565b935050602061399f868287016138e8565b92505060406139b086828701613833565b9150509250925092565b6000819050919050565b6139cd816139ba565b82525050565b60006020820190506139e860008301846139c4565b92915050565b6139f7816139ba565b8114613a0257600080fd5b50565b600081359050613a14816139ee565b92915050565b600060208284031215613a3057613a2f613692565b5b6000613a3e84828501613a05565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a89826137a6565b810181811067ffffffffffffffff82111715613aa857613aa7613a51565b5b80604052505050565b6000613abb613688565b9050613ac78282613a80565b919050565b600067ffffffffffffffff821115613ae757613ae6613a51565b5b613af0826137a6565b9050602081019050919050565b82818337600083830152505050565b6000613b1f613b1a84613acc565b613ab1565b905082815260208101848484011115613b3b57613b3a613a4c565b5b613b46848285613afd565b509392505050565b600082601f830112613b6357613b62613a47565b5b8135613b73848260208601613b0c565b91505092915050565b600060208284031215613b9257613b91613692565b5b600082013567ffffffffffffffff811115613bb057613baf613697565b5b613bbc84828501613b4e565b91505092915050565b600067ffffffffffffffff821115613be057613bdf613a51565b5b602082029050602081019050919050565b600080fd5b6000613c09613c0484613bc5565b613ab1565b90508083825260208201905060208402830185811115613c2c57613c2b613bf1565b5b835b81811015613c555780613c4188826138e8565b845260208401935050602081019050613c2e565b5050509392505050565b600082601f830112613c7457613c73613a47565b5b8135613c84848260208601613bf6565b91505092915050565b600067ffffffffffffffff821115613ca857613ca7613a51565b5b602082029050602081019050919050565b6000613ccc613cc784613c8d565b613ab1565b90508083825260208201905060208402830185811115613cef57613cee613bf1565b5b835b81811015613d185780613d048882613833565b845260208401935050602081019050613cf1565b5050509392505050565b600082601f830112613d3757613d36613a47565b5b8135613d47848260208601613cb9565b91505092915050565b60008060408385031215613d6757613d66613692565b5b600083013567ffffffffffffffff811115613d8557613d84613697565b5b613d9185828601613c5f565b925050602083013567ffffffffffffffff811115613db257613db1613697565b5b613dbe85828601613d22565b9150509250929050565b600060208284031215613dde57613ddd613692565b5b6000613dec848285016138e8565b91505092915050565b613dfe81613721565b8114613e0957600080fd5b50565b600081359050613e1b81613df5565b92915050565b60008060408385031215613e3857613e37613692565b5b6000613e46858286016138e8565b9250506020613e5785828601613e0c565b9150509250929050565b600067ffffffffffffffff821115613e7c57613e7b613a51565b5b613e85826137a6565b9050602081019050919050565b6000613ea5613ea084613e61565b613ab1565b905082815260208101848484011115613ec157613ec0613a4c565b5b613ecc848285613afd565b509392505050565b600082601f830112613ee957613ee8613a47565b5b8135613ef9848260208601613e92565b91505092915050565b60008060008060808587031215613f1c57613f1b613692565b5b6000613f2a878288016138e8565b9450506020613f3b878288016138e8565b9350506040613f4c87828801613833565b925050606085013567ffffffffffffffff811115613f6d57613f6c613697565b5b613f7987828801613ed4565b91505092959194509250565b600067ffffffffffffffff821115613fa057613f9f613a51565b5b602082029050602081019050919050565b6000613fc4613fbf84613f85565b613ab1565b90508083825260208201905060208402830185811115613fe757613fe6613bf1565b5b835b818110156140105780613ffc8882613a05565b845260208401935050602081019050613fe9565b5050509392505050565b600082601f83011261402f5761402e613a47565b5b813561403f848260208601613fb1565b91505092915050565b6000806040838503121561405f5761405e613692565b5b600061406d85828601613833565b925050602083013567ffffffffffffffff81111561408e5761408d613697565b5b61409a8582860161401a565b9150509250929050565b6000602082840312156140ba576140b9613692565b5b600082013567ffffffffffffffff8111156140d8576140d7613697565b5b6140e484828501613c5f565b91505092915050565b6000806040838503121561410457614103613692565b5b6000614112858286016138e8565b9250506020614123858286016138e8565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614163602083613762565b915061416e8261412d565b602082019050919050565b6000602082019050818103600083015261419281614156565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141d382613812565b91506141de83613812565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561421357614212614199565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061426557607f821691505b602082108114156142795761427861421e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006142db602c83613762565b91506142e68261427f565b604082019050919050565b6000602082019050818103600083015261430a816142ce565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061436d602183613762565b915061437882614311565b604082019050919050565b6000602082019050818103600083015261439c81614360565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006143ff603883613762565b915061440a826143a3565b604082019050919050565b6000602082019050818103600083015261442e816143f2565b9050919050565b7f44726f70207374617465206e6f74206f70656e20796574000000000000000000600082015250565b600061446b601783613762565b915061447682614435565b602082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f416c6c20746865207069656365732068617665206265656e20736f6c64000000600082015250565b60006144d7601d83613762565b91506144e2826144a1565b602082019050919050565b60006020820190508181036000830152614506816144ca565b9050919050565b7f4e6f74206f776e6572206f66205352207069656365206f7220616c726561647960008201527f20636c61696d6564000000000000000000000000000000000000000000000000602082015250565b6000614569602883613762565b91506145748261450d565b604082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f4d696e742061626f7665206d617820737570706c790000000000000000000000600082015250565b60006145d5601583613762565b91506145e08261459f565b602082019050919050565b60006020820190508181036000830152614604816145c8565b9050919050565b600061461682613812565b915061462183613812565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561465a57614659614199565b5b828202905092915050565b600061467082613812565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146a3576146a2614199565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061470a603183613762565b9150614715826146ae565b604082019050919050565b60006020820190508181036000830152614739816146fd565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061479c602b83613762565b91506147a782614740565b604082019050919050565b600060208201905081810360008301526147cb8161478f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061480c82613812565b915061481783613812565b925082614827576148266147d2565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006148bd602c83613762565b91506148c882614861565b604082019050919050565b600060208201905081810360008301526148ec816148b0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061497e602983613762565b915061498982614922565b604082019050919050565b600060208201905081810360008301526149ad81614971565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614a10602a83613762565b9150614a1b826149b4565b604082019050919050565b60006020820190508181036000830152614a3f81614a03565b9050919050565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b6000614aa2602383613762565b9150614aad82614a46565b604082019050919050565b60006020820190508181036000830152614ad181614a95565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614b34602f83613762565b9150614b3f82614ad8565b604082019050919050565b60006020820190508181036000830152614b6381614b27565b9050919050565b600081905092915050565b6000614b8082613757565b614b8a8185614b6a565b9350614b9a818560208601613773565b80840191505092915050565b6000614bb28285614b75565b9150614bbe8284614b75565b91508190509392505050565b7f4d617820706965636520706572207472616e73616374696f6e2072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c26602183613762565b9150614c3182614bca565b604082019050919050565b60006020820190508181036000830152614c5581614c19565b9050919050565b60008160601b9050919050565b6000614c7482614c5c565b9050919050565b6000614c8682614c69565b9050919050565b614c9e614c9982613895565b614c7b565b82525050565b6000614cb08284614c8d565b60148201915081905092915050565b7f496e76616c6964204d65726b6c652d70726f6f66000000000000000000000000600082015250565b6000614cf5601483613762565b9150614d0082614cbf565b602082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b7f506965636520616c726561647920636c61696d65640000000000000000000000600082015250565b6000614d61601583613762565b9150614d6c82614d2b565b602082019050919050565b60006020820190508181036000830152614d9081614d54565b9050919050565b7f4e6f772077696e6e6572206f6620676976656177617900000000000000000000600082015250565b6000614dcd601683613762565b9150614dd882614d97565b602082019050919050565b60006020820190508181036000830152614dfc81614dc0565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e5f602683613762565b9150614e6a82614e03565b604082019050919050565b60006020820190508181036000830152614e8e81614e52565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614ef1602c83613762565b9150614efc82614e95565b604082019050919050565b60006020820190508181036000830152614f2081614ee4565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614f83602583613762565b9150614f8e82614f27565b604082019050919050565b60006020820190508181036000830152614fb281614f76565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615015602483613762565b915061502082614fb9565b604082019050919050565b6000602082019050818103600083015261504481615008565b9050919050565b600061505682613812565b915061506183613812565b92508282101561507457615073614199565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006150b5601983613762565b91506150c08261507f565b602082019050919050565b600060208201905081810360008301526150e4816150a8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615147603283613762565b9150615152826150eb565b604082019050919050565b600060208201905081810360008301526151768161513a565b9050919050565b600061518882613812565b915061519383613812565b9250826151a3576151a26147d2565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006151d5826151ae565b6151df81856151b9565b93506151ef818560208601613773565b6151f8816137a6565b840191505092915050565b600060808201905061521860008301876138a7565b61522560208301866138a7565b615232604083018561393d565b818103606083015261524481846151ca565b905095945050505050565b60008151905061525e816136c8565b92915050565b60006020828403121561527a57615279613692565b5b60006152888482850161524f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006152c7602083613762565b91506152d282615291565b602082019050919050565b600060208201905081810360008301526152f6816152ba565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615333601c83613762565b915061533e826152fd565b602082019050919050565b6000602082019050818103600083015261536281615326565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212203a10b1bfa5a8601842937ab71469d5c6f898283d663c705a22a66bb5eb6f864764736f6c634300080c0033

Deployed Bytecode

0x6080604052600436106102515760003560e01c80636c0360eb11610139578063c87b56dd116100b6578063dd7239ae1161007a578063dd7239ae14610867578063e4c2fa20146108a4578063e86e6038146108cd578063e985e9c5146108e4578063f2fde38b14610921578063f72009f31461094a57610251565b8063c87b56dd1461078d578063caccd7f7146107ca578063cf933f86146107f5578063d0bfb81014610820578063d7eb3f3a1461083c57610251565b806395d89b41116100fd57806395d89b41146106db578063a22cb46514610706578063aed04fae1461072f578063b88d4fde1461075a578063c75158bd1461078357610251565b80636c0360eb1461060657806370a0823114610631578063715018a61461066e578063853255cc146106855780638da5cb5b146106b057610251565b80632eb4a7ab116101d25780634f6ccce7116101965780634f6ccce7146104d257806355f804b31461050f57806359892bf1146105385780635fe6442c14610561578063603f4d521461059e5780636352211e146105c957610251565b80632eb4a7ab1461040e5780632f745c59146104395780633ccfd60b1461047657806340d66bcf1461048057806342842e0e146104a957610251565b80630a33ced4116102195780630a33ced41461033b5780631621c27b1461036657806318160ddd1461037d57806323b872dd146103a857806326a49e37146103d157610251565b806301ffc9a714610256578063046520151461029357806306fdde03146102aa578063081812fc146102d5578063095ea7b314610312575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906136f4565b610987565b60405161028a919061373c565b60405180910390f35b34801561029f57600080fd5b506102a8610999565b005b3480156102b657600080fd5b506102bf610a31565b6040516102cc91906137f0565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613848565b610ac3565b60405161030991906138b6565b60405180910390f35b34801561031e57600080fd5b50610339600480360381019061033491906138fd565b610b48565b005b34801561034757600080fd5b50610350610c60565b60405161035d919061394c565b60405180910390f35b34801561037257600080fd5b5061037b610c65565b005b34801561038957600080fd5b50610392610edf565b60405161039f919061394c565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca9190613967565b610eec565b005b3480156103dd57600080fd5b506103f860048036038101906103f39190613848565b610f4c565b604051610405919061394c565b60405180910390f35b34801561041a57600080fd5b50610423610f67565b60405161043091906139d3565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906138fd565b610f6d565b60405161046d919061394c565b60405180910390f35b61047e611012565b005b34801561048c57600080fd5b506104a760048036038101906104a29190613a1a565b611139565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613967565b6111bf565b005b3480156104de57600080fd5b506104f960048036038101906104f49190613848565b6111df565b604051610506919061394c565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613b7c565b611250565b005b34801561054457600080fd5b5061055f600480360381019061055a9190613d50565b6112d8565b005b34801561056d57600080fd5b5061058860048036038101906105839190613dc8565b6113f0565b604051610595919061373c565b60405180910390f35b3480156105aa57600080fd5b506105b3611410565b6040516105c0919061394c565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb9190613848565b611416565b6040516105fd91906138b6565b60405180910390f35b34801561061257600080fd5b5061061b6114c8565b60405161062891906137f0565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190613dc8565b61155a565b604051610665919061394c565b60405180910390f35b34801561067a57600080fd5b50610683611612565b005b34801561069157600080fd5b5061069a61169a565b6040516106a7919061394c565b60405180910390f35b3480156106bc57600080fd5b506106c561169f565b6040516106d291906138b6565b60405180910390f35b3480156106e757600080fd5b506106f06116c9565b6040516106fd91906137f0565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190613e21565b61175b565b005b34801561073b57600080fd5b50610744611771565b604051610751919061394c565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190613f02565b611776565b005b61078b6117d8565b005b34801561079957600080fd5b506107b460048036038101906107af9190613848565b61193b565b6040516107c191906137f0565b60405180910390f35b3480156107d657600080fd5b506107df611aae565b6040516107ec91906138b6565b60405180910390f35b34801561080157600080fd5b5061080a611ad4565b604051610817919061394c565b60405180910390f35b61083a60048036038101906108359190614048565b611ad9565b005b34801561084857600080fd5b50610851611e0f565b60405161085e91906138b6565b60405180910390f35b34801561087357600080fd5b5061088e60048036038101906108899190613dc8565b611e35565b60405161089b919061373c565b60405180910390f35b3480156108b057600080fd5b506108cb60048036038101906108c691906140a4565b611e55565b005b3480156108d957600080fd5b506108e2611f66565b005b3480156108f057600080fd5b5061090b600480360381019061090691906140ed565b612106565b604051610918919061373c565b60405180910390f35b34801561092d57600080fd5b5061094860048036038101906109439190613dc8565b61219a565b005b34801561095657600080fd5b50610971600480360381019061096c9190613dc8565b612292565b60405161097e919061394c565b60405180910390f35b6000610992826122aa565b9050919050565b6109a1612324565b73ffffffffffffffffffffffffffffffffffffffff166109bf61169f565b73ffffffffffffffffffffffffffffffffffffffff1614610a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0c90614179565b60405180910390fd5b6001600f6000828254610a2891906141c8565b92505081905550565b606060008054610a409061424d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6c9061424d565b8015610ab95780601f10610a8e57610100808354040283529160200191610ab9565b820191906000526020600020905b815481529060010190602001808311610a9c57829003601f168201915b5050505050905090565b6000610ace8261232c565b610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b04906142f1565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5382611416565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb90614383565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610be3612324565b73ffffffffffffffffffffffffffffffffffffffff161480610c125750610c1181610c0c612324565b612106565b5b610c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4890614415565b60405180910390fd5b610c5b8383612398565b505050565b60cb81565b6000600f5411610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190614481565b60405180910390fd5b60cb610cb4610edf565b10610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb906144ed565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6e9061457f565b60405180910390fd5b60cb601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dc1610edf565b610dcb91906141c8565b10610e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e02906145eb565b60405180910390fd5b60005b6003601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e5a919061460b565b811015610e97576000610e6d6017612451565b9050610e79601761245f565b610e833382612475565b508080610e8f90614665565b915050610e0e565b506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6000600a80549050905090565b610efd610ef7612324565b82612493565b610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3390614720565b60405180910390fd5b610f47838383612571565b505050565b60108160028110610f5c57600080fd5b016000915090505481565b60155481565b6000610f788361155a565b8210610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb0906147b2565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600047905060006064600a83611028919061460b565b6110329190614801565b905060006064605a84611045919061460b565b61104f9190614801565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156110b9573d6000803e3d6000fd5b50600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611122573d6000803e3d6000fd5b506000471461113457611133614832565b5b505050565b611141612324565b73ffffffffffffffffffffffffffffffffffffffff1661115f61169f565b73ffffffffffffffffffffffffffffffffffffffff16146111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90614179565b60405180910390fd5b8060158190555050565b6111da83838360405180602001604052806000815250611776565b505050565b60006111e9610edf565b821061122a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611221906148d3565b60405180910390fd5b600a828154811061123e5761123d6148f3565b5b90600052602060002001549050919050565b611258612324565b73ffffffffffffffffffffffffffffffffffffffff1661127661169f565b73ffffffffffffffffffffffffffffffffffffffff16146112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c390614179565b60405180910390fd5b6112d5816127d8565b50565b6112e0612324565b73ffffffffffffffffffffffffffffffffffffffff166112fe61169f565b73ffffffffffffffffffffffffffffffffffffffff1614611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134b90614179565b60405180910390fd5b60005b82518110156113eb57818181518110611373576113726148f3565b5b602002602001015160126000858481518110611392576113916148f3565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806113e390614665565b915050611357565b505050565b60136020528060005260406000206000915054906101000a900460ff1681565b600f5481565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b690614994565b60405180910390fd5b80915050919050565b6060600280546114d79061424d565b80601f01602080910402602001604051908101604052809291908181526020018280546115039061424d565b80156115505780601f1061152557610100808354040283529160200191611550565b820191906000526020600020905b81548152906001019060200180831161153357829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c290614a26565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61161a612324565b73ffffffffffffffffffffffffffffffffffffffff1661163861169f565b73ffffffffffffffffffffffffffffffffffffffff161461168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590614179565b60405180910390fd5b61169860006127f2565b565b606481565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116d89061424d565b80601f01602080910402602001604051908101604052809291908181526020018280546117049061424d565b80156117515780601f1061172657610100808354040283529160200191611751565b820191906000526020600020905b81548152906001019060200180831161173457829003601f168201915b5050505050905090565b61176d611766612324565b83836128b8565b5050565b600a81565b611787611781612324565b83612493565b6117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd90614720565b60405180910390fd5b6117d284848484612a25565b50505050565b6002600f541161181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490614481565b60405180910390fd5b60cb611827610edf565b10611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185e906144ed565b60405180910390fd5b60cb6001611873610edf565b61187d91906141c8565b106118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b4906145eb565b60405180910390fd5b60106001600281106118d2576118d16148f3565b5b0154341015611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90614ab8565b60405180910390fd5b60006119226017612451565b905061192e601761245f565b6119383382612475565b50565b60606119468261232c565b611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c90614b4a565b60405180910390fd5b60006003600084815260200190815260200160002080546119a59061424d565b80601f01602080910402602001604051908101604052809291908181526020018280546119d19061424d565b8015611a1e5780601f106119f357610100808354040283529160200191611a1e565b820191906000526020600020905b815481529060010190602001808311611a0157829003601f168201915b505050505090506000611a2f6114c8565b9050600081511415611a45578192505050611aa9565b600082511115611a7a578082604051602001611a62929190614ba6565b60405160208183030381529060405292505050611aa9565b80611a8485612a81565b604051602001611a95929190614ba6565b604051602081830303815290604052925050505b919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b605a81565b6001600f5411611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1590614481565b60405180910390fd5b60cb611b28610edf565b10611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f906144ed565b60405180910390fd5b60cb6001611b74610edf565b611b7e91906141c8565b10611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb5906145eb565b60405180910390fd5b60038210611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890614c3c565b60405180910390fd5b600033604051602001611c149190614ca4565b604051602081830303815290604052805190602001209050611c398260155483612be2565b611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90614d0b565b60405180910390fd5b826010600060028110611c8e57611c8d6148f3565b5b0154611c9a919061460b565b341015611cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd390614ab8565b60405180910390fd5b60011515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6790614d77565b60405180910390fd5b60005b83811015611db1576000611d876017612451565b9050611d93601761245f565b611d9d3382612475565b508080611da990614665565b915050611d73565b506001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60146020528060005260406000206000915054906101000a900460ff1681565b611e5d612324565b73ffffffffffffffffffffffffffffffffffffffff16611e7b61169f565b73ffffffffffffffffffffffffffffffffffffffff1614611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890614179565b60405180910390fd5b60005b8151811015611f6257600160136000848481518110611ef657611ef56148f3565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f5a90614665565b915050611ed4565b5050565b6000600f5411611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa290614481565b60405180910390fd5b60cb611fb5610edf565b10611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec906144ed565b60405180910390fd5b60001515601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415612089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208090614de3565b60405180910390fd5b60006120956017612451565b90506120a1601761245f565b6120ab3382612475565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121a2612324565b73ffffffffffffffffffffffffffffffffffffffff166121c061169f565b73ffffffffffffffffffffffffffffffffffffffff1614612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d90614179565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614e75565b60405180910390fd5b61228f816127f2565b50565b60126020528060005260406000206000915090505481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061231d575061231c82612bf9565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661240b83611416565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61248f828260405180602001604052806000815250612cdb565b5050565b600061249e8261232c565b6124dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d490614f07565b60405180910390fd5b60006124e883611416565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061252a57506125298185612106565b5b8061256857508373ffffffffffffffffffffffffffffffffffffffff1661255084610ac3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661259182611416565b73ffffffffffffffffffffffffffffffffffffffff16146125e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125de90614f99565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264e9061502b565b60405180910390fd5b612662838383612d36565b61266d600082612398565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126bd919061504b565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461271491906141c8565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127d3838383612d46565b505050565b80600290805190602001906127ee9291906135e5565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e906150cb565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a18919061373c565b60405180910390a3505050565b612a30848484612571565b612a3c84848484612d4b565b612a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a729061515d565b60405180910390fd5b50505050565b60606000821415612ac9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bdd565b600082905060005b60008214612afb578080612ae490614665565b915050600a82612af49190614801565b9150612ad1565b60008167ffffffffffffffff811115612b1757612b16613a51565b5b6040519080825280601f01601f191660200182016040528015612b495781602001600182028036833780820191505090505b5090505b60008514612bd657600182612b62919061504b565b9150600a85612b71919061517d565b6030612b7d91906141c8565b60f81b818381518110612b9357612b926148f3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bcf9190614801565b9450612b4d565b8093505050505b919050565b600082612bef8584612ed3565b1490509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cc457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cd45750612cd382612f48565b5b9050919050565b612ce58383612fb2565b612cf26000848484612d4b565b612d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d289061515d565b60405180910390fd5b505050565b612d4183838361318c565b505050565b505050565b6000612d6c8473ffffffffffffffffffffffffffffffffffffffff166132a0565b15612ec6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d95612324565b8786866040518563ffffffff1660e01b8152600401612db79493929190615203565b6020604051808303816000875af1925050508015612df357506040513d601f19601f82011682018060405250810190612df09190615264565b60015b612e76573d8060008114612e23576040519150601f19603f3d011682016040523d82523d6000602084013e612e28565b606091505b50600081511415612e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e659061515d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ecb565b600190505b949350505050565b60008082905060005b8451811015612f3d576000858281518110612efa57612ef96148f3565b5b60200260200101519050808311612f1c57612f1583826132c3565b9250612f29565b612f2681846132c3565b92505b508080612f3590614665565b915050612edc565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613022576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613019906152dd565b60405180910390fd5b61302b8161232c565b1561306b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306290615349565b60405180910390fd5b61307760008383612d36565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130c791906141c8565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461318860008383612d46565b5050565b6131978383836132da565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131da576131d5816132df565b613219565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613218576132178382613328565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561325c5761325781613495565b61329b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461329a576132998282613566565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016133358461155a565b61333f919061504b565b9050600060096000848152602001908152602001600020549050818114613424576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506134a9919061504b565b90506000600b60008481526020019081526020016000205490506000600a83815481106134d9576134d86148f3565b5b9060005260206000200154905080600a83815481106134fb576134fa6148f3565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061354a57613549615369565b5b6001900381819060005260206000200160009055905550505050565b60006135718361155a565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b8280546135f19061424d565b90600052602060002090601f016020900481019282613613576000855561365a565b82601f1061362c57805160ff191683800117855561365a565b8280016001018555821561365a579182015b8281111561365957825182559160200191906001019061363e565b5b509050613667919061366b565b5090565b5b8082111561368457600081600090555060010161366c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136d18161369c565b81146136dc57600080fd5b50565b6000813590506136ee816136c8565b92915050565b60006020828403121561370a57613709613692565b5b6000613718848285016136df565b91505092915050565b60008115159050919050565b61373681613721565b82525050565b6000602082019050613751600083018461372d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613791578082015181840152602081019050613776565b838111156137a0576000848401525b50505050565b6000601f19601f8301169050919050565b60006137c282613757565b6137cc8185613762565b93506137dc818560208601613773565b6137e5816137a6565b840191505092915050565b6000602082019050818103600083015261380a81846137b7565b905092915050565b6000819050919050565b61382581613812565b811461383057600080fd5b50565b6000813590506138428161381c565b92915050565b60006020828403121561385e5761385d613692565b5b600061386c84828501613833565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138a082613875565b9050919050565b6138b081613895565b82525050565b60006020820190506138cb60008301846138a7565b92915050565b6138da81613895565b81146138e557600080fd5b50565b6000813590506138f7816138d1565b92915050565b6000806040838503121561391457613913613692565b5b6000613922858286016138e8565b925050602061393385828601613833565b9150509250929050565b61394681613812565b82525050565b6000602082019050613961600083018461393d565b92915050565b6000806000606084860312156139805761397f613692565b5b600061398e868287016138e8565b935050602061399f868287016138e8565b92505060406139b086828701613833565b9150509250925092565b6000819050919050565b6139cd816139ba565b82525050565b60006020820190506139e860008301846139c4565b92915050565b6139f7816139ba565b8114613a0257600080fd5b50565b600081359050613a14816139ee565b92915050565b600060208284031215613a3057613a2f613692565b5b6000613a3e84828501613a05565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a89826137a6565b810181811067ffffffffffffffff82111715613aa857613aa7613a51565b5b80604052505050565b6000613abb613688565b9050613ac78282613a80565b919050565b600067ffffffffffffffff821115613ae757613ae6613a51565b5b613af0826137a6565b9050602081019050919050565b82818337600083830152505050565b6000613b1f613b1a84613acc565b613ab1565b905082815260208101848484011115613b3b57613b3a613a4c565b5b613b46848285613afd565b509392505050565b600082601f830112613b6357613b62613a47565b5b8135613b73848260208601613b0c565b91505092915050565b600060208284031215613b9257613b91613692565b5b600082013567ffffffffffffffff811115613bb057613baf613697565b5b613bbc84828501613b4e565b91505092915050565b600067ffffffffffffffff821115613be057613bdf613a51565b5b602082029050602081019050919050565b600080fd5b6000613c09613c0484613bc5565b613ab1565b90508083825260208201905060208402830185811115613c2c57613c2b613bf1565b5b835b81811015613c555780613c4188826138e8565b845260208401935050602081019050613c2e565b5050509392505050565b600082601f830112613c7457613c73613a47565b5b8135613c84848260208601613bf6565b91505092915050565b600067ffffffffffffffff821115613ca857613ca7613a51565b5b602082029050602081019050919050565b6000613ccc613cc784613c8d565b613ab1565b90508083825260208201905060208402830185811115613cef57613cee613bf1565b5b835b81811015613d185780613d048882613833565b845260208401935050602081019050613cf1565b5050509392505050565b600082601f830112613d3757613d36613a47565b5b8135613d47848260208601613cb9565b91505092915050565b60008060408385031215613d6757613d66613692565b5b600083013567ffffffffffffffff811115613d8557613d84613697565b5b613d9185828601613c5f565b925050602083013567ffffffffffffffff811115613db257613db1613697565b5b613dbe85828601613d22565b9150509250929050565b600060208284031215613dde57613ddd613692565b5b6000613dec848285016138e8565b91505092915050565b613dfe81613721565b8114613e0957600080fd5b50565b600081359050613e1b81613df5565b92915050565b60008060408385031215613e3857613e37613692565b5b6000613e46858286016138e8565b9250506020613e5785828601613e0c565b9150509250929050565b600067ffffffffffffffff821115613e7c57613e7b613a51565b5b613e85826137a6565b9050602081019050919050565b6000613ea5613ea084613e61565b613ab1565b905082815260208101848484011115613ec157613ec0613a4c565b5b613ecc848285613afd565b509392505050565b600082601f830112613ee957613ee8613a47565b5b8135613ef9848260208601613e92565b91505092915050565b60008060008060808587031215613f1c57613f1b613692565b5b6000613f2a878288016138e8565b9450506020613f3b878288016138e8565b9350506040613f4c87828801613833565b925050606085013567ffffffffffffffff811115613f6d57613f6c613697565b5b613f7987828801613ed4565b91505092959194509250565b600067ffffffffffffffff821115613fa057613f9f613a51565b5b602082029050602081019050919050565b6000613fc4613fbf84613f85565b613ab1565b90508083825260208201905060208402830185811115613fe757613fe6613bf1565b5b835b818110156140105780613ffc8882613a05565b845260208401935050602081019050613fe9565b5050509392505050565b600082601f83011261402f5761402e613a47565b5b813561403f848260208601613fb1565b91505092915050565b6000806040838503121561405f5761405e613692565b5b600061406d85828601613833565b925050602083013567ffffffffffffffff81111561408e5761408d613697565b5b61409a8582860161401a565b9150509250929050565b6000602082840312156140ba576140b9613692565b5b600082013567ffffffffffffffff8111156140d8576140d7613697565b5b6140e484828501613c5f565b91505092915050565b6000806040838503121561410457614103613692565b5b6000614112858286016138e8565b9250506020614123858286016138e8565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614163602083613762565b915061416e8261412d565b602082019050919050565b6000602082019050818103600083015261419281614156565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141d382613812565b91506141de83613812565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561421357614212614199565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061426557607f821691505b602082108114156142795761427861421e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006142db602c83613762565b91506142e68261427f565b604082019050919050565b6000602082019050818103600083015261430a816142ce565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061436d602183613762565b915061437882614311565b604082019050919050565b6000602082019050818103600083015261439c81614360565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006143ff603883613762565b915061440a826143a3565b604082019050919050565b6000602082019050818103600083015261442e816143f2565b9050919050565b7f44726f70207374617465206e6f74206f70656e20796574000000000000000000600082015250565b600061446b601783613762565b915061447682614435565b602082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f416c6c20746865207069656365732068617665206265656e20736f6c64000000600082015250565b60006144d7601d83613762565b91506144e2826144a1565b602082019050919050565b60006020820190508181036000830152614506816144ca565b9050919050565b7f4e6f74206f776e6572206f66205352207069656365206f7220616c726561647960008201527f20636c61696d6564000000000000000000000000000000000000000000000000602082015250565b6000614569602883613762565b91506145748261450d565b604082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f4d696e742061626f7665206d617820737570706c790000000000000000000000600082015250565b60006145d5601583613762565b91506145e08261459f565b602082019050919050565b60006020820190508181036000830152614604816145c8565b9050919050565b600061461682613812565b915061462183613812565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561465a57614659614199565b5b828202905092915050565b600061467082613812565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146a3576146a2614199565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061470a603183613762565b9150614715826146ae565b604082019050919050565b60006020820190508181036000830152614739816146fd565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061479c602b83613762565b91506147a782614740565b604082019050919050565b600060208201905081810360008301526147cb8161478f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061480c82613812565b915061481783613812565b925082614827576148266147d2565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006148bd602c83613762565b91506148c882614861565b604082019050919050565b600060208201905081810360008301526148ec816148b0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061497e602983613762565b915061498982614922565b604082019050919050565b600060208201905081810360008301526149ad81614971565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614a10602a83613762565b9150614a1b826149b4565b604082019050919050565b60006020820190508181036000830152614a3f81614a03565b9050919050565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b6000614aa2602383613762565b9150614aad82614a46565b604082019050919050565b60006020820190508181036000830152614ad181614a95565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614b34602f83613762565b9150614b3f82614ad8565b604082019050919050565b60006020820190508181036000830152614b6381614b27565b9050919050565b600081905092915050565b6000614b8082613757565b614b8a8185614b6a565b9350614b9a818560208601613773565b80840191505092915050565b6000614bb28285614b75565b9150614bbe8284614b75565b91508190509392505050565b7f4d617820706965636520706572207472616e73616374696f6e2072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c26602183613762565b9150614c3182614bca565b604082019050919050565b60006020820190508181036000830152614c5581614c19565b9050919050565b60008160601b9050919050565b6000614c7482614c5c565b9050919050565b6000614c8682614c69565b9050919050565b614c9e614c9982613895565b614c7b565b82525050565b6000614cb08284614c8d565b60148201915081905092915050565b7f496e76616c6964204d65726b6c652d70726f6f66000000000000000000000000600082015250565b6000614cf5601483613762565b9150614d0082614cbf565b602082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b7f506965636520616c726561647920636c61696d65640000000000000000000000600082015250565b6000614d61601583613762565b9150614d6c82614d2b565b602082019050919050565b60006020820190508181036000830152614d9081614d54565b9050919050565b7f4e6f772077696e6e6572206f6620676976656177617900000000000000000000600082015250565b6000614dcd601683613762565b9150614dd882614d97565b602082019050919050565b60006020820190508181036000830152614dfc81614dc0565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e5f602683613762565b9150614e6a82614e03565b604082019050919050565b60006020820190508181036000830152614e8e81614e52565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614ef1602c83613762565b9150614efc82614e95565b604082019050919050565b60006020820190508181036000830152614f2081614ee4565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614f83602583613762565b9150614f8e82614f27565b604082019050919050565b60006020820190508181036000830152614fb281614f76565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615015602483613762565b915061502082614fb9565b604082019050919050565b6000602082019050818103600083015261504481615008565b9050919050565b600061505682613812565b915061506183613812565b92508282101561507457615073614199565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006150b5601983613762565b91506150c08261507f565b602082019050919050565b600060208201905081810360008301526150e4816150a8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615147603283613762565b9150615152826150eb565b604082019050919050565b600060208201905081810360008301526151768161513a565b9050919050565b600061518882613812565b915061519383613812565b9250826151a3576151a26147d2565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006151d5826151ae565b6151df81856151b9565b93506151ef818560208601613773565b6151f8816137a6565b840191505092915050565b600060808201905061521860008301876138a7565b61522560208301866138a7565b615232604083018561393d565b818103606083015261524481846151ca565b905095945050505050565b60008151905061525e816136c8565b92915050565b60006020828403121561527a57615279613692565b5b60006152888482850161524f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006152c7602083613762565b91506152d282615291565b602082019050919050565b600060208201905081810360008301526152f6816152ba565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615333601c83613762565b915061533e826152fd565b602082019050919050565b6000602082019050818103600083015261536281615326565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212203a10b1bfa5a8601842937ab71469d5c6f898283d663c705a22a66bb5eb6f864764736f6c634300080c0033

Deployed Bytecode Sourcemap

57018:6034:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62835:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58529:67;;;;;;;;;;;;;:::i;:::-;;34337:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37058:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36581:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57421:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59380:785;;;;;;;;;;;;;:::i;:::-;;49319:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37808:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57504:62;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57771:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48987:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62180:363;;;:::i;:::-;;58632:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38218:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49509:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57963:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58078:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57624:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57470:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34031:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36088:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33761:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12745:103;;;;;;;;;;;;;:::i;:::-;;57382:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12094:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34506:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37351:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57339:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38474:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61486:658;;;:::i;:::-;;35055:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57212:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57295:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60197:1260;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57132:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57673:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58301:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58781:547;;;;;;;;;;;;;:::i;:::-;;37577:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13003:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57575:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62835:212;62974:4;63003:36;63027:11;63003:23;:36::i;:::-;62996:43;;62835:212;;;:::o;58529:67::-;12325:12;:10;:12::i;:::-;12314:23;;:7;:5;:7::i;:::-;:23;;;12306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58587:1:::1;58576:9;;:12;;;;;;;:::i;:::-;;;;;;;;58529:67::o:0;34337:100::-;34391:13;34424:5;34417:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34337:100;:::o;37058:221::-;37134:7;37162:16;37170:7;37162;:16::i;:::-;37154:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37247:15;:24;37263:7;37247:24;;;;;;;;;;;;;;;;;;;;;37240:31;;37058:221;;;:::o;36581:411::-;36662:13;36678:23;36693:7;36678:14;:23::i;:::-;36662:39;;36726:5;36720:11;;:2;:11;;;;36712:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36820:5;36804:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36829:37;36846:5;36853:12;:10;:12::i;:::-;36829:16;:37::i;:::-;36804:62;36782:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36963:21;36972:2;36976:7;36963:8;:21::i;:::-;36651:341;36581:411;;:::o;57421:36::-;57454:3;57421:36;:::o;59380:785::-;59468:1;59456:9;;:13;59447:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;57454:3;59556:13;:11;:13::i;:::-;:25;59547:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59700:1;59674:10;:22;59685:10;59674:22;;;;;;;;;;;;;;;;:27;;59665:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;57454:3;59833:10;:22;59844:10;59833:22;;;;;;;;;;;;;;;;59817:13;:11;:13::i;:::-;:38;;;;:::i;:::-;:50;59808:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;59921:6;59916:205;59957:1;59934:10;:22;59945:10;59934:22;;;;;;;;;;;;;;;;:24;;;;:::i;:::-;59930:1;:28;59916:205;;;59979:15;59997:25;:15;:23;:25::i;:::-;59979:43;;60037:27;:15;:25;:27::i;:::-;60079:30;60089:10;60101:7;60079:9;:30::i;:::-;59964:157;59960:3;;;;;:::i;:::-;;;;59916:205;;;;60156:1;60133:10;:22;60144:10;60133:22;;;;;;;;;;;;;;;:24;;;;59380:785::o;49319:113::-;49380:7;49407:10;:17;;;;49400:24;;49319:113;:::o;37808:339::-;38003:41;38022:12;:10;:12::i;:::-;38036:7;38003:18;:41::i;:::-;37995:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38111:28;38121:4;38127:2;38131:7;38111:9;:28::i;:::-;37808:339;;;:::o;57504:62::-;;;;;;;;;;;;;;;;;;;;:::o;57771:25::-;;;;:::o;48987:256::-;49084:7;49120:23;49137:5;49120:16;:23::i;:::-;49112:5;:31;49104:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;49209:12;:19;49222:5;49209:19;;;;;;;;;;;;;;;:26;49229:5;49209:26;;;;;;;;;;;;49202:33;;48987:256;;;;:::o;62180:363::-;62225:15;62243:21;62225:39;;62275:16;57409:3;57371:2;62294:7;:20;;;;:::i;:::-;:28;;;;:::i;:::-;62275:47;;62333:13;57409:3;57330:2;62349:7;:23;;;;:::i;:::-;:31;;;;:::i;:::-;62333:47;;62399:16;;;;;;;;;;;62391:34;;:47;62426:11;62391:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62457:13;;;;;;;;;;;62449:31;;:41;62481:8;62449:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62533:1;62508:21;:26;62501:34;;;;:::i;:::-;;62214:329;;;62180:363::o;58632:92::-;12325:12;:10;:12::i;:::-;12314:23;;:7;:5;:7::i;:::-;:23;;;12306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58712:4:::1;58699:10;:17;;;;58632:92:::0;:::o;38218:185::-;38356:39;38373:4;38379:2;38383:7;38356:39;;;;;;;;;;;;:16;:39::i;:::-;38218:185;;;:::o;49509:233::-;49584:7;49620:30;:28;:30::i;:::-;49612:5;:38;49604:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49717:10;49728:5;49717:17;;;;;;;;:::i;:::-;;;;;;;;;;49710:24;;49509:233;;;:::o;57963:99::-;12325:12;:10;:12::i;:::-;12314:23;;:7;:5;:7::i;:::-;:23;;;12306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58034:20:::1;58046:7;58034:11;:20::i;:::-;57963:99:::0;:::o;58078:215::-;12325:12;:10;:12::i;:::-;12314:23;;:7;:5;:7::i;:::-;:23;;;12306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58186:6:::1;58182:104;58198:10;:17;58196:1;:19;58182:104;;;58263:8;58272:1;58263:11;;;;;;;;:::i;:::-;;;;;;;;58235:10;:25;58246:10;58257:1;58246:13;;;;;;;;:::i;:::-;;;;;;;;58235:25;;;;;;;;;;;;;;;:39;;;;58216:3;;;;;:::i;:::-;;;;58182:104;;;;58078:215:::0;;:::o;57624:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;57470:25::-;;;;:::o;34031:239::-;34103:7;34123:13;34139:7;:16;34147:7;34139:16;;;;;;;;;;;;;;;;;;;;;34123:32;;34191:1;34174:19;;:5;:19;;;;34166:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34257:5;34250:12;;;34031:239;;;:::o;36088:97::-;36136:13;36169:8;36162:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36088:97;:::o;33761:208::-;33833:7;33878:1;33861:19;;:5;:19;;;;33853:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33945:9;:16;33955:5;33945:16;;;;;;;;;;;;;;;;33938:23;;33761:208;;;:::o;12745:103::-;12325:12;:10;:12::i;:::-;12314:23;;:7;:5;:7::i;:::-;:23;;;12306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12810:30:::1;12837:1;12810:18;:30::i;:::-;12745:103::o:0;57382:30::-;57409:3;57382:30;:::o;12094:87::-;12140:7;12167:6;;;;;;;;;;;12160:13;;12094:87;:::o;34506:104::-;34562:13;34595:7;34588:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34506:104;:::o;37351:155::-;37446:52;37465:12;:10;:12::i;:::-;37479:8;37489;37446:18;:52::i;:::-;37351:155;;:::o;57339:34::-;57371:2;57339:34;:::o;38474:328::-;38649:41;38668:12;:10;:12::i;:::-;38682:7;38649:18;:41::i;:::-;38641:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38755:39;38769:4;38775:2;38779:7;38788:5;38755:13;:39::i;:::-;38474:328;;;;:::o;61486:658::-;61589:1;61577:9;;:13;61568:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;57454:3;61679:13;:11;:13::i;:::-;:25;61670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57454:3;61818:1;61802:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:29;61793:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;61891:5;61897:1;61891:8;;;;;;;:::i;:::-;;;;61878:9;:21;;61870:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;62012:15;62030:25;:15;:23;:25::i;:::-;62012:43;;62066:27;:15;:25;:27::i;:::-;62104:30;62114:10;62126:7;62104:9;:30::i;:::-;61518:626;61486:658::o;35055:792::-;35128:13;35162:16;35170:7;35162;:16::i;:::-;35154:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35243:23;35269:10;:19;35280:7;35269:19;;;;;;;;;;;35243:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35299:18;35320:9;:7;:9::i;:::-;35299:30;;35427:1;35411:4;35405:18;:23;35401:72;;;35452:9;35445:16;;;;;;35401:72;35603:1;35583:9;35577:23;:27;35573:108;;;35652:4;35658:9;35635:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35621:48;;;;;;35573:108;35813:4;35819:18;:7;:16;:18::i;:::-;35796:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35782:57;;;;35055:792;;;;:::o;57212:76::-;;;;;;;;;;;;;:::o;57295:37::-;57330:2;57295:37;:::o;60197:1260::-;60343:1;60331:9;;:13;60322:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;57454:3;60431:13;:11;:13::i;:::-;:25;60422:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57454:3;60570:1;60554:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:29;60545:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;60684:1;60673:8;:12;60664:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60773:12;60815:10;60798:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;60788:39;;;;;;60773:54;;60846:49;60865:11;60878:10;;60890:4;60846:18;:49::i;:::-;60838:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;60963:8;60952:5;60958:1;60952:8;;;;;;;:::i;:::-;;;;:19;;;;:::i;:::-;60939:9;:32;;60931:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;61085:4;61062:27;;:9;:21;61072:10;61062:21;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;;61054:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61185:6;61180:193;61201:8;61197:1;:12;61180:193;;;61231:15;61249:25;:15;:23;:25::i;:::-;61231:43;;61289:27;:15;:25;:27::i;:::-;61331:30;61341:10;61353:7;61331:9;:30::i;:::-;61216:157;61211:3;;;;;:::i;:::-;;;;61180:193;;;;61443:4;61419:9;:21;61429:10;61419:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;60272:1185;60197:1260;;:::o;57132:73::-;;;;;;;;;;;;;:::o;57673:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;58301:184::-;12325:12;:10;:12::i;:::-;12314:23;;:7;:5;:7::i;:::-;:23;;;12306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58385:6:::1;58381:97;58397:10;:17;58395:1;:19;58381:97;;;58462:4;58434:10;:25;58445:10;58456:1;58445:13;;;;;;;;:::i;:::-;;;;;;;;58434:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;58415:3;;;;;:::i;:::-;;;;58381:97;;;;58301:184:::0;:::o;58781:547::-;58869:1;58857:9;;:13;58848:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;57454:3;58957:13;:11;:13::i;:::-;:25;58948:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59101:5;59075:31;;:10;:22;59086:10;59075:22;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;;59066:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;59149:15;59167:25;:15;:23;:25::i;:::-;59149:43;;59203:27;:15;:25;:27::i;:::-;59241:30;59251:10;59263:7;59241:9;:30::i;:::-;59315:5;59292:10;:22;59303:10;59292:22;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;58806:522;58781:547::o;37577:164::-;37674:4;37698:18;:25;37717:5;37698:25;;;;;;;;;;;;;;;:35;37724:8;37698:35;;;;;;;;;;;;;;;;;;;;;;;;;37691:42;;37577:164;;;;:::o;13003:201::-;12325:12;:10;:12::i;:::-;12314:23;;:7;:5;:7::i;:::-;:23;;;12306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13112:1:::1;13092:22;;:8;:22;;;;13084:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13168:28;13187:8;13168:18;:28::i;:::-;13003:201:::0;:::o;57575:42::-;;;;;;;;;;;;;;;;;:::o;48679:224::-;48781:4;48820:35;48805:50;;;:11;:50;;;;:90;;;;48859:36;48883:11;48859:23;:36::i;:::-;48805:90;48798:97;;48679:224;;;:::o;10818:98::-;10871:7;10898:10;10891:17;;10818:98;:::o;40312:127::-;40377:4;40429:1;40401:30;;:7;:16;40409:7;40401:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40394:37;;40312:127;;;:::o;44458:174::-;44560:2;44533:15;:24;44549:7;44533:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44616:7;44612:2;44578:46;;44587:23;44602:7;44587:14;:23::i;:::-;44578:46;;;;;;;;;;;;44458:174;;:::o;7422:114::-;7487:7;7514;:14;;;7507:21;;7422:114;;;:::o;7544:127::-;7651:1;7633:7;:14;;;:19;;;;;;;;;;;7544:127;:::o;41296:110::-;41372:26;41382:2;41386:7;41372:26;;;;;;;;;;;;:9;:26::i;:::-;41296:110;;:::o;40606:348::-;40699:4;40724:16;40732:7;40724;:16::i;:::-;40716:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40800:13;40816:23;40831:7;40816:14;:23::i;:::-;40800:39;;40869:5;40858:16;;:7;:16;;;:52;;;;40878:32;40895:5;40902:7;40878:16;:32::i;:::-;40858:52;:87;;;;40938:7;40914:31;;:20;40926:7;40914:11;:20::i;:::-;:31;;;40858:87;40850:96;;;40606:348;;;;:::o;43715:625::-;43874:4;43847:31;;:23;43862:7;43847:14;:23::i;:::-;:31;;;43839:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43953:1;43939:16;;:2;:16;;;;43931:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44009:39;44030:4;44036:2;44040:7;44009:20;:39::i;:::-;44113:29;44130:1;44134:7;44113:8;:29::i;:::-;44174:1;44155:9;:15;44165:4;44155:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;44203:1;44186:9;:13;44196:2;44186:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44234:2;44215:7;:16;44223:7;44215:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44273:7;44269:2;44254:27;;44263:4;44254:27;;;;;;;;;;;;44294:38;44314:4;44320:2;44324:7;44294:19;:38::i;:::-;43715:625;;;:::o;36419:100::-;36503:8;36492;:19;;;;;;;;;;;;:::i;:::-;;36419:100;:::o;13364:191::-;13438:16;13457:6;;;;;;;;;;;13438:25;;13483:8;13474:6;;:17;;;;;;;;;;;;;;;;;;13538:8;13507:40;;13528:8;13507:40;;;;;;;;;;;;13427:128;13364:191;:::o;44774:315::-;44929:8;44920:17;;:5;:17;;;;44912:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45016:8;44978:18;:25;44997:5;44978:25;;;;;;;;;;;;;;;:35;45004:8;44978:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45062:8;45040:41;;45055:5;45040:41;;;45072:8;45040:41;;;;;;:::i;:::-;;;;;;;;44774:315;;;:::o;39684:::-;39841:28;39851:4;39857:2;39861:7;39841:9;:28::i;:::-;39888:48;39911:4;39917:2;39921:7;39930:5;39888:22;:48::i;:::-;39880:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39684:315;;;;:::o;8380:723::-;8436:13;8666:1;8657:5;:10;8653:53;;;8684:10;;;;;;;;;;;;;;;;;;;;;8653:53;8716:12;8731:5;8716:20;;8747:14;8772:78;8787:1;8779:4;:9;8772:78;;8805:8;;;;;:::i;:::-;;;;8836:2;8828:10;;;;;:::i;:::-;;;8772:78;;;8860:19;8892:6;8882:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8860:39;;8910:154;8926:1;8917:5;:10;8910:154;;8954:1;8944:11;;;;;:::i;:::-;;;9021:2;9013:5;:10;;;;:::i;:::-;9000:2;:24;;;;:::i;:::-;8987:39;;8970:6;8977;8970:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9050:2;9041:11;;;;;:::i;:::-;;;8910:154;;;9088:6;9074:21;;;;;8380:723;;;;:::o;5085:190::-;5210:4;5263;5234:25;5247:5;5254:4;5234:12;:25::i;:::-;:33;5227:40;;5085:190;;;;;:::o;33392:305::-;33494:4;33546:25;33531:40;;;:11;:40;;;;:105;;;;33603:33;33588:48;;;:11;:48;;;;33531:105;:158;;;;33653:36;33677:11;33653:23;:36::i;:::-;33531:158;33511:178;;33392:305;;;:::o;41633:321::-;41763:18;41769:2;41773:7;41763:5;:18::i;:::-;41814:54;41845:1;41849:2;41853:7;41862:5;41814:22;:54::i;:::-;41792:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41633:321;;;:::o;62553:204::-;62704:45;62731:4;62737:2;62741:7;62704:26;:45::i;:::-;62553:204;;;:::o;47536:125::-;;;;:::o;45654:799::-;45809:4;45830:15;:2;:13;;;:15::i;:::-;45826:620;;;45882:2;45866:36;;;45903:12;:10;:12::i;:::-;45917:4;45923:7;45932:5;45866:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45862:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46125:1;46108:6;:13;:18;46104:272;;;46151:60;;;;;;;;;;:::i;:::-;;;;;;;;46104:272;46326:6;46320:13;46311:6;46307:2;46303:15;46296:38;45862:529;45999:41;;;45989:51;;;:6;:51;;;;45982:58;;;;;45826:620;46430:4;46423:11;;45654:799;;;;;;;:::o;5636:675::-;5719:7;5739:20;5762:4;5739:27;;5782:9;5777:497;5801:5;:12;5797:1;:16;5777:497;;;5835:20;5858:5;5864:1;5858:8;;;;;;;;:::i;:::-;;;;;;;;5835:31;;5901:12;5885;:28;5881:382;;6028:42;6043:12;6057;6028:14;:42::i;:::-;6013:57;;5881:382;;;6205:42;6220:12;6234;6205:14;:42::i;:::-;6190:57;;5881:382;5820:454;5815:3;;;;;:::i;:::-;;;;5777:497;;;;6291:12;6284:19;;;5636:675;;;;:::o;24901:157::-;24986:4;25025:25;25010:40;;;:11;:40;;;;25003:47;;24901:157;;;:::o;42290:439::-;42384:1;42370:16;;:2;:16;;;;42362:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42443:16;42451:7;42443;:16::i;:::-;42442:17;42434:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42505:45;42534:1;42538:2;42542:7;42505:20;:45::i;:::-;42580:1;42563:9;:13;42573:2;42563:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42611:2;42592:7;:16;42600:7;42592:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42656:7;42652:2;42631:33;;42648:1;42631:33;;;;;;;;;;;;42677:44;42705:1;42709:2;42713:7;42677:19;:44::i;:::-;42290:439;;:::o;50355:589::-;50499:45;50526:4;50532:2;50536:7;50499:26;:45::i;:::-;50577:1;50561:18;;:4;:18;;;50557:187;;;50596:40;50628:7;50596:31;:40::i;:::-;50557:187;;;50666:2;50658:10;;:4;:10;;;50654:90;;50685:47;50718:4;50724:7;50685:32;:47::i;:::-;50654:90;50557:187;50772:1;50758:16;;:2;:16;;;50754:183;;;50791:45;50828:7;50791:36;:45::i;:::-;50754:183;;;50864:4;50858:10;;:2;:10;;;50854:83;;50885:40;50913:2;50917:7;50885:27;:40::i;:::-;50854:83;50754:183;50355:589;;;:::o;14795:326::-;14855:4;15112:1;15090:7;:19;;;:23;15083:30;;14795:326;;;:::o;6319:224::-;6387:13;6450:1;6444:4;6437:15;6479:1;6473:4;6466:15;6520:4;6514;6504:21;6495:30;;6319:224;;;;:::o;47025:126::-;;;;:::o;51667:164::-;51771:10;:17;;;;51744:15;:24;51760:7;51744:24;;;;;;;;;;;:44;;;;51799:10;51815:7;51799:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51667:164;:::o;52458:988::-;52724:22;52774:1;52749:22;52766:4;52749:16;:22::i;:::-;:26;;;;:::i;:::-;52724:51;;52786:18;52807:17;:26;52825:7;52807:26;;;;;;;;;;;;52786:47;;52954:14;52940:10;:28;52936:328;;52985:19;53007:12;:18;53020:4;53007:18;;;;;;;;;;;;;;;:34;53026:14;53007:34;;;;;;;;;;;;52985:56;;53091:11;53058:12;:18;53071:4;53058:18;;;;;;;;;;;;;;;:30;53077:10;53058:30;;;;;;;;;;;:44;;;;53208:10;53175:17;:30;53193:11;53175:30;;;;;;;;;;;:43;;;;52970:294;52936:328;53360:17;:26;53378:7;53360:26;;;;;;;;;;;53353:33;;;53404:12;:18;53417:4;53404:18;;;;;;;;;;;;;;;:34;53423:14;53404:34;;;;;;;;;;;53397:41;;;52539:907;;52458:988;;:::o;53741:1079::-;53994:22;54039:1;54019:10;:17;;;;:21;;;;:::i;:::-;53994:46;;54051:18;54072:15;:24;54088:7;54072:24;;;;;;;;;;;;54051:45;;54423:19;54445:10;54456:14;54445:26;;;;;;;;:::i;:::-;;;;;;;;;;54423:48;;54509:11;54484:10;54495;54484:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;54620:10;54589:15;:28;54605:11;54589:28;;;;;;;;;;;:41;;;;54761:15;:24;54777:7;54761:24;;;;;;;;;;;54754:31;;;54796:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53812:1008;;;53741:1079;:::o;51245:221::-;51330:14;51347:20;51364:2;51347:16;:20::i;:::-;51330:37;;51405:7;51378:12;:16;51391:2;51378:16;;;;;;;;;;;;;;;:24;51395:6;51378:24;;;;;;;;;;;:34;;;;51452:6;51423:17;:26;51441:7;51423:26;;;;;;;;;;;:35;;;;51319:147;51245:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:122::-;6423:24;6441:5;6423:24;:::i;:::-;6416:5;6413:35;6403:63;;6462:1;6459;6452:12;6403:63;6350:122;:::o;6478:139::-;6524:5;6562:6;6549:20;6540:29;;6578:33;6605:5;6578:33;:::i;:::-;6478:139;;;;:::o;6623:329::-;6682:6;6731:2;6719:9;6710:7;6706:23;6702:32;6699:119;;;6737:79;;:::i;:::-;6699:119;6857:1;6882:53;6927:7;6918:6;6907:9;6903:22;6882:53;:::i;:::-;6872:63;;6828:117;6623:329;;;;:::o;6958:117::-;7067:1;7064;7057:12;7081:117;7190:1;7187;7180:12;7204:180;7252:77;7249:1;7242:88;7349:4;7346:1;7339:15;7373:4;7370:1;7363:15;7390:281;7473:27;7495:4;7473:27;:::i;:::-;7465:6;7461:40;7603:6;7591:10;7588:22;7567:18;7555:10;7552:34;7549:62;7546:88;;;7614:18;;:::i;:::-;7546:88;7654:10;7650:2;7643:22;7433:238;7390:281;;:::o;7677:129::-;7711:6;7738:20;;:::i;:::-;7728:30;;7767:33;7795:4;7787:6;7767:33;:::i;:::-;7677:129;;;:::o;7812:308::-;7874:4;7964:18;7956:6;7953:30;7950:56;;;7986:18;;:::i;:::-;7950:56;8024:29;8046:6;8024:29;:::i;:::-;8016:37;;8108:4;8102;8098:15;8090:23;;7812:308;;;:::o;8126:154::-;8210:6;8205:3;8200;8187:30;8272:1;8263:6;8258:3;8254:16;8247:27;8126:154;;;:::o;8286:412::-;8364:5;8389:66;8405:49;8447:6;8405:49;:::i;:::-;8389:66;:::i;:::-;8380:75;;8478:6;8471:5;8464:21;8516:4;8509:5;8505:16;8554:3;8545:6;8540:3;8536:16;8533:25;8530:112;;;8561:79;;:::i;:::-;8530:112;8651:41;8685:6;8680:3;8675;8651:41;:::i;:::-;8370:328;8286:412;;;;;:::o;8718:340::-;8774:5;8823:3;8816:4;8808:6;8804:17;8800:27;8790:122;;8831:79;;:::i;:::-;8790:122;8948:6;8935:20;8973:79;9048:3;9040:6;9033:4;9025:6;9021:17;8973:79;:::i;:::-;8964:88;;8780:278;8718:340;;;;:::o;9064:509::-;9133:6;9182:2;9170:9;9161:7;9157:23;9153:32;9150:119;;;9188:79;;:::i;:::-;9150:119;9336:1;9325:9;9321:17;9308:31;9366:18;9358:6;9355:30;9352:117;;;9388:79;;:::i;:::-;9352:117;9493:63;9548:7;9539:6;9528:9;9524:22;9493:63;:::i;:::-;9483:73;;9279:287;9064:509;;;;:::o;9579:311::-;9656:4;9746:18;9738:6;9735:30;9732:56;;;9768:18;;:::i;:::-;9732:56;9818:4;9810:6;9806:17;9798:25;;9878:4;9872;9868:15;9860:23;;9579:311;;;:::o;9896:117::-;10005:1;10002;9995:12;10036:710;10132:5;10157:81;10173:64;10230:6;10173:64;:::i;:::-;10157:81;:::i;:::-;10148:90;;10258:5;10287:6;10280:5;10273:21;10321:4;10314:5;10310:16;10303:23;;10374:4;10366:6;10362:17;10354:6;10350:30;10403:3;10395:6;10392:15;10389:122;;;10422:79;;:::i;:::-;10389:122;10537:6;10520:220;10554:6;10549:3;10546:15;10520:220;;;10629:3;10658:37;10691:3;10679:10;10658:37;:::i;:::-;10653:3;10646:50;10725:4;10720:3;10716:14;10709:21;;10596:144;10580:4;10575:3;10571:14;10564:21;;10520:220;;;10524:21;10138:608;;10036:710;;;;;:::o;10769:370::-;10840:5;10889:3;10882:4;10874:6;10870:17;10866:27;10856:122;;10897:79;;:::i;:::-;10856:122;11014:6;11001:20;11039:94;11129:3;11121:6;11114:4;11106:6;11102:17;11039:94;:::i;:::-;11030:103;;10846:293;10769:370;;;;:::o;11145:311::-;11222:4;11312:18;11304:6;11301:30;11298:56;;;11334:18;;:::i;:::-;11298:56;11384:4;11376:6;11372:17;11364:25;;11444:4;11438;11434:15;11426:23;;11145:311;;;:::o;11479:710::-;11575:5;11600:81;11616:64;11673:6;11616:64;:::i;:::-;11600:81;:::i;:::-;11591:90;;11701:5;11730:6;11723:5;11716:21;11764:4;11757:5;11753:16;11746:23;;11817:4;11809:6;11805:17;11797:6;11793:30;11846:3;11838:6;11835:15;11832:122;;;11865:79;;:::i;:::-;11832:122;11980:6;11963:220;11997:6;11992:3;11989:15;11963:220;;;12072:3;12101:37;12134:3;12122:10;12101:37;:::i;:::-;12096:3;12089:50;12168:4;12163:3;12159:14;12152:21;;12039:144;12023:4;12018:3;12014:14;12007:21;;11963:220;;;11967:21;11581:608;;11479:710;;;;;:::o;12212:370::-;12283:5;12332:3;12325:4;12317:6;12313:17;12309:27;12299:122;;12340:79;;:::i;:::-;12299:122;12457:6;12444:20;12482:94;12572:3;12564:6;12557:4;12549:6;12545:17;12482:94;:::i;:::-;12473:103;;12289:293;12212:370;;;;:::o;12588:894::-;12706:6;12714;12763:2;12751:9;12742:7;12738:23;12734:32;12731:119;;;12769:79;;:::i;:::-;12731:119;12917:1;12906:9;12902:17;12889:31;12947:18;12939:6;12936:30;12933:117;;;12969:79;;:::i;:::-;12933:117;13074:78;13144:7;13135:6;13124:9;13120:22;13074:78;:::i;:::-;13064:88;;12860:302;13229:2;13218:9;13214:18;13201:32;13260:18;13252:6;13249:30;13246:117;;;13282:79;;:::i;:::-;13246:117;13387:78;13457:7;13448:6;13437:9;13433:22;13387:78;:::i;:::-;13377:88;;13172:303;12588:894;;;;;:::o;13488:329::-;13547:6;13596:2;13584:9;13575:7;13571:23;13567:32;13564:119;;;13602:79;;:::i;:::-;13564:119;13722:1;13747:53;13792:7;13783:6;13772:9;13768:22;13747:53;:::i;:::-;13737:63;;13693:117;13488:329;;;;:::o;13823:116::-;13893:21;13908:5;13893:21;:::i;:::-;13886:5;13883:32;13873:60;;13929:1;13926;13919:12;13873:60;13823:116;:::o;13945:133::-;13988:5;14026:6;14013:20;14004:29;;14042:30;14066:5;14042:30;:::i;:::-;13945:133;;;;:::o;14084:468::-;14149:6;14157;14206:2;14194:9;14185:7;14181:23;14177:32;14174:119;;;14212:79;;:::i;:::-;14174:119;14332:1;14357:53;14402:7;14393:6;14382:9;14378:22;14357:53;:::i;:::-;14347:63;;14303:117;14459:2;14485:50;14527:7;14518:6;14507:9;14503:22;14485:50;:::i;:::-;14475:60;;14430:115;14084:468;;;;;:::o;14558:307::-;14619:4;14709:18;14701:6;14698:30;14695:56;;;14731:18;;:::i;:::-;14695:56;14769:29;14791:6;14769:29;:::i;:::-;14761:37;;14853:4;14847;14843:15;14835:23;;14558:307;;;:::o;14871:410::-;14948:5;14973:65;14989:48;15030:6;14989:48;:::i;:::-;14973:65;:::i;:::-;14964:74;;15061:6;15054:5;15047:21;15099:4;15092:5;15088:16;15137:3;15128:6;15123:3;15119:16;15116:25;15113:112;;;15144:79;;:::i;:::-;15113:112;15234:41;15268:6;15263:3;15258;15234:41;:::i;:::-;14954:327;14871:410;;;;;:::o;15300:338::-;15355:5;15404:3;15397:4;15389:6;15385:17;15381:27;15371:122;;15412:79;;:::i;:::-;15371:122;15529:6;15516:20;15554:78;15628:3;15620:6;15613:4;15605:6;15601:17;15554:78;:::i;:::-;15545:87;;15361:277;15300:338;;;;:::o;15644:943::-;15739:6;15747;15755;15763;15812:3;15800:9;15791:7;15787:23;15783:33;15780:120;;;15819:79;;:::i;:::-;15780:120;15939:1;15964:53;16009:7;16000:6;15989:9;15985:22;15964:53;:::i;:::-;15954:63;;15910:117;16066:2;16092:53;16137:7;16128:6;16117:9;16113:22;16092:53;:::i;:::-;16082:63;;16037:118;16194:2;16220:53;16265:7;16256:6;16245:9;16241:22;16220:53;:::i;:::-;16210:63;;16165:118;16350:2;16339:9;16335:18;16322:32;16381:18;16373:6;16370:30;16367:117;;;16403:79;;:::i;:::-;16367:117;16508:62;16562:7;16553:6;16542:9;16538:22;16508:62;:::i;:::-;16498:72;;16293:287;15644:943;;;;;;;:::o;16593:311::-;16670:4;16760:18;16752:6;16749:30;16746:56;;;16782:18;;:::i;:::-;16746:56;16832:4;16824:6;16820:17;16812:25;;16892:4;16886;16882:15;16874:23;;16593:311;;;:::o;16927:710::-;17023:5;17048:81;17064:64;17121:6;17064:64;:::i;:::-;17048:81;:::i;:::-;17039:90;;17149:5;17178:6;17171:5;17164:21;17212:4;17205:5;17201:16;17194:23;;17265:4;17257:6;17253:17;17245:6;17241:30;17294:3;17286:6;17283:15;17280:122;;;17313:79;;:::i;:::-;17280:122;17428:6;17411:220;17445:6;17440:3;17437:15;17411:220;;;17520:3;17549:37;17582:3;17570:10;17549:37;:::i;:::-;17544:3;17537:50;17616:4;17611:3;17607:14;17600:21;;17487:144;17471:4;17466:3;17462:14;17455:21;;17411:220;;;17415:21;17029:608;;16927:710;;;;;:::o;17660:370::-;17731:5;17780:3;17773:4;17765:6;17761:17;17757:27;17747:122;;17788:79;;:::i;:::-;17747:122;17905:6;17892:20;17930:94;18020:3;18012:6;18005:4;17997:6;17993:17;17930:94;:::i;:::-;17921:103;;17737:293;17660:370;;;;:::o;18036:684::-;18129:6;18137;18186:2;18174:9;18165:7;18161:23;18157:32;18154:119;;;18192:79;;:::i;:::-;18154:119;18312:1;18337:53;18382:7;18373:6;18362:9;18358:22;18337:53;:::i;:::-;18327:63;;18283:117;18467:2;18456:9;18452:18;18439:32;18498:18;18490:6;18487:30;18484:117;;;18520:79;;:::i;:::-;18484:117;18625:78;18695:7;18686:6;18675:9;18671:22;18625:78;:::i;:::-;18615:88;;18410:303;18036:684;;;;;:::o;18726:539::-;18810:6;18859:2;18847:9;18838:7;18834:23;18830:32;18827:119;;;18865:79;;:::i;:::-;18827:119;19013:1;19002:9;18998:17;18985:31;19043:18;19035:6;19032:30;19029:117;;;19065:79;;:::i;:::-;19029:117;19170:78;19240:7;19231:6;19220:9;19216:22;19170:78;:::i;:::-;19160:88;;18956:302;18726:539;;;;:::o;19271:474::-;19339:6;19347;19396:2;19384:9;19375:7;19371:23;19367:32;19364:119;;;19402:79;;:::i;:::-;19364:119;19522:1;19547:53;19592:7;19583:6;19572:9;19568:22;19547:53;:::i;:::-;19537:63;;19493:117;19649:2;19675:53;19720:7;19711:6;19700:9;19696:22;19675:53;:::i;:::-;19665:63;;19620:118;19271:474;;;;;:::o;19751:182::-;19891:34;19887:1;19879:6;19875:14;19868:58;19751:182;:::o;19939:366::-;20081:3;20102:67;20166:2;20161:3;20102:67;:::i;:::-;20095:74;;20178:93;20267:3;20178:93;:::i;:::-;20296:2;20291:3;20287:12;20280:19;;19939:366;;;:::o;20311:419::-;20477:4;20515:2;20504:9;20500:18;20492:26;;20564:9;20558:4;20554:20;20550:1;20539:9;20535:17;20528:47;20592:131;20718:4;20592:131;:::i;:::-;20584:139;;20311:419;;;:::o;20736:180::-;20784:77;20781:1;20774:88;20881:4;20878:1;20871:15;20905:4;20902:1;20895:15;20922:305;20962:3;20981:20;20999:1;20981:20;:::i;:::-;20976:25;;21015:20;21033:1;21015:20;:::i;:::-;21010:25;;21169:1;21101:66;21097:74;21094:1;21091:81;21088:107;;;21175:18;;:::i;:::-;21088:107;21219:1;21216;21212:9;21205:16;;20922:305;;;;:::o;21233:180::-;21281:77;21278:1;21271:88;21378:4;21375:1;21368:15;21402:4;21399:1;21392:15;21419:320;21463:6;21500:1;21494:4;21490:12;21480:22;;21547:1;21541:4;21537:12;21568:18;21558:81;;21624:4;21616:6;21612:17;21602:27;;21558:81;21686:2;21678:6;21675:14;21655:18;21652:38;21649:84;;;21705:18;;:::i;:::-;21649:84;21470:269;21419:320;;;:::o;21745:231::-;21885:34;21881:1;21873:6;21869:14;21862:58;21954:14;21949:2;21941:6;21937:15;21930:39;21745:231;:::o;21982:366::-;22124:3;22145:67;22209:2;22204:3;22145:67;:::i;:::-;22138:74;;22221:93;22310:3;22221:93;:::i;:::-;22339:2;22334:3;22330:12;22323:19;;21982:366;;;:::o;22354:419::-;22520:4;22558:2;22547:9;22543:18;22535:26;;22607:9;22601:4;22597:20;22593:1;22582:9;22578:17;22571:47;22635:131;22761:4;22635:131;:::i;:::-;22627:139;;22354:419;;;:::o;22779:220::-;22919:34;22915:1;22907:6;22903:14;22896:58;22988:3;22983:2;22975:6;22971:15;22964:28;22779:220;:::o;23005:366::-;23147:3;23168:67;23232:2;23227:3;23168:67;:::i;:::-;23161:74;;23244:93;23333:3;23244:93;:::i;:::-;23362:2;23357:3;23353:12;23346:19;;23005:366;;;:::o;23377:419::-;23543:4;23581:2;23570:9;23566:18;23558:26;;23630:9;23624:4;23620:20;23616:1;23605:9;23601:17;23594:47;23658:131;23784:4;23658:131;:::i;:::-;23650:139;;23377:419;;;:::o;23802:243::-;23942:34;23938:1;23930:6;23926:14;23919:58;24011:26;24006:2;23998:6;23994:15;23987:51;23802:243;:::o;24051:366::-;24193:3;24214:67;24278:2;24273:3;24214:67;:::i;:::-;24207:74;;24290:93;24379:3;24290:93;:::i;:::-;24408:2;24403:3;24399:12;24392:19;;24051:366;;;:::o;24423:419::-;24589:4;24627:2;24616:9;24612:18;24604:26;;24676:9;24670:4;24666:20;24662:1;24651:9;24647:17;24640:47;24704:131;24830:4;24704:131;:::i;:::-;24696:139;;24423:419;;;:::o;24848:173::-;24988:25;24984:1;24976:6;24972:14;24965:49;24848:173;:::o;25027:366::-;25169:3;25190:67;25254:2;25249:3;25190:67;:::i;:::-;25183:74;;25266:93;25355:3;25266:93;:::i;:::-;25384:2;25379:3;25375:12;25368:19;;25027:366;;;:::o;25399:419::-;25565:4;25603:2;25592:9;25588:18;25580:26;;25652:9;25646:4;25642:20;25638:1;25627:9;25623:17;25616:47;25680:131;25806:4;25680:131;:::i;:::-;25672:139;;25399:419;;;:::o;25824:179::-;25964:31;25960:1;25952:6;25948:14;25941:55;25824:179;:::o;26009:366::-;26151:3;26172:67;26236:2;26231:3;26172:67;:::i;:::-;26165:74;;26248:93;26337:3;26248:93;:::i;:::-;26366:2;26361:3;26357:12;26350:19;;26009:366;;;:::o;26381:419::-;26547:4;26585:2;26574:9;26570:18;26562:26;;26634:9;26628:4;26624:20;26620:1;26609:9;26605:17;26598:47;26662:131;26788:4;26662:131;:::i;:::-;26654:139;;26381:419;;;:::o;26806:227::-;26946:34;26942:1;26934:6;26930:14;26923:58;27015:10;27010:2;27002:6;26998:15;26991:35;26806:227;:::o;27039:366::-;27181:3;27202:67;27266:2;27261:3;27202:67;:::i;:::-;27195:74;;27278:93;27367:3;27278:93;:::i;:::-;27396:2;27391:3;27387:12;27380:19;;27039:366;;;:::o;27411:419::-;27577:4;27615:2;27604:9;27600:18;27592:26;;27664:9;27658:4;27654:20;27650:1;27639:9;27635:17;27628:47;27692:131;27818:4;27692:131;:::i;:::-;27684:139;;27411:419;;;:::o;27836:171::-;27976:23;27972:1;27964:6;27960:14;27953:47;27836:171;:::o;28013:366::-;28155:3;28176:67;28240:2;28235:3;28176:67;:::i;:::-;28169:74;;28252:93;28341:3;28252:93;:::i;:::-;28370:2;28365:3;28361:12;28354:19;;28013:366;;;:::o;28385:419::-;28551:4;28589:2;28578:9;28574:18;28566:26;;28638:9;28632:4;28628:20;28624:1;28613:9;28609:17;28602:47;28666:131;28792:4;28666:131;:::i;:::-;28658:139;;28385:419;;;:::o;28810:348::-;28850:7;28873:20;28891:1;28873:20;:::i;:::-;28868:25;;28907:20;28925:1;28907:20;:::i;:::-;28902:25;;29095:1;29027:66;29023:74;29020:1;29017:81;29012:1;29005:9;28998:17;28994:105;28991:131;;;29102:18;;:::i;:::-;28991:131;29150:1;29147;29143:9;29132:20;;28810:348;;;;:::o;29164:233::-;29203:3;29226:24;29244:5;29226:24;:::i;:::-;29217:33;;29272:66;29265:5;29262:77;29259:103;;;29342:18;;:::i;:::-;29259:103;29389:1;29382:5;29378:13;29371:20;;29164:233;;;:::o;29403:236::-;29543:34;29539:1;29531:6;29527:14;29520:58;29612:19;29607:2;29599:6;29595:15;29588:44;29403:236;:::o;29645:366::-;29787:3;29808:67;29872:2;29867:3;29808:67;:::i;:::-;29801:74;;29884:93;29973:3;29884:93;:::i;:::-;30002:2;29997:3;29993:12;29986:19;;29645:366;;;:::o;30017:419::-;30183:4;30221:2;30210:9;30206:18;30198:26;;30270:9;30264:4;30260:20;30256:1;30245:9;30241:17;30234:47;30298:131;30424:4;30298:131;:::i;:::-;30290:139;;30017:419;;;:::o;30442:230::-;30582:34;30578:1;30570:6;30566:14;30559:58;30651:13;30646:2;30638:6;30634:15;30627:38;30442:230;:::o;30678:366::-;30820:3;30841:67;30905:2;30900:3;30841:67;:::i;:::-;30834:74;;30917:93;31006:3;30917:93;:::i;:::-;31035:2;31030:3;31026:12;31019:19;;30678:366;;;:::o;31050:419::-;31216:4;31254:2;31243:9;31239:18;31231:26;;31303:9;31297:4;31293:20;31289:1;31278:9;31274:17;31267:47;31331:131;31457:4;31331:131;:::i;:::-;31323:139;;31050:419;;;:::o;31475:180::-;31523:77;31520:1;31513:88;31620:4;31617:1;31610:15;31644:4;31641:1;31634:15;31661:185;31701:1;31718:20;31736:1;31718:20;:::i;:::-;31713:25;;31752:20;31770:1;31752:20;:::i;:::-;31747:25;;31791:1;31781:35;;31796:18;;:::i;:::-;31781:35;31838:1;31835;31831:9;31826:14;;31661:185;;;;:::o;31852:180::-;31900:77;31897:1;31890:88;31997:4;31994:1;31987:15;32021:4;32018:1;32011:15;32038:231;32178:34;32174:1;32166:6;32162:14;32155:58;32247:14;32242:2;32234:6;32230:15;32223:39;32038:231;:::o;32275:366::-;32417:3;32438:67;32502:2;32497:3;32438:67;:::i;:::-;32431:74;;32514:93;32603:3;32514:93;:::i;:::-;32632:2;32627:3;32623:12;32616:19;;32275:366;;;:::o;32647:419::-;32813:4;32851:2;32840:9;32836:18;32828:26;;32900:9;32894:4;32890:20;32886:1;32875:9;32871:17;32864:47;32928:131;33054:4;32928:131;:::i;:::-;32920:139;;32647:419;;;:::o;33072:180::-;33120:77;33117:1;33110:88;33217:4;33214:1;33207:15;33241:4;33238:1;33231:15;33258:228;33398:34;33394:1;33386:6;33382:14;33375:58;33467:11;33462:2;33454:6;33450:15;33443:36;33258:228;:::o;33492:366::-;33634:3;33655:67;33719:2;33714:3;33655:67;:::i;:::-;33648:74;;33731:93;33820:3;33731:93;:::i;:::-;33849:2;33844:3;33840:12;33833:19;;33492:366;;;:::o;33864:419::-;34030:4;34068:2;34057:9;34053:18;34045:26;;34117:9;34111:4;34107:20;34103:1;34092:9;34088:17;34081:47;34145:131;34271:4;34145:131;:::i;:::-;34137:139;;33864:419;;;:::o;34289:229::-;34429:34;34425:1;34417:6;34413:14;34406:58;34498:12;34493:2;34485:6;34481:15;34474:37;34289:229;:::o;34524:366::-;34666:3;34687:67;34751:2;34746:3;34687:67;:::i;:::-;34680:74;;34763:93;34852:3;34763:93;:::i;:::-;34881:2;34876:3;34872:12;34865:19;;34524:366;;;:::o;34896:419::-;35062:4;35100:2;35089:9;35085:18;35077:26;;35149:9;35143:4;35139:20;35135:1;35124:9;35120:17;35113:47;35177:131;35303:4;35177:131;:::i;:::-;35169:139;;34896:419;;;:::o;35321:222::-;35461:34;35457:1;35449:6;35445:14;35438:58;35530:5;35525:2;35517:6;35513:15;35506:30;35321:222;:::o;35549:366::-;35691:3;35712:67;35776:2;35771:3;35712:67;:::i;:::-;35705:74;;35788:93;35877:3;35788:93;:::i;:::-;35906:2;35901:3;35897:12;35890:19;;35549:366;;;:::o;35921:419::-;36087:4;36125:2;36114:9;36110:18;36102:26;;36174:9;36168:4;36164:20;36160:1;36149:9;36145:17;36138:47;36202:131;36328:4;36202:131;:::i;:::-;36194:139;;35921:419;;;:::o;36346:234::-;36486:34;36482:1;36474:6;36470:14;36463:58;36555:17;36550:2;36542:6;36538:15;36531:42;36346:234;:::o;36586:366::-;36728:3;36749:67;36813:2;36808:3;36749:67;:::i;:::-;36742:74;;36825:93;36914:3;36825:93;:::i;:::-;36943:2;36938:3;36934:12;36927:19;;36586:366;;;:::o;36958:419::-;37124:4;37162:2;37151:9;37147:18;37139:26;;37211:9;37205:4;37201:20;37197:1;37186:9;37182:17;37175:47;37239:131;37365:4;37239:131;:::i;:::-;37231:139;;36958:419;;;:::o;37383:148::-;37485:11;37522:3;37507:18;;37383:148;;;;:::o;37537:377::-;37643:3;37671:39;37704:5;37671:39;:::i;:::-;37726:89;37808:6;37803:3;37726:89;:::i;:::-;37719:96;;37824:52;37869:6;37864:3;37857:4;37850:5;37846:16;37824:52;:::i;:::-;37901:6;37896:3;37892:16;37885:23;;37647:267;37537:377;;;;:::o;37920:435::-;38100:3;38122:95;38213:3;38204:6;38122:95;:::i;:::-;38115:102;;38234:95;38325:3;38316:6;38234:95;:::i;:::-;38227:102;;38346:3;38339:10;;37920:435;;;;;:::o;38361:220::-;38501:34;38497:1;38489:6;38485:14;38478:58;38570:3;38565:2;38557:6;38553:15;38546:28;38361:220;:::o;38587:366::-;38729:3;38750:67;38814:2;38809:3;38750:67;:::i;:::-;38743:74;;38826:93;38915:3;38826:93;:::i;:::-;38944:2;38939:3;38935:12;38928:19;;38587:366;;;:::o;38959:419::-;39125:4;39163:2;39152:9;39148:18;39140:26;;39212:9;39206:4;39202:20;39198:1;39187:9;39183:17;39176:47;39240:131;39366:4;39240:131;:::i;:::-;39232:139;;38959:419;;;:::o;39384:94::-;39417:8;39465:5;39461:2;39457:14;39436:35;;39384:94;;;:::o;39484:::-;39523:7;39552:20;39566:5;39552:20;:::i;:::-;39541:31;;39484:94;;;:::o;39584:100::-;39623:7;39652:26;39672:5;39652:26;:::i;:::-;39641:37;;39584:100;;;:::o;39690:157::-;39795:45;39815:24;39833:5;39815:24;:::i;:::-;39795:45;:::i;:::-;39790:3;39783:58;39690:157;;:::o;39853:256::-;39965:3;39980:75;40051:3;40042:6;39980:75;:::i;:::-;40080:2;40075:3;40071:12;40064:19;;40100:3;40093:10;;39853:256;;;;:::o;40115:170::-;40255:22;40251:1;40243:6;40239:14;40232:46;40115:170;:::o;40291:366::-;40433:3;40454:67;40518:2;40513:3;40454:67;:::i;:::-;40447:74;;40530:93;40619:3;40530:93;:::i;:::-;40648:2;40643:3;40639:12;40632:19;;40291:366;;;:::o;40663:419::-;40829:4;40867:2;40856:9;40852:18;40844:26;;40916:9;40910:4;40906:20;40902:1;40891:9;40887:17;40880:47;40944:131;41070:4;40944:131;:::i;:::-;40936:139;;40663:419;;;:::o;41088:171::-;41228:23;41224:1;41216:6;41212:14;41205:47;41088:171;:::o;41265:366::-;41407:3;41428:67;41492:2;41487:3;41428:67;:::i;:::-;41421:74;;41504:93;41593:3;41504:93;:::i;:::-;41622:2;41617:3;41613:12;41606:19;;41265:366;;;:::o;41637:419::-;41803:4;41841:2;41830:9;41826:18;41818:26;;41890:9;41884:4;41880:20;41876:1;41865:9;41861:17;41854:47;41918:131;42044:4;41918:131;:::i;:::-;41910:139;;41637:419;;;:::o;42062:172::-;42202:24;42198:1;42190:6;42186:14;42179:48;42062:172;:::o;42240:366::-;42382:3;42403:67;42467:2;42462:3;42403:67;:::i;:::-;42396:74;;42479:93;42568:3;42479:93;:::i;:::-;42597:2;42592:3;42588:12;42581:19;;42240:366;;;:::o;42612:419::-;42778:4;42816:2;42805:9;42801:18;42793:26;;42865:9;42859:4;42855:20;42851:1;42840:9;42836:17;42829:47;42893:131;43019:4;42893:131;:::i;:::-;42885:139;;42612:419;;;:::o;43037:225::-;43177:34;43173:1;43165:6;43161:14;43154:58;43246:8;43241:2;43233:6;43229:15;43222:33;43037:225;:::o;43268:366::-;43410:3;43431:67;43495:2;43490:3;43431:67;:::i;:::-;43424:74;;43507:93;43596:3;43507:93;:::i;:::-;43625:2;43620:3;43616:12;43609:19;;43268:366;;;:::o;43640:419::-;43806:4;43844:2;43833:9;43829:18;43821:26;;43893:9;43887:4;43883:20;43879:1;43868:9;43864:17;43857:47;43921:131;44047:4;43921:131;:::i;:::-;43913:139;;43640:419;;;:::o;44065:231::-;44205:34;44201:1;44193:6;44189:14;44182:58;44274:14;44269:2;44261:6;44257:15;44250:39;44065:231;:::o;44302:366::-;44444:3;44465:67;44529:2;44524:3;44465:67;:::i;:::-;44458:74;;44541:93;44630:3;44541:93;:::i;:::-;44659:2;44654:3;44650:12;44643:19;;44302:366;;;:::o;44674:419::-;44840:4;44878:2;44867:9;44863:18;44855:26;;44927:9;44921:4;44917:20;44913:1;44902:9;44898:17;44891:47;44955:131;45081:4;44955:131;:::i;:::-;44947:139;;44674:419;;;:::o;45099:224::-;45239:34;45235:1;45227:6;45223:14;45216:58;45308:7;45303:2;45295:6;45291:15;45284:32;45099:224;:::o;45329:366::-;45471:3;45492:67;45556:2;45551:3;45492:67;:::i;:::-;45485:74;;45568:93;45657:3;45568:93;:::i;:::-;45686:2;45681:3;45677:12;45670:19;;45329:366;;;:::o;45701:419::-;45867:4;45905:2;45894:9;45890:18;45882:26;;45954:9;45948:4;45944:20;45940:1;45929:9;45925:17;45918:47;45982:131;46108:4;45982:131;:::i;:::-;45974:139;;45701:419;;;:::o;46126:223::-;46266:34;46262:1;46254:6;46250:14;46243:58;46335:6;46330:2;46322:6;46318:15;46311:31;46126:223;:::o;46355:366::-;46497:3;46518:67;46582:2;46577:3;46518:67;:::i;:::-;46511:74;;46594:93;46683:3;46594:93;:::i;:::-;46712:2;46707:3;46703:12;46696:19;;46355:366;;;:::o;46727:419::-;46893:4;46931:2;46920:9;46916:18;46908:26;;46980:9;46974:4;46970:20;46966:1;46955:9;46951:17;46944:47;47008:131;47134:4;47008:131;:::i;:::-;47000:139;;46727:419;;;:::o;47152:191::-;47192:4;47212:20;47230:1;47212:20;:::i;:::-;47207:25;;47246:20;47264:1;47246:20;:::i;:::-;47241:25;;47285:1;47282;47279:8;47276:34;;;47290:18;;:::i;:::-;47276:34;47335:1;47332;47328:9;47320:17;;47152:191;;;;:::o;47349:175::-;47489:27;47485:1;47477:6;47473:14;47466:51;47349:175;:::o;47530:366::-;47672:3;47693:67;47757:2;47752:3;47693:67;:::i;:::-;47686:74;;47769:93;47858:3;47769:93;:::i;:::-;47887:2;47882:3;47878:12;47871:19;;47530:366;;;:::o;47902:419::-;48068:4;48106:2;48095:9;48091:18;48083:26;;48155:9;48149:4;48145:20;48141:1;48130:9;48126:17;48119:47;48183:131;48309:4;48183:131;:::i;:::-;48175:139;;47902:419;;;:::o;48327:237::-;48467:34;48463:1;48455:6;48451:14;48444:58;48536:20;48531:2;48523:6;48519:15;48512:45;48327:237;:::o;48570:366::-;48712:3;48733:67;48797:2;48792:3;48733:67;:::i;:::-;48726:74;;48809:93;48898:3;48809:93;:::i;:::-;48927:2;48922:3;48918:12;48911:19;;48570:366;;;:::o;48942:419::-;49108:4;49146:2;49135:9;49131:18;49123:26;;49195:9;49189:4;49185:20;49181:1;49170:9;49166:17;49159:47;49223:131;49349:4;49223:131;:::i;:::-;49215:139;;48942:419;;;:::o;49367:176::-;49399:1;49416:20;49434:1;49416:20;:::i;:::-;49411:25;;49450:20;49468:1;49450:20;:::i;:::-;49445:25;;49489:1;49479:35;;49494:18;;:::i;:::-;49479:35;49535:1;49532;49528:9;49523:14;;49367:176;;;;:::o;49549:98::-;49600:6;49634:5;49628:12;49618:22;;49549:98;;;:::o;49653:168::-;49736:11;49770:6;49765:3;49758:19;49810:4;49805:3;49801:14;49786:29;;49653:168;;;;:::o;49827:360::-;49913:3;49941:38;49973:5;49941:38;:::i;:::-;49995:70;50058:6;50053:3;49995:70;:::i;:::-;49988:77;;50074:52;50119:6;50114:3;50107:4;50100:5;50096:16;50074:52;:::i;:::-;50151:29;50173:6;50151:29;:::i;:::-;50146:3;50142:39;50135:46;;49917:270;49827:360;;;;:::o;50193:640::-;50388:4;50426:3;50415:9;50411:19;50403:27;;50440:71;50508:1;50497:9;50493:17;50484:6;50440:71;:::i;:::-;50521:72;50589:2;50578:9;50574:18;50565:6;50521:72;:::i;:::-;50603;50671:2;50660:9;50656:18;50647:6;50603:72;:::i;:::-;50722:9;50716:4;50712:20;50707:2;50696:9;50692:18;50685:48;50750:76;50821:4;50812:6;50750:76;:::i;:::-;50742:84;;50193:640;;;;;;;:::o;50839:141::-;50895:5;50926:6;50920:13;50911:22;;50942:32;50968:5;50942:32;:::i;:::-;50839:141;;;;:::o;50986:349::-;51055:6;51104:2;51092:9;51083:7;51079:23;51075:32;51072:119;;;51110:79;;:::i;:::-;51072:119;51230:1;51255:63;51310:7;51301:6;51290:9;51286:22;51255:63;:::i;:::-;51245:73;;51201:127;50986:349;;;;:::o;51341:182::-;51481:34;51477:1;51469:6;51465:14;51458:58;51341:182;:::o;51529:366::-;51671:3;51692:67;51756:2;51751:3;51692:67;:::i;:::-;51685:74;;51768:93;51857:3;51768:93;:::i;:::-;51886:2;51881:3;51877:12;51870:19;;51529:366;;;:::o;51901:419::-;52067:4;52105:2;52094:9;52090:18;52082:26;;52154:9;52148:4;52144:20;52140:1;52129:9;52125:17;52118:47;52182:131;52308:4;52182:131;:::i;:::-;52174:139;;51901:419;;;:::o;52326:178::-;52466:30;52462:1;52454:6;52450:14;52443:54;52326:178;:::o;52510:366::-;52652:3;52673:67;52737:2;52732:3;52673:67;:::i;:::-;52666:74;;52749:93;52838:3;52749:93;:::i;:::-;52867:2;52862:3;52858:12;52851:19;;52510:366;;;:::o;52882:419::-;53048:4;53086:2;53075:9;53071:18;53063:26;;53135:9;53129:4;53125:20;53121:1;53110:9;53106:17;53099:47;53163:131;53289:4;53163:131;:::i;:::-;53155:139;;52882:419;;;:::o;53307:180::-;53355:77;53352:1;53345:88;53452:4;53449:1;53442:15;53476:4;53473:1;53466:15

Swarm Source

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