ETH Price: $2,524.79 (+3.42%)
Gas: 0.89 Gwei

Killer Squad (KST)
 

Overview

TokenID

21

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-13
*/

// SPDX-License-Identifier: MIT

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/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/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/token/ERC721/IERC721.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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() {
        _setOwner(_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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/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 tokenId);

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

// File: @openzeppelin/contracts/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/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/Address.sol

pragma solidity ^0.8.0;

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

// File: @openzeppelin/contracts/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/IERC721Receiver.sol

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/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;

    // 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 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 baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @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
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _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 ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, 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);
    }

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

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

    /**
     * @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 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(to).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 {}
}

// File: @openzeppelin/contracts/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();
    }
}

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] = _released[account] + payment;
        _totalReleased = _totalReleased + payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

pragma solidity ^0.8.0;

contract KST is ERC721Enumerable, Ownable, PaymentSplitter {
    using SafeMath for uint256;
    using Strings for uint256;

    string public KST_PROVENANCE  = '';
    string public LICENSE_TEXT     = '';
    uint256 public MAX_SUPPLY      = 7777;
    uint256 public RESERVED_SUPPLY = 200;

    bool public paused             = true;
    uint public price              = 0.05 ether;

    uint public presale_mint_max   = 20;
    uint public presale_start      = 1635526800; //29 Oct, 17:00 GMT
    uint public presale_supply     = 1500;
    uint public presale_wallet_max = 7777;

    uint public sale_mint_max      = 20;
    uint public sale_start         = 1635613200; //30 Oct, 17:00 GMT
    uint public sale_wallet_max    = 7777;

    string private _baseTokenURI = 'https://mint.killersquad.co/api/';
    bool private _licenseLocked = false;

    mapping(address => uint) private _presale;

    event LicenseLocked(string _licenseText);

    // Withdrawal addresses
    address t1 = 0xc354Fe8648550bC77f69A76a1FE300E54607deA3;
    address t2 = 0x7ea1f79122d66eB0a8611B3959351630200BdF93; 
    address t3 = 0xEbCEe6204eeEEf21e406C0A75734E70f342914e0;
    address[] addressList = [t1, t2, t3];
    uint256[] shareList   = [34, 33, 33];

    constructor()
    ERC721("Killer Squad", "KST")
    PaymentSplitter(addressList, shareList)  {
      //send reserves
      //gift( RESERVED_SUPPLY, owner() );
    }

    function mint(uint256 quantity) public payable {
        require( !paused, "Sale paused" );
        require( msg.value >= price * quantity, "Ether sent is not correct" );

        //regular sale
        uint256 balance = totalSupply();
        if( block.timestamp >= sale_start ){
            require( quantity           <= sale_mint_max, "Order too big" );
            require( balance + quantity <= MAX_SUPPLY,    "Exceeds supply" );
            require( balanceOf( msg.sender ) + quantity <= sale_wallet_max, "Don't be greedy" );
        }
        //presale
        else if( block.timestamp >= presale_start ){
            require( quantity           <= presale_mint_max, "Order too big" );
            require( balance + quantity <= presale_supply,   "Exceeds supply" );
            // require( _presale[ msg.sender ] == 1,            "Wallet is not whitelisted" );
            require( balanceOf( msg.sender ) + quantity <= presale_wallet_max, "Don't be greedy" );
        }
        else{
            require( false, "Sale has not started yet" );
        }

        for( uint256 i; i < quantity; ++i ){
            _safeMint( msg.sender, balance + i );
        }
    }

    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokenIDs = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokenIDs[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIDs;
    }

    //owner
    function gift(uint256 quantity, address recipient) public onlyOwner {
        uint256 balance = totalSupply();
        require( balance + quantity <= MAX_SUPPLY, "Exceeds supply" );

        for(uint256 i; i < quantity; ++i ){
            _safeMint( recipient, balance + i );
        }
    }

    //owner setters
    function changeLicense(string memory _license) public onlyOwner {
        require(_licenseLocked == false, "License already locked");
        LICENSE_TEXT = _license;
    }

    function flipSaleState() public onlyOwner {
        paused = !paused;
    }

    function lockLicense() public onlyOwner {
        _licenseLocked =  true;
        emit LicenseLocked(LICENSE_TEXT);
    }

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

    function setMaxSupply(uint maxSupply) public onlyOwner {
        require(maxSupply > totalSupply(), "Specified supply is lower than current balance" );
        MAX_SUPPLY = maxSupply;
    }

    // Just in case Eth does some crazy stuff
    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        KST_PROVENANCE = provenanceHash;
    }

    function tokenLicense(uint _id) public view returns(string memory) {
        require(_id < totalSupply(), "Invalid ID");
        return LICENSE_TEXT;
    }

    function addPresaleAddresses( address[] memory wallets ) public onlyOwner {
        for( uint i; i < wallets.length; ++i ){
            _presale[ wallets[i] ] = 1;
        }
    }

    function setPresaleOptions( uint mint_max, uint start, uint wallet_max, uint supply ) public onlyOwner {
        require( supply >= totalSupply(),  "Specified supply is lower than current balance" );
        require( supply <= MAX_SUPPLY,     "Specified supply is greater than max supply" );

        if( presale_mint_max != mint_max )
            presale_mint_max = mint_max;

        if( presale_start != start )
            presale_start = start;

        if( presale_mint_max != wallet_max )
            presale_wallet_max = wallet_max;

        if( presale_supply != supply )
            presale_supply = supply;
    }

    function setSaleOptions(uint mint_max, uint start, uint wallet_max ) public onlyOwner {
        if( sale_mint_max != mint_max )
            sale_mint_max = mint_max;

        if( sale_start != start )
            sale_start = start;

        if( sale_wallet_max != wallet_max )
            sale_wallet_max = wallet_max;
    }

    //internal
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return bytes(_baseTokenURI).length > 0 ? string(abi.encodePacked(_baseTokenURI, tokenId.toString())) : "";
    }
}

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":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"LicenseLocked","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"KST_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addPresaleAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale_mint_max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale_start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale_wallet_max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","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":"sale_mint_max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sale_start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sale_wallet_max","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":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mint_max","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"wallet_max","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setPresaleOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mint_max","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"wallet_max","type":"uint256"}],"name":"setSaleOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","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":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260405180602001604052806000815250601090805190602001906200002b92919062000923565b5060405180602001604052806000815250601190805190602001906200005392919062000923565b50611e6160125560c86013556001601460006101000a81548160ff02191690831515021790555066b1a2bc2ec50000601555601460165563617c28906017556105dc601855611e616019556014601a5563617d7a10601b55611e61601c556040518060400160405280602081526020017f68747470733a2f2f6d696e742e6b696c6c657273717561642e636f2f6170692f815250601d9080519060200190620000fe92919062000923565b506000601e60006101000a81548160ff02191690831515021790555073c354fe8648550bc77f69a76a1fe300e54607dea3602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737ea1f79122d66eb0a8611b3959351630200bdf93602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ebcee6204eeeef21e406c0a75734e70f342914e0602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060600160405280602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250602390600362000330929190620009b4565b506040518060600160405280602260ff168152602001602160ff168152602001602160ff1681525060249060036200036a92919062000a43565b503480156200037857600080fd5b506023805480602002602001604051908101604052809291908181526020018280548015620003fd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311620003b2575b505050505060248054806020026020016040519081016040528092919081815260200182805480156200045057602002820191906000526020600020905b8154815260200190600101908083116200043b575b50505050506040518060400160405280600c81526020017f4b696c6c657220537175616400000000000000000000000000000000000000008152506040518060400160405280600381526020017f4b535400000000000000000000000000000000000000000000000000000000008152508160009080519060200190620004d992919062000923565b508060019080519060200190620004f292919062000923565b50505062000515620005096200061b60201b60201c565b6200062360201b60201c565b80518251146200055c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005539062000bed565b60405180910390fd5b6000825111620005a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200059a9062000c31565b60405180910390fd5b60005b82518110156200061257620005fc838281518110620005ca57620005c962000e03565b5b6020026020010151838381518110620005e857620005e762000e03565b5b6020026020010151620006e960201b60201c565b8080620006099062000d57565b915050620005a6565b50505062000f71565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200075c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007539062000bcb565b60405180910390fd5b60008111620007a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007999062000c53565b60405180910390fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200081e9062000c0f565b60405180910390fd5b600f829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600b54620008de919062000c86565b600b819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200091792919062000b9e565b60405180910390a15050565b828054620009319062000d21565b90600052602060002090601f016020900481019282620009555760008555620009a1565b82601f106200097057805160ff1916838001178555620009a1565b82800160010185558215620009a1579182015b82811115620009a057825182559160200191906001019062000983565b5b509050620009b0919062000a9a565b5090565b82805482825590600052602060002090810192821562000a30579160200282015b8281111562000a2f5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620009d5565b5b50905062000a3f919062000a9a565b5090565b82805482825590600052602060002090810192821562000a87579160200282015b8281111562000a86578251829060ff1690559160200191906001019062000a64565b5b50905062000a96919062000a9a565b5090565b5b8082111562000ab557600081600090555060010162000a9b565b5090565b62000ac48162000ce3565b82525050565b600062000ad9602c8362000c75565b915062000ae68262000e32565b604082019050919050565b600062000b0060328362000c75565b915062000b0d8262000e81565b604082019050919050565b600062000b27602b8362000c75565b915062000b348262000ed0565b604082019050919050565b600062000b4e601a8362000c75565b915062000b5b8262000f1f565b602082019050919050565b600062000b75601d8362000c75565b915062000b828262000f48565b602082019050919050565b62000b988162000d17565b82525050565b600060408201905062000bb5600083018562000ab9565b62000bc4602083018462000b8d565b9392505050565b6000602082019050818103600083015262000be68162000aca565b9050919050565b6000602082019050818103600083015262000c088162000af1565b9050919050565b6000602082019050818103600083015262000c2a8162000b18565b9050919050565b6000602082019050818103600083015262000c4c8162000b3f565b9050919050565b6000602082019050818103600083015262000c6e8162000b66565b9050919050565b600082825260208201905092915050565b600062000c938262000d17565b915062000ca08362000d17565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000cd85762000cd762000da5565b5b828201905092915050565b600062000cf08262000cf7565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000d3a57607f821691505b6020821081141562000d515762000d5062000dd4565b5b50919050565b600062000d648262000d17565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000d9a5762000d9962000da5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b615c6d8062000f816000396000f3fe6080604052600436106103035760003560e01c80636f8b44b011610190578063a22cb465116100dc578063ce7c2ac211610095578063d9b137b21161006f578063d9b137b214610bbc578063e33b7de314610bf9578063e985e9c514610c24578063f2fde38b14610c615761034a565b8063ce7c2ac214610b2b578063d07b63c614610b68578063d3344ed314610b915761034a565b8063a22cb46514610a33578063b09904b514610a5c578063b88d4fde14610a85578063bc7a916314610aae578063bf4702fc14610ad7578063c87b56dd14610aee5761034a565b80638da5cb5b116101495780639852595c116101235780639852595c146109845780639c3e72bd146109c1578063a035b1fe146109ec578063a0712d6814610a175761034a565b80638da5cb5b1461090557806391b7f5ed1461093057806395d89b41146109595761034a565b80636f8b44b0146107f757806370a0823114610820578063715018a61461085d578063833de1d51461087457806383a076be1461089f5780638b83209b146108c85761034a565b8063319a3fbd1161024f57806342842e0e116102085780634f6ccce7116101e25780634f6ccce71461072957806355f804b3146107665780635c975abb1461078f5780636352211e146107ba5761034a565b806342842e0e14610698578063438b6300146106c1578063445a3771146106fe5761034a565b8063319a3fbd146105ac57806331a53e9a146105d757806332cb6b0c1461060257806334918dfd1461062d5780633819fc0f146106445780633a98ef391461066d5761034a565b806319165587116102bc57806324eedd4c1161029657806324eedd4c146104ee5780632a146986146105195780632e5c0fe7146105445780632f745c591461056f5761034a565b806319165587146104715780632035b1391461049a57806323b872dd146104c55761034a565b806301ffc9a71461034f57806306fdde031461038c578063081812fc146103b7578063095ea7b3146103f4578063109695231461041d57806318160ddd146104465761034a565b3661034a577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770610331610c8a565b34604051610340929190614987565b60405180910390a1005b600080fd5b34801561035b57600080fd5b506103766004803603810190610371919061400e565b610c92565b60405161038391906149d2565b60405180910390f35b34801561039857600080fd5b506103a1610d0c565b6040516103ae91906149ed565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d991906140b1565b610d9e565b6040516103eb91906148f7565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613f85565b610e23565b005b34801561042957600080fd5b50610444600480360381019061043f9190614068565b610f3b565b005b34801561045257600080fd5b5061045b610fd1565b6040516104689190614e31565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190613e02565b610fde565b005b3480156104a657600080fd5b506104af611246565b6040516104bc91906149ed565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613e6f565b6112d4565b005b3480156104fa57600080fd5b50610503611334565b6040516105109190614e31565b60405180910390f35b34801561052557600080fd5b5061052e61133a565b60405161053b9190614e31565b60405180910390f35b34801561055057600080fd5b50610559611340565b6040516105669190614e31565b60405180910390f35b34801561057b57600080fd5b5061059660048036038101906105919190613f85565b611346565b6040516105a39190614e31565b60405180910390f35b3480156105b857600080fd5b506105c16113eb565b6040516105ce9190614e31565b60405180910390f35b3480156105e357600080fd5b506105ec6113f1565b6040516105f99190614e31565b60405180910390f35b34801561060e57600080fd5b506106176113f7565b6040516106249190614e31565b60405180910390f35b34801561063957600080fd5b506106426113fd565b005b34801561065057600080fd5b5061066b60048036038101906106669190613fc5565b6114a5565b005b34801561067957600080fd5b506106826115a1565b60405161068f9190614e31565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613e6f565b6115ab565b005b3480156106cd57600080fd5b506106e860048036038101906106e39190613dd5565b6115cb565b6040516106f591906149b0565b60405180910390f35b34801561070a57600080fd5b50610713611679565b6040516107209190614e31565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b91906140b1565b61167f565b60405161075d9190614e31565b60405180910390f35b34801561077257600080fd5b5061078d60048036038101906107889190614068565b6116f0565b005b34801561079b57600080fd5b506107a4611786565b6040516107b191906149d2565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc91906140b1565b611799565b6040516107ee91906148f7565b60405180910390f35b34801561080357600080fd5b5061081e600480360381019061081991906140b1565b61184b565b005b34801561082c57600080fd5b5061084760048036038101906108429190613dd5565b61191a565b6040516108549190614e31565b60405180910390f35b34801561086957600080fd5b506108726119d2565b005b34801561088057600080fd5b50610889611a5a565b6040516108969190614e31565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c191906140de565b611a60565b005b3480156108d457600080fd5b506108ef60048036038101906108ea91906140b1565b611b6f565b6040516108fc91906148f7565b60405180910390f35b34801561091157600080fd5b5061091a611bb7565b60405161092791906148f7565b60405180910390f35b34801561093c57600080fd5b50610957600480360381019061095291906140b1565b611be1565b005b34801561096557600080fd5b5061096e611c67565b60405161097b91906149ed565b60405180910390f35b34801561099057600080fd5b506109ab60048036038101906109a69190613dd5565b611cf9565b6040516109b89190614e31565b60405180910390f35b3480156109cd57600080fd5b506109d6611d42565b6040516109e391906149ed565b60405180910390f35b3480156109f857600080fd5b50610a01611dd0565b604051610a0e9190614e31565b60405180910390f35b610a316004803603810190610a2c91906140b1565b611dd6565b005b348015610a3f57600080fd5b50610a5a6004803603810190610a559190613f45565b6120f1565b005b348015610a6857600080fd5b50610a836004803603810190610a7e9190614068565b612272565b005b348015610a9157600080fd5b50610aac6004803603810190610aa79190613ec2565b61235e565b005b348015610aba57600080fd5b50610ad56004803603810190610ad09190614171565b6123c0565b005b348015610ae357600080fd5b50610aec612515565b005b348015610afa57600080fd5b50610b156004803603810190610b1091906140b1565b6125e6565b604051610b2291906149ed565b60405180910390f35b348015610b3757600080fd5b50610b526004803603810190610b4d9190613dd5565b61268e565b604051610b5f9190614e31565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a919061411e565b6126d7565b005b348015610b9d57600080fd5b50610ba661278b565b604051610bb39190614e31565b60405180910390f35b348015610bc857600080fd5b50610be36004803603810190610bde91906140b1565b612791565b604051610bf091906149ed565b60405180910390f35b348015610c0557600080fd5b50610c0e61286e565b604051610c1b9190614e31565b60405180910390f35b348015610c3057600080fd5b50610c4b6004803603810190610c469190613e2f565b612878565b604051610c5891906149d2565b60405180910390f35b348015610c6d57600080fd5b50610c886004803603810190610c839190613dd5565b61290c565b005b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d055750610d0482612a04565b5b9050919050565b606060008054610d1b906151ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610d47906151ae565b8015610d945780601f10610d6957610100808354040283529160200191610d94565b820191906000526020600020905b815481529060010190602001808311610d7757829003601f168201915b5050505050905090565b6000610da982612ae6565b610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90614d11565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e2e82611799565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690614d91565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ebe610c8a565b73ffffffffffffffffffffffffffffffffffffffff161480610eed5750610eec81610ee7610c8a565b612878565b5b610f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2390614c31565b60405180910390fd5b610f368383612b52565b505050565b610f43610c8a565b73ffffffffffffffffffffffffffffffffffffffff16610f61611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae90614d31565b60405180910390fd5b8060109080519060200190610fcd929190613b36565b5050565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105790614b11565b60405180910390fd5b6000600c54476110709190614f9b565b90506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846111029190615022565b61110c9190614ff1565b611116919061507c565b9050600081141561115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390614bf1565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111a79190614f9b565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c546111f89190614f9b565b600c819055506112088382612c0b565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051611239929190614912565b60405180910390a1505050565b60108054611253906151ae565b80601f016020809104026020016040519081016040528092919081815260200182805461127f906151ae565b80156112cc5780601f106112a1576101008083540402835291602001916112cc565b820191906000526020600020905b8154815290600101906020018083116112af57829003601f168201915b505050505081565b6112e56112df610c8a565b82612cff565b611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90614df1565b60405180910390fd5b61132f838383612ddd565b505050565b60185481565b601a5481565b601b5481565b60006113518361191a565b8210611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990614a91565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601c5481565b60135481565b60125481565b611405610c8a565b73ffffffffffffffffffffffffffffffffffffffff16611423611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147090614d31565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b6114ad610c8a565b73ffffffffffffffffffffffffffffffffffffffff166114cb611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151890614d31565b60405180910390fd5b60005b815181101561159d576001601f600084848151811061154657611545615347565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508061159690615211565b9050611524565b5050565b6000600b54905090565b6115c68383836040518060200160405280600081525061235e565b505050565b606060006115d88361191a565b905060008167ffffffffffffffff8111156115f6576115f5615376565b5b6040519080825280602002602001820160405280156116245781602001602082028036833780820191505090505b50905060005b8281101561166e5761163c8582611346565b82828151811061164f5761164e615347565b5b602002602001018181525050808061166690615211565b91505061162a565b508092505050919050565b60175481565b6000611689610fd1565b82106116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190614e11565b60405180910390fd5b600882815481106116de576116dd615347565b5b90600052602060002001549050919050565b6116f8610c8a565b73ffffffffffffffffffffffffffffffffffffffff16611716611bb7565b73ffffffffffffffffffffffffffffffffffffffff161461176c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176390614d31565b60405180910390fd5b80601d9080519060200190611782929190613b36565b5050565b601460009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990614c71565b60405180910390fd5b80915050919050565b611853610c8a565b73ffffffffffffffffffffffffffffffffffffffff16611871611bb7565b73ffffffffffffffffffffffffffffffffffffffff16146118c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118be90614d31565b60405180910390fd5b6118cf610fd1565b8111611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790614b31565b60405180910390fd5b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290614c51565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119da610c8a565b73ffffffffffffffffffffffffffffffffffffffff166119f8611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4590614d31565b60405180910390fd5b611a586000613039565b565b60165481565b611a68610c8a565b73ffffffffffffffffffffffffffffffffffffffff16611a86611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad390614d31565b60405180910390fd5b6000611ae6610fd1565b90506012548382611af79190614f9b565b1115611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90614a31565b60405180910390fd5b60005b83811015611b6957611b58838284611b539190614f9b565b6130ff565b80611b6290615211565b9050611b3b565b50505050565b6000600f8281548110611b8557611b84615347565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611be9610c8a565b73ffffffffffffffffffffffffffffffffffffffff16611c07611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5490614d31565b60405180910390fd5b8060158190555050565b606060018054611c76906151ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca2906151ae565b8015611cef5780601f10611cc457610100808354040283529160200191611cef565b820191906000526020600020905b815481529060010190602001808311611cd257829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60118054611d4f906151ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7b906151ae565b8015611dc85780601f10611d9d57610100808354040283529160200191611dc8565b820191906000526020600020905b815481529060010190602001808311611dab57829003601f168201915b505050505081565b60155481565b601460009054906101000a900460ff1615611e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1d90614a51565b60405180910390fd5b80601554611e349190615022565b341015611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d90614db1565b60405180910390fd5b6000611e80610fd1565b9050601b544210611f7d57601a54821115611ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec790614c91565b60405180910390fd5b6012548282611edf9190614f9b565b1115611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1790614a31565b60405180910390fd5b601c5482611f2d3361191a565b611f379190614f9b565b1115611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90614cb1565b60405180910390fd5b6120bb565b601754421061207857601654821115611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc290614c91565b60405180910390fd5b6018548282611fda9190614f9b565b111561201b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201290614a31565b60405180910390fd5b601954826120283361191a565b6120329190614f9b565b1115612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206a90614cb1565b60405180910390fd5b6120ba565b60006120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b090614a71565b60405180910390fd5b5b5b60005b828110156120ec576120db3382846120d69190614f9b565b6130ff565b806120e590615211565b90506120be565b505050565b6120f9610c8a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215e90614b71565b60405180910390fd5b8060056000612174610c8a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612221610c8a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161226691906149d2565b60405180910390a35050565b61227a610c8a565b73ffffffffffffffffffffffffffffffffffffffff16612298611bb7565b73ffffffffffffffffffffffffffffffffffffffff16146122ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e590614d31565b60405180910390fd5b60001515601e60009054906101000a900460ff16151514612344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233b90614dd1565b60405180910390fd5b806011908051906020019061235a929190613b36565b5050565b61236f612369610c8a565b83612cff565b6123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a590614df1565b60405180910390fd5b6123ba8484848461311d565b50505050565b6123c8610c8a565b73ffffffffffffffffffffffffffffffffffffffff166123e6611bb7565b73ffffffffffffffffffffffffffffffffffffffff161461243c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243390614d31565b60405180910390fd5b612444610fd1565b811015612486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247d90614b31565b60405180910390fd5b6012548111156124cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c290614c11565b60405180910390fd5b83601654146124dc57836016819055505b82601754146124ed57826017819055505b81601654146124fe57816019819055505b806018541461250f57806018819055505b50505050565b61251d610c8a565b73ffffffffffffffffffffffffffffffffffffffff1661253b611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614612591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258890614d31565b60405180910390fd5b6001601e60006101000a81548160ff0219169083151502179055507fd0aa4d8e7b0215933778f41575f8ad2175172a023ede476fc2724a38357dc67460116040516125dc9190614a0f565b60405180910390a1565b60606125f182612ae6565b612630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262790614d71565b60405180910390fd5b6000601d805461263f906151ae565b90501161265b5760405180602001604052806000815250612687565b601d61266683613179565b6040516020016126779291906148be565b6040516020818303038152906040525b9050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6126df610c8a565b73ffffffffffffffffffffffffffffffffffffffff166126fd611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614612753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274a90614d31565b60405180910390fd5b82601a54146127645782601a819055505b81601b54146127755781601b819055505b80601c54146127865780601c819055505b505050565b60195481565b606061279b610fd1565b82106127dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d390614cd1565b60405180910390fd5b601180546127e9906151ae565b80601f0160208091040260200160405190810160405280929190818152602001828054612815906151ae565b80156128625780601f1061283757610100808354040283529160200191612862565b820191906000526020600020905b81548152906001019060200180831161284557829003601f168201915b50505050509050919050565b6000600c54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612914610c8a565b73ffffffffffffffffffffffffffffffffffffffff16612932611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614612988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297f90614d31565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ef90614ad1565b60405180910390fd5b612a0181613039565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612acf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612adf5750612ade826132da565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612bc583611799565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4590614bb1565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612c74906148e2565b60006040518083038185875af1925050503d8060008114612cb1576040519150601f19603f3d011682016040523d82523d6000602084013e612cb6565b606091505b5050905080612cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf190614b91565b60405180910390fd5b505050565b6000612d0a82612ae6565b612d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4090614bd1565b60405180910390fd5b6000612d5483611799565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612dc357508373ffffffffffffffffffffffffffffffffffffffff16612dab84610d9e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612dd45750612dd38185612878565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612dfd82611799565b73ffffffffffffffffffffffffffffffffffffffff1614612e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4a90614d51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eba90614b51565b60405180910390fd5b612ece838383613344565b612ed9600082612b52565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f29919061507c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f809190614f9b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613119828260405180602001604052806000815250613458565b5050565b613128848484612ddd565b613134848484846134b3565b613173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316a90614ab1565b60405180910390fd5b50505050565b606060008214156131c1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132d5565b600082905060005b600082146131f35780806131dc90615211565b915050600a826131ec9190614ff1565b91506131c9565b60008167ffffffffffffffff81111561320f5761320e615376565b5b6040519080825280601f01601f1916602001820160405280156132415781602001600182028036833780820191505090505b5090505b600085146132ce5760018261325a919061507c565b9150600a85613269919061525a565b60306132759190614f9b565b60f81b81838151811061328b5761328a615347565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132c79190614ff1565b9450613245565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61334f83838361364a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133925761338d8161364f565b6133d1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146133d0576133cf8382613698565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134145761340f81613805565b613453565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146134525761345182826138d6565b5b5b505050565b6134628383613955565b61346f60008484846134b3565b6134ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a590614ab1565b60405180910390fd5b505050565b60006134d48473ffffffffffffffffffffffffffffffffffffffff16613b23565b1561363d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134fd610c8a565b8786866040518563ffffffff1660e01b815260040161351f949392919061493b565b602060405180830381600087803b15801561353957600080fd5b505af192505050801561356a57506040513d601f19601f82011682018060405250810190613567919061403b565b60015b6135ed573d806000811461359a576040519150601f19603f3d011682016040523d82523d6000602084013e61359f565b606091505b506000815114156135e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dc90614ab1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613642565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136a58461191a565b6136af919061507c565b9050600060076000848152602001908152602001600020549050818114613794576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613819919061507c565b905060006009600084815260200190815260200160002054905060006008838154811061384957613848615347565b5b90600052602060002001549050806008838154811061386b5761386a615347565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138ba576138b9615318565b5b6001900381819060005260206000200160009055905550505050565b60006138e18361191a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139bc90614cf1565b60405180910390fd5b6139ce81612ae6565b15613a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0590614af1565b60405180910390fd5b613a1a60008383613344565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a6a9190614f9b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613b42906151ae565b90600052602060002090601f016020900481019282613b645760008555613bab565b82601f10613b7d57805160ff1916838001178555613bab565b82800160010185558215613bab579182015b82811115613baa578251825591602001919060010190613b8f565b5b509050613bb89190613bbc565b5090565b5b80821115613bd5576000816000905550600101613bbd565b5090565b6000613bec613be784614e71565b614e4c565b90508083825260208201905082856020860282011115613c0f57613c0e6153aa565b5b60005b85811015613c3f5781613c258882613ccd565b845260208401935060208301925050600181019050613c12565b5050509392505050565b6000613c5c613c5784614e9d565b614e4c565b905082815260208101848484011115613c7857613c776153af565b5b613c8384828561516c565b509392505050565b6000613c9e613c9984614ece565b614e4c565b905082815260208101848484011115613cba57613cb96153af565b5b613cc584828561516c565b509392505050565b600081359050613cdc81615bc4565b92915050565b600081359050613cf181615bdb565b92915050565b600082601f830112613d0c57613d0b6153a5565b5b8135613d1c848260208601613bd9565b91505092915050565b600081359050613d3481615bf2565b92915050565b600081359050613d4981615c09565b92915050565b600081519050613d5e81615c09565b92915050565b600082601f830112613d7957613d786153a5565b5b8135613d89848260208601613c49565b91505092915050565b600082601f830112613da757613da66153a5565b5b8135613db7848260208601613c8b565b91505092915050565b600081359050613dcf81615c20565b92915050565b600060208284031215613deb57613dea6153b9565b5b6000613df984828501613ccd565b91505092915050565b600060208284031215613e1857613e176153b9565b5b6000613e2684828501613ce2565b91505092915050565b60008060408385031215613e4657613e456153b9565b5b6000613e5485828601613ccd565b9250506020613e6585828601613ccd565b9150509250929050565b600080600060608486031215613e8857613e876153b9565b5b6000613e9686828701613ccd565b9350506020613ea786828701613ccd565b9250506040613eb886828701613dc0565b9150509250925092565b60008060008060808587031215613edc57613edb6153b9565b5b6000613eea87828801613ccd565b9450506020613efb87828801613ccd565b9350506040613f0c87828801613dc0565b925050606085013567ffffffffffffffff811115613f2d57613f2c6153b4565b5b613f3987828801613d64565b91505092959194509250565b60008060408385031215613f5c57613f5b6153b9565b5b6000613f6a85828601613ccd565b9250506020613f7b85828601613d25565b9150509250929050565b60008060408385031215613f9c57613f9b6153b9565b5b6000613faa85828601613ccd565b9250506020613fbb85828601613dc0565b9150509250929050565b600060208284031215613fdb57613fda6153b9565b5b600082013567ffffffffffffffff811115613ff957613ff86153b4565b5b61400584828501613cf7565b91505092915050565b600060208284031215614024576140236153b9565b5b600061403284828501613d3a565b91505092915050565b600060208284031215614051576140506153b9565b5b600061405f84828501613d4f565b91505092915050565b60006020828403121561407e5761407d6153b9565b5b600082013567ffffffffffffffff81111561409c5761409b6153b4565b5b6140a884828501613d92565b91505092915050565b6000602082840312156140c7576140c66153b9565b5b60006140d584828501613dc0565b91505092915050565b600080604083850312156140f5576140f46153b9565b5b600061410385828601613dc0565b925050602061411485828601613ccd565b9150509250929050565b600080600060608486031215614137576141366153b9565b5b600061414586828701613dc0565b935050602061415686828701613dc0565b925050604061416786828701613dc0565b9150509250925092565b6000806000806080858703121561418b5761418a6153b9565b5b600061419987828801613dc0565b94505060206141aa87828801613dc0565b93505060406141bb87828801613dc0565b92505060606141cc87828801613dc0565b91505092959194509250565b60006141e483836148a0565b60208301905092915050565b6141f981615136565b82525050565b614208816150b0565b82525050565b600061421982614f24565b6142238185614f52565b935061422e83614eff565b8060005b8381101561425f57815161424688826141d8565b975061425183614f45565b925050600181019050614232565b5085935050505092915050565b614275816150d4565b82525050565b600061428682614f2f565b6142908185614f63565b93506142a081856020860161517b565b6142a9816153be565b840191505092915050565b60006142bf82614f3a565b6142c98185614f7f565b93506142d981856020860161517b565b6142e2816153be565b840191505092915050565b60006142f882614f3a565b6143028185614f90565b935061431281856020860161517b565b80840191505092915050565b6000815461432b816151ae565b6143358186614f7f565b94506001821660008114614350576001811461436257614395565b60ff1983168652602086019350614395565b61436b85614f0f565b60005b8381101561438d5781548189015260018201915060208101905061436e565b808801955050505b50505092915050565b600081546143ab816151ae565b6143b58186614f90565b945060018216600081146143d057600181146143e157614414565b60ff19831686528186019350614414565b6143ea85614f0f565b60005b8381101561440c578154818901526001820191506020810190506143ed565b838801955050505b50505092915050565b600061442a600e83614f7f565b9150614435826153cf565b602082019050919050565b600061444d600b83614f7f565b9150614458826153f8565b602082019050919050565b6000614470601883614f7f565b915061447b82615421565b602082019050919050565b6000614493602b83614f7f565b915061449e8261544a565b604082019050919050565b60006144b6603283614f7f565b91506144c182615499565b604082019050919050565b60006144d9602683614f7f565b91506144e4826154e8565b604082019050919050565b60006144fc601c83614f7f565b915061450782615537565b602082019050919050565b600061451f602683614f7f565b915061452a82615560565b604082019050919050565b6000614542602e83614f7f565b915061454d826155af565b604082019050919050565b6000614565602483614f7f565b9150614570826155fe565b604082019050919050565b6000614588601983614f7f565b91506145938261564d565b602082019050919050565b60006145ab603a83614f7f565b91506145b682615676565b604082019050919050565b60006145ce601d83614f7f565b91506145d9826156c5565b602082019050919050565b60006145f1602c83614f7f565b91506145fc826156ee565b604082019050919050565b6000614614602b83614f7f565b915061461f8261573d565b604082019050919050565b6000614637602b83614f7f565b91506146428261578c565b604082019050919050565b600061465a603883614f7f565b9150614665826157db565b604082019050919050565b600061467d602a83614f7f565b91506146888261582a565b604082019050919050565b60006146a0602983614f7f565b91506146ab82615879565b604082019050919050565b60006146c3600d83614f7f565b91506146ce826158c8565b602082019050919050565b60006146e6600f83614f7f565b91506146f1826158f1565b602082019050919050565b6000614709600a83614f7f565b91506147148261591a565b602082019050919050565b600061472c602083614f7f565b915061473782615943565b602082019050919050565b600061474f602c83614f7f565b915061475a8261596c565b604082019050919050565b6000614772602083614f7f565b915061477d826159bb565b602082019050919050565b6000614795602983614f7f565b91506147a0826159e4565b604082019050919050565b60006147b8602f83614f7f565b91506147c382615a33565b604082019050919050565b60006147db602183614f7f565b91506147e682615a82565b604082019050919050565b60006147fe601983614f7f565b915061480982615ad1565b602082019050919050565b6000614821601683614f7f565b915061482c82615afa565b602082019050919050565b6000614844600083614f74565b915061484f82615b23565b600082019050919050565b6000614867603183614f7f565b915061487282615b26565b604082019050919050565b600061488a602c83614f7f565b915061489582615b75565b604082019050919050565b6148a98161512c565b82525050565b6148b88161512c565b82525050565b60006148ca828561439e565b91506148d682846142ed565b91508190509392505050565b60006148ed82614837565b9150819050919050565b600060208201905061490c60008301846141ff565b92915050565b600060408201905061492760008301856141f0565b61493460208301846148af565b9392505050565b600060808201905061495060008301876141ff565b61495d60208301866141ff565b61496a60408301856148af565b818103606083015261497c818461427b565b905095945050505050565b600060408201905061499c60008301856141ff565b6149a960208301846148af565b9392505050565b600060208201905081810360008301526149ca818461420e565b905092915050565b60006020820190506149e7600083018461426c565b92915050565b60006020820190508181036000830152614a0781846142b4565b905092915050565b60006020820190508181036000830152614a29818461431e565b905092915050565b60006020820190508181036000830152614a4a8161441d565b9050919050565b60006020820190508181036000830152614a6a81614440565b9050919050565b60006020820190508181036000830152614a8a81614463565b9050919050565b60006020820190508181036000830152614aaa81614486565b9050919050565b60006020820190508181036000830152614aca816144a9565b9050919050565b60006020820190508181036000830152614aea816144cc565b9050919050565b60006020820190508181036000830152614b0a816144ef565b9050919050565b60006020820190508181036000830152614b2a81614512565b9050919050565b60006020820190508181036000830152614b4a81614535565b9050919050565b60006020820190508181036000830152614b6a81614558565b9050919050565b60006020820190508181036000830152614b8a8161457b565b9050919050565b60006020820190508181036000830152614baa8161459e565b9050919050565b60006020820190508181036000830152614bca816145c1565b9050919050565b60006020820190508181036000830152614bea816145e4565b9050919050565b60006020820190508181036000830152614c0a81614607565b9050919050565b60006020820190508181036000830152614c2a8161462a565b9050919050565b60006020820190508181036000830152614c4a8161464d565b9050919050565b60006020820190508181036000830152614c6a81614670565b9050919050565b60006020820190508181036000830152614c8a81614693565b9050919050565b60006020820190508181036000830152614caa816146b6565b9050919050565b60006020820190508181036000830152614cca816146d9565b9050919050565b60006020820190508181036000830152614cea816146fc565b9050919050565b60006020820190508181036000830152614d0a8161471f565b9050919050565b60006020820190508181036000830152614d2a81614742565b9050919050565b60006020820190508181036000830152614d4a81614765565b9050919050565b60006020820190508181036000830152614d6a81614788565b9050919050565b60006020820190508181036000830152614d8a816147ab565b9050919050565b60006020820190508181036000830152614daa816147ce565b9050919050565b60006020820190508181036000830152614dca816147f1565b9050919050565b60006020820190508181036000830152614dea81614814565b9050919050565b60006020820190508181036000830152614e0a8161485a565b9050919050565b60006020820190508181036000830152614e2a8161487d565b9050919050565b6000602082019050614e4660008301846148af565b92915050565b6000614e56614e67565b9050614e6282826151e0565b919050565b6000604051905090565b600067ffffffffffffffff821115614e8c57614e8b615376565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614eb857614eb7615376565b5b614ec1826153be565b9050602081019050919050565b600067ffffffffffffffff821115614ee957614ee8615376565b5b614ef2826153be565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fa68261512c565b9150614fb18361512c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fe657614fe561528b565b5b828201905092915050565b6000614ffc8261512c565b91506150078361512c565b925082615017576150166152ba565b5b828204905092915050565b600061502d8261512c565b91506150388361512c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150715761507061528b565b5b828202905092915050565b60006150878261512c565b91506150928361512c565b9250828210156150a5576150a461528b565b5b828203905092915050565b60006150bb8261510c565b9050919050565b60006150cd8261510c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061514182615148565b9050919050565b60006151538261515a565b9050919050565b60006151658261510c565b9050919050565b82818337600083830152505050565b60005b8381101561519957808201518184015260208101905061517e565b838111156151a8576000848401525b50505050565b600060028204905060018216806151c657607f821691505b602082108114156151da576151d96152e9565b5b50919050565b6151e9826153be565b810181811067ffffffffffffffff8211171561520857615207615376565b5b80604052505050565b600061521c8261512c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561524f5761524e61528b565b5b600182019050919050565b60006152658261512c565b91506152708361512c565b9250826152805761527f6152ba565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4578636565647320737570706c79000000000000000000000000000000000000600082015250565b7f53616c6520706175736564000000000000000000000000000000000000000000600082015250565b7f53616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f53706563696669656420737570706c79206973206c6f776572207468616e206360008201527f757272656e742062616c616e6365000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f53706563696669656420737570706c792069732067726561746572207468616e60008201527f206d617820737570706c79000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4f7264657220746f6f2062696700000000000000000000000000000000000000600082015250565b7f446f6e2774206265206772656564790000000000000000000000000000000000600082015250565b7f496e76616c696420494400000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b615bcd816150b0565b8114615bd857600080fd5b50565b615be4816150c2565b8114615bef57600080fd5b50565b615bfb816150d4565b8114615c0657600080fd5b50565b615c12816150e0565b8114615c1d57600080fd5b50565b615c298161512c565b8114615c3457600080fd5b5056fea26469706673582212207c6b0891c431ca63a07814f5872bfda180c8a5dbf7da43cd12651e447100d65f64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103035760003560e01c80636f8b44b011610190578063a22cb465116100dc578063ce7c2ac211610095578063d9b137b21161006f578063d9b137b214610bbc578063e33b7de314610bf9578063e985e9c514610c24578063f2fde38b14610c615761034a565b8063ce7c2ac214610b2b578063d07b63c614610b68578063d3344ed314610b915761034a565b8063a22cb46514610a33578063b09904b514610a5c578063b88d4fde14610a85578063bc7a916314610aae578063bf4702fc14610ad7578063c87b56dd14610aee5761034a565b80638da5cb5b116101495780639852595c116101235780639852595c146109845780639c3e72bd146109c1578063a035b1fe146109ec578063a0712d6814610a175761034a565b80638da5cb5b1461090557806391b7f5ed1461093057806395d89b41146109595761034a565b80636f8b44b0146107f757806370a0823114610820578063715018a61461085d578063833de1d51461087457806383a076be1461089f5780638b83209b146108c85761034a565b8063319a3fbd1161024f57806342842e0e116102085780634f6ccce7116101e25780634f6ccce71461072957806355f804b3146107665780635c975abb1461078f5780636352211e146107ba5761034a565b806342842e0e14610698578063438b6300146106c1578063445a3771146106fe5761034a565b8063319a3fbd146105ac57806331a53e9a146105d757806332cb6b0c1461060257806334918dfd1461062d5780633819fc0f146106445780633a98ef391461066d5761034a565b806319165587116102bc57806324eedd4c1161029657806324eedd4c146104ee5780632a146986146105195780632e5c0fe7146105445780632f745c591461056f5761034a565b806319165587146104715780632035b1391461049a57806323b872dd146104c55761034a565b806301ffc9a71461034f57806306fdde031461038c578063081812fc146103b7578063095ea7b3146103f4578063109695231461041d57806318160ddd146104465761034a565b3661034a577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770610331610c8a565b34604051610340929190614987565b60405180910390a1005b600080fd5b34801561035b57600080fd5b506103766004803603810190610371919061400e565b610c92565b60405161038391906149d2565b60405180910390f35b34801561039857600080fd5b506103a1610d0c565b6040516103ae91906149ed565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d991906140b1565b610d9e565b6040516103eb91906148f7565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613f85565b610e23565b005b34801561042957600080fd5b50610444600480360381019061043f9190614068565b610f3b565b005b34801561045257600080fd5b5061045b610fd1565b6040516104689190614e31565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190613e02565b610fde565b005b3480156104a657600080fd5b506104af611246565b6040516104bc91906149ed565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613e6f565b6112d4565b005b3480156104fa57600080fd5b50610503611334565b6040516105109190614e31565b60405180910390f35b34801561052557600080fd5b5061052e61133a565b60405161053b9190614e31565b60405180910390f35b34801561055057600080fd5b50610559611340565b6040516105669190614e31565b60405180910390f35b34801561057b57600080fd5b5061059660048036038101906105919190613f85565b611346565b6040516105a39190614e31565b60405180910390f35b3480156105b857600080fd5b506105c16113eb565b6040516105ce9190614e31565b60405180910390f35b3480156105e357600080fd5b506105ec6113f1565b6040516105f99190614e31565b60405180910390f35b34801561060e57600080fd5b506106176113f7565b6040516106249190614e31565b60405180910390f35b34801561063957600080fd5b506106426113fd565b005b34801561065057600080fd5b5061066b60048036038101906106669190613fc5565b6114a5565b005b34801561067957600080fd5b506106826115a1565b60405161068f9190614e31565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613e6f565b6115ab565b005b3480156106cd57600080fd5b506106e860048036038101906106e39190613dd5565b6115cb565b6040516106f591906149b0565b60405180910390f35b34801561070a57600080fd5b50610713611679565b6040516107209190614e31565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b91906140b1565b61167f565b60405161075d9190614e31565b60405180910390f35b34801561077257600080fd5b5061078d60048036038101906107889190614068565b6116f0565b005b34801561079b57600080fd5b506107a4611786565b6040516107b191906149d2565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc91906140b1565b611799565b6040516107ee91906148f7565b60405180910390f35b34801561080357600080fd5b5061081e600480360381019061081991906140b1565b61184b565b005b34801561082c57600080fd5b5061084760048036038101906108429190613dd5565b61191a565b6040516108549190614e31565b60405180910390f35b34801561086957600080fd5b506108726119d2565b005b34801561088057600080fd5b50610889611a5a565b6040516108969190614e31565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c191906140de565b611a60565b005b3480156108d457600080fd5b506108ef60048036038101906108ea91906140b1565b611b6f565b6040516108fc91906148f7565b60405180910390f35b34801561091157600080fd5b5061091a611bb7565b60405161092791906148f7565b60405180910390f35b34801561093c57600080fd5b50610957600480360381019061095291906140b1565b611be1565b005b34801561096557600080fd5b5061096e611c67565b60405161097b91906149ed565b60405180910390f35b34801561099057600080fd5b506109ab60048036038101906109a69190613dd5565b611cf9565b6040516109b89190614e31565b60405180910390f35b3480156109cd57600080fd5b506109d6611d42565b6040516109e391906149ed565b60405180910390f35b3480156109f857600080fd5b50610a01611dd0565b604051610a0e9190614e31565b60405180910390f35b610a316004803603810190610a2c91906140b1565b611dd6565b005b348015610a3f57600080fd5b50610a5a6004803603810190610a559190613f45565b6120f1565b005b348015610a6857600080fd5b50610a836004803603810190610a7e9190614068565b612272565b005b348015610a9157600080fd5b50610aac6004803603810190610aa79190613ec2565b61235e565b005b348015610aba57600080fd5b50610ad56004803603810190610ad09190614171565b6123c0565b005b348015610ae357600080fd5b50610aec612515565b005b348015610afa57600080fd5b50610b156004803603810190610b1091906140b1565b6125e6565b604051610b2291906149ed565b60405180910390f35b348015610b3757600080fd5b50610b526004803603810190610b4d9190613dd5565b61268e565b604051610b5f9190614e31565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a919061411e565b6126d7565b005b348015610b9d57600080fd5b50610ba661278b565b604051610bb39190614e31565b60405180910390f35b348015610bc857600080fd5b50610be36004803603810190610bde91906140b1565b612791565b604051610bf091906149ed565b60405180910390f35b348015610c0557600080fd5b50610c0e61286e565b604051610c1b9190614e31565b60405180910390f35b348015610c3057600080fd5b50610c4b6004803603810190610c469190613e2f565b612878565b604051610c5891906149d2565b60405180910390f35b348015610c6d57600080fd5b50610c886004803603810190610c839190613dd5565b61290c565b005b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d055750610d0482612a04565b5b9050919050565b606060008054610d1b906151ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610d47906151ae565b8015610d945780601f10610d6957610100808354040283529160200191610d94565b820191906000526020600020905b815481529060010190602001808311610d7757829003601f168201915b5050505050905090565b6000610da982612ae6565b610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90614d11565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e2e82611799565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690614d91565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ebe610c8a565b73ffffffffffffffffffffffffffffffffffffffff161480610eed5750610eec81610ee7610c8a565b612878565b5b610f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2390614c31565b60405180910390fd5b610f368383612b52565b505050565b610f43610c8a565b73ffffffffffffffffffffffffffffffffffffffff16610f61611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae90614d31565b60405180910390fd5b8060109080519060200190610fcd929190613b36565b5050565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105790614b11565b60405180910390fd5b6000600c54476110709190614f9b565b90506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846111029190615022565b61110c9190614ff1565b611116919061507c565b9050600081141561115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390614bf1565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111a79190614f9b565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c546111f89190614f9b565b600c819055506112088382612c0b565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051611239929190614912565b60405180910390a1505050565b60108054611253906151ae565b80601f016020809104026020016040519081016040528092919081815260200182805461127f906151ae565b80156112cc5780601f106112a1576101008083540402835291602001916112cc565b820191906000526020600020905b8154815290600101906020018083116112af57829003601f168201915b505050505081565b6112e56112df610c8a565b82612cff565b611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90614df1565b60405180910390fd5b61132f838383612ddd565b505050565b60185481565b601a5481565b601b5481565b60006113518361191a565b8210611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990614a91565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601c5481565b60135481565b60125481565b611405610c8a565b73ffffffffffffffffffffffffffffffffffffffff16611423611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147090614d31565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b6114ad610c8a565b73ffffffffffffffffffffffffffffffffffffffff166114cb611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151890614d31565b60405180910390fd5b60005b815181101561159d576001601f600084848151811061154657611545615347565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508061159690615211565b9050611524565b5050565b6000600b54905090565b6115c68383836040518060200160405280600081525061235e565b505050565b606060006115d88361191a565b905060008167ffffffffffffffff8111156115f6576115f5615376565b5b6040519080825280602002602001820160405280156116245781602001602082028036833780820191505090505b50905060005b8281101561166e5761163c8582611346565b82828151811061164f5761164e615347565b5b602002602001018181525050808061166690615211565b91505061162a565b508092505050919050565b60175481565b6000611689610fd1565b82106116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190614e11565b60405180910390fd5b600882815481106116de576116dd615347565b5b90600052602060002001549050919050565b6116f8610c8a565b73ffffffffffffffffffffffffffffffffffffffff16611716611bb7565b73ffffffffffffffffffffffffffffffffffffffff161461176c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176390614d31565b60405180910390fd5b80601d9080519060200190611782929190613b36565b5050565b601460009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990614c71565b60405180910390fd5b80915050919050565b611853610c8a565b73ffffffffffffffffffffffffffffffffffffffff16611871611bb7565b73ffffffffffffffffffffffffffffffffffffffff16146118c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118be90614d31565b60405180910390fd5b6118cf610fd1565b8111611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790614b31565b60405180910390fd5b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290614c51565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119da610c8a565b73ffffffffffffffffffffffffffffffffffffffff166119f8611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4590614d31565b60405180910390fd5b611a586000613039565b565b60165481565b611a68610c8a565b73ffffffffffffffffffffffffffffffffffffffff16611a86611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad390614d31565b60405180910390fd5b6000611ae6610fd1565b90506012548382611af79190614f9b565b1115611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90614a31565b60405180910390fd5b60005b83811015611b6957611b58838284611b539190614f9b565b6130ff565b80611b6290615211565b9050611b3b565b50505050565b6000600f8281548110611b8557611b84615347565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611be9610c8a565b73ffffffffffffffffffffffffffffffffffffffff16611c07611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5490614d31565b60405180910390fd5b8060158190555050565b606060018054611c76906151ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca2906151ae565b8015611cef5780601f10611cc457610100808354040283529160200191611cef565b820191906000526020600020905b815481529060010190602001808311611cd257829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60118054611d4f906151ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7b906151ae565b8015611dc85780601f10611d9d57610100808354040283529160200191611dc8565b820191906000526020600020905b815481529060010190602001808311611dab57829003601f168201915b505050505081565b60155481565b601460009054906101000a900460ff1615611e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1d90614a51565b60405180910390fd5b80601554611e349190615022565b341015611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d90614db1565b60405180910390fd5b6000611e80610fd1565b9050601b544210611f7d57601a54821115611ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec790614c91565b60405180910390fd5b6012548282611edf9190614f9b565b1115611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1790614a31565b60405180910390fd5b601c5482611f2d3361191a565b611f379190614f9b565b1115611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90614cb1565b60405180910390fd5b6120bb565b601754421061207857601654821115611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc290614c91565b60405180910390fd5b6018548282611fda9190614f9b565b111561201b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201290614a31565b60405180910390fd5b601954826120283361191a565b6120329190614f9b565b1115612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206a90614cb1565b60405180910390fd5b6120ba565b60006120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b090614a71565b60405180910390fd5b5b5b60005b828110156120ec576120db3382846120d69190614f9b565b6130ff565b806120e590615211565b90506120be565b505050565b6120f9610c8a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215e90614b71565b60405180910390fd5b8060056000612174610c8a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612221610c8a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161226691906149d2565b60405180910390a35050565b61227a610c8a565b73ffffffffffffffffffffffffffffffffffffffff16612298611bb7565b73ffffffffffffffffffffffffffffffffffffffff16146122ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e590614d31565b60405180910390fd5b60001515601e60009054906101000a900460ff16151514612344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233b90614dd1565b60405180910390fd5b806011908051906020019061235a929190613b36565b5050565b61236f612369610c8a565b83612cff565b6123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a590614df1565b60405180910390fd5b6123ba8484848461311d565b50505050565b6123c8610c8a565b73ffffffffffffffffffffffffffffffffffffffff166123e6611bb7565b73ffffffffffffffffffffffffffffffffffffffff161461243c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243390614d31565b60405180910390fd5b612444610fd1565b811015612486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247d90614b31565b60405180910390fd5b6012548111156124cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c290614c11565b60405180910390fd5b83601654146124dc57836016819055505b82601754146124ed57826017819055505b81601654146124fe57816019819055505b806018541461250f57806018819055505b50505050565b61251d610c8a565b73ffffffffffffffffffffffffffffffffffffffff1661253b611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614612591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258890614d31565b60405180910390fd5b6001601e60006101000a81548160ff0219169083151502179055507fd0aa4d8e7b0215933778f41575f8ad2175172a023ede476fc2724a38357dc67460116040516125dc9190614a0f565b60405180910390a1565b60606125f182612ae6565b612630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262790614d71565b60405180910390fd5b6000601d805461263f906151ae565b90501161265b5760405180602001604052806000815250612687565b601d61266683613179565b6040516020016126779291906148be565b6040516020818303038152906040525b9050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6126df610c8a565b73ffffffffffffffffffffffffffffffffffffffff166126fd611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614612753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274a90614d31565b60405180910390fd5b82601a54146127645782601a819055505b81601b54146127755781601b819055505b80601c54146127865780601c819055505b505050565b60195481565b606061279b610fd1565b82106127dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d390614cd1565b60405180910390fd5b601180546127e9906151ae565b80601f0160208091040260200160405190810160405280929190818152602001828054612815906151ae565b80156128625780601f1061283757610100808354040283529160200191612862565b820191906000526020600020905b81548152906001019060200180831161284557829003601f168201915b50505050509050919050565b6000600c54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612914610c8a565b73ffffffffffffffffffffffffffffffffffffffff16612932611bb7565b73ffffffffffffffffffffffffffffffffffffffff1614612988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297f90614d31565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ef90614ad1565b60405180910390fd5b612a0181613039565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612acf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612adf5750612ade826132da565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612bc583611799565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4590614bb1565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612c74906148e2565b60006040518083038185875af1925050503d8060008114612cb1576040519150601f19603f3d011682016040523d82523d6000602084013e612cb6565b606091505b5050905080612cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf190614b91565b60405180910390fd5b505050565b6000612d0a82612ae6565b612d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4090614bd1565b60405180910390fd5b6000612d5483611799565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612dc357508373ffffffffffffffffffffffffffffffffffffffff16612dab84610d9e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612dd45750612dd38185612878565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612dfd82611799565b73ffffffffffffffffffffffffffffffffffffffff1614612e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4a90614d51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eba90614b51565b60405180910390fd5b612ece838383613344565b612ed9600082612b52565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f29919061507c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f809190614f9b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613119828260405180602001604052806000815250613458565b5050565b613128848484612ddd565b613134848484846134b3565b613173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316a90614ab1565b60405180910390fd5b50505050565b606060008214156131c1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132d5565b600082905060005b600082146131f35780806131dc90615211565b915050600a826131ec9190614ff1565b91506131c9565b60008167ffffffffffffffff81111561320f5761320e615376565b5b6040519080825280601f01601f1916602001820160405280156132415781602001600182028036833780820191505090505b5090505b600085146132ce5760018261325a919061507c565b9150600a85613269919061525a565b60306132759190614f9b565b60f81b81838151811061328b5761328a615347565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132c79190614ff1565b9450613245565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61334f83838361364a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133925761338d8161364f565b6133d1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146133d0576133cf8382613698565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134145761340f81613805565b613453565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146134525761345182826138d6565b5b5b505050565b6134628383613955565b61346f60008484846134b3565b6134ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a590614ab1565b60405180910390fd5b505050565b60006134d48473ffffffffffffffffffffffffffffffffffffffff16613b23565b1561363d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134fd610c8a565b8786866040518563ffffffff1660e01b815260040161351f949392919061493b565b602060405180830381600087803b15801561353957600080fd5b505af192505050801561356a57506040513d601f19601f82011682018060405250810190613567919061403b565b60015b6135ed573d806000811461359a576040519150601f19603f3d011682016040523d82523d6000602084013e61359f565b606091505b506000815114156135e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dc90614ab1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613642565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136a58461191a565b6136af919061507c565b9050600060076000848152602001908152602001600020549050818114613794576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613819919061507c565b905060006009600084815260200190815260200160002054905060006008838154811061384957613848615347565b5b90600052602060002001549050806008838154811061386b5761386a615347565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138ba576138b9615318565b5b6001900381819060005260206000200160009055905550505050565b60006138e18361191a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139bc90614cf1565b60405180910390fd5b6139ce81612ae6565b15613a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0590614af1565b60405180910390fd5b613a1a60008383613344565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a6a9190614f9b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613b42906151ae565b90600052602060002090601f016020900481019282613b645760008555613bab565b82601f10613b7d57805160ff1916838001178555613bab565b82800160010185558215613bab579182015b82811115613baa578251825591602001919060010190613b8f565b5b509050613bb89190613bbc565b5090565b5b80821115613bd5576000816000905550600101613bbd565b5090565b6000613bec613be784614e71565b614e4c565b90508083825260208201905082856020860282011115613c0f57613c0e6153aa565b5b60005b85811015613c3f5781613c258882613ccd565b845260208401935060208301925050600181019050613c12565b5050509392505050565b6000613c5c613c5784614e9d565b614e4c565b905082815260208101848484011115613c7857613c776153af565b5b613c8384828561516c565b509392505050565b6000613c9e613c9984614ece565b614e4c565b905082815260208101848484011115613cba57613cb96153af565b5b613cc584828561516c565b509392505050565b600081359050613cdc81615bc4565b92915050565b600081359050613cf181615bdb565b92915050565b600082601f830112613d0c57613d0b6153a5565b5b8135613d1c848260208601613bd9565b91505092915050565b600081359050613d3481615bf2565b92915050565b600081359050613d4981615c09565b92915050565b600081519050613d5e81615c09565b92915050565b600082601f830112613d7957613d786153a5565b5b8135613d89848260208601613c49565b91505092915050565b600082601f830112613da757613da66153a5565b5b8135613db7848260208601613c8b565b91505092915050565b600081359050613dcf81615c20565b92915050565b600060208284031215613deb57613dea6153b9565b5b6000613df984828501613ccd565b91505092915050565b600060208284031215613e1857613e176153b9565b5b6000613e2684828501613ce2565b91505092915050565b60008060408385031215613e4657613e456153b9565b5b6000613e5485828601613ccd565b9250506020613e6585828601613ccd565b9150509250929050565b600080600060608486031215613e8857613e876153b9565b5b6000613e9686828701613ccd565b9350506020613ea786828701613ccd565b9250506040613eb886828701613dc0565b9150509250925092565b60008060008060808587031215613edc57613edb6153b9565b5b6000613eea87828801613ccd565b9450506020613efb87828801613ccd565b9350506040613f0c87828801613dc0565b925050606085013567ffffffffffffffff811115613f2d57613f2c6153b4565b5b613f3987828801613d64565b91505092959194509250565b60008060408385031215613f5c57613f5b6153b9565b5b6000613f6a85828601613ccd565b9250506020613f7b85828601613d25565b9150509250929050565b60008060408385031215613f9c57613f9b6153b9565b5b6000613faa85828601613ccd565b9250506020613fbb85828601613dc0565b9150509250929050565b600060208284031215613fdb57613fda6153b9565b5b600082013567ffffffffffffffff811115613ff957613ff86153b4565b5b61400584828501613cf7565b91505092915050565b600060208284031215614024576140236153b9565b5b600061403284828501613d3a565b91505092915050565b600060208284031215614051576140506153b9565b5b600061405f84828501613d4f565b91505092915050565b60006020828403121561407e5761407d6153b9565b5b600082013567ffffffffffffffff81111561409c5761409b6153b4565b5b6140a884828501613d92565b91505092915050565b6000602082840312156140c7576140c66153b9565b5b60006140d584828501613dc0565b91505092915050565b600080604083850312156140f5576140f46153b9565b5b600061410385828601613dc0565b925050602061411485828601613ccd565b9150509250929050565b600080600060608486031215614137576141366153b9565b5b600061414586828701613dc0565b935050602061415686828701613dc0565b925050604061416786828701613dc0565b9150509250925092565b6000806000806080858703121561418b5761418a6153b9565b5b600061419987828801613dc0565b94505060206141aa87828801613dc0565b93505060406141bb87828801613dc0565b92505060606141cc87828801613dc0565b91505092959194509250565b60006141e483836148a0565b60208301905092915050565b6141f981615136565b82525050565b614208816150b0565b82525050565b600061421982614f24565b6142238185614f52565b935061422e83614eff565b8060005b8381101561425f57815161424688826141d8565b975061425183614f45565b925050600181019050614232565b5085935050505092915050565b614275816150d4565b82525050565b600061428682614f2f565b6142908185614f63565b93506142a081856020860161517b565b6142a9816153be565b840191505092915050565b60006142bf82614f3a565b6142c98185614f7f565b93506142d981856020860161517b565b6142e2816153be565b840191505092915050565b60006142f882614f3a565b6143028185614f90565b935061431281856020860161517b565b80840191505092915050565b6000815461432b816151ae565b6143358186614f7f565b94506001821660008114614350576001811461436257614395565b60ff1983168652602086019350614395565b61436b85614f0f565b60005b8381101561438d5781548189015260018201915060208101905061436e565b808801955050505b50505092915050565b600081546143ab816151ae565b6143b58186614f90565b945060018216600081146143d057600181146143e157614414565b60ff19831686528186019350614414565b6143ea85614f0f565b60005b8381101561440c578154818901526001820191506020810190506143ed565b838801955050505b50505092915050565b600061442a600e83614f7f565b9150614435826153cf565b602082019050919050565b600061444d600b83614f7f565b9150614458826153f8565b602082019050919050565b6000614470601883614f7f565b915061447b82615421565b602082019050919050565b6000614493602b83614f7f565b915061449e8261544a565b604082019050919050565b60006144b6603283614f7f565b91506144c182615499565b604082019050919050565b60006144d9602683614f7f565b91506144e4826154e8565b604082019050919050565b60006144fc601c83614f7f565b915061450782615537565b602082019050919050565b600061451f602683614f7f565b915061452a82615560565b604082019050919050565b6000614542602e83614f7f565b915061454d826155af565b604082019050919050565b6000614565602483614f7f565b9150614570826155fe565b604082019050919050565b6000614588601983614f7f565b91506145938261564d565b602082019050919050565b60006145ab603a83614f7f565b91506145b682615676565b604082019050919050565b60006145ce601d83614f7f565b91506145d9826156c5565b602082019050919050565b60006145f1602c83614f7f565b91506145fc826156ee565b604082019050919050565b6000614614602b83614f7f565b915061461f8261573d565b604082019050919050565b6000614637602b83614f7f565b91506146428261578c565b604082019050919050565b600061465a603883614f7f565b9150614665826157db565b604082019050919050565b600061467d602a83614f7f565b91506146888261582a565b604082019050919050565b60006146a0602983614f7f565b91506146ab82615879565b604082019050919050565b60006146c3600d83614f7f565b91506146ce826158c8565b602082019050919050565b60006146e6600f83614f7f565b91506146f1826158f1565b602082019050919050565b6000614709600a83614f7f565b91506147148261591a565b602082019050919050565b600061472c602083614f7f565b915061473782615943565b602082019050919050565b600061474f602c83614f7f565b915061475a8261596c565b604082019050919050565b6000614772602083614f7f565b915061477d826159bb565b602082019050919050565b6000614795602983614f7f565b91506147a0826159e4565b604082019050919050565b60006147b8602f83614f7f565b91506147c382615a33565b604082019050919050565b60006147db602183614f7f565b91506147e682615a82565b604082019050919050565b60006147fe601983614f7f565b915061480982615ad1565b602082019050919050565b6000614821601683614f7f565b915061482c82615afa565b602082019050919050565b6000614844600083614f74565b915061484f82615b23565b600082019050919050565b6000614867603183614f7f565b915061487282615b26565b604082019050919050565b600061488a602c83614f7f565b915061489582615b75565b604082019050919050565b6148a98161512c565b82525050565b6148b88161512c565b82525050565b60006148ca828561439e565b91506148d682846142ed565b91508190509392505050565b60006148ed82614837565b9150819050919050565b600060208201905061490c60008301846141ff565b92915050565b600060408201905061492760008301856141f0565b61493460208301846148af565b9392505050565b600060808201905061495060008301876141ff565b61495d60208301866141ff565b61496a60408301856148af565b818103606083015261497c818461427b565b905095945050505050565b600060408201905061499c60008301856141ff565b6149a960208301846148af565b9392505050565b600060208201905081810360008301526149ca818461420e565b905092915050565b60006020820190506149e7600083018461426c565b92915050565b60006020820190508181036000830152614a0781846142b4565b905092915050565b60006020820190508181036000830152614a29818461431e565b905092915050565b60006020820190508181036000830152614a4a8161441d565b9050919050565b60006020820190508181036000830152614a6a81614440565b9050919050565b60006020820190508181036000830152614a8a81614463565b9050919050565b60006020820190508181036000830152614aaa81614486565b9050919050565b60006020820190508181036000830152614aca816144a9565b9050919050565b60006020820190508181036000830152614aea816144cc565b9050919050565b60006020820190508181036000830152614b0a816144ef565b9050919050565b60006020820190508181036000830152614b2a81614512565b9050919050565b60006020820190508181036000830152614b4a81614535565b9050919050565b60006020820190508181036000830152614b6a81614558565b9050919050565b60006020820190508181036000830152614b8a8161457b565b9050919050565b60006020820190508181036000830152614baa8161459e565b9050919050565b60006020820190508181036000830152614bca816145c1565b9050919050565b60006020820190508181036000830152614bea816145e4565b9050919050565b60006020820190508181036000830152614c0a81614607565b9050919050565b60006020820190508181036000830152614c2a8161462a565b9050919050565b60006020820190508181036000830152614c4a8161464d565b9050919050565b60006020820190508181036000830152614c6a81614670565b9050919050565b60006020820190508181036000830152614c8a81614693565b9050919050565b60006020820190508181036000830152614caa816146b6565b9050919050565b60006020820190508181036000830152614cca816146d9565b9050919050565b60006020820190508181036000830152614cea816146fc565b9050919050565b60006020820190508181036000830152614d0a8161471f565b9050919050565b60006020820190508181036000830152614d2a81614742565b9050919050565b60006020820190508181036000830152614d4a81614765565b9050919050565b60006020820190508181036000830152614d6a81614788565b9050919050565b60006020820190508181036000830152614d8a816147ab565b9050919050565b60006020820190508181036000830152614daa816147ce565b9050919050565b60006020820190508181036000830152614dca816147f1565b9050919050565b60006020820190508181036000830152614dea81614814565b9050919050565b60006020820190508181036000830152614e0a8161485a565b9050919050565b60006020820190508181036000830152614e2a8161487d565b9050919050565b6000602082019050614e4660008301846148af565b92915050565b6000614e56614e67565b9050614e6282826151e0565b919050565b6000604051905090565b600067ffffffffffffffff821115614e8c57614e8b615376565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614eb857614eb7615376565b5b614ec1826153be565b9050602081019050919050565b600067ffffffffffffffff821115614ee957614ee8615376565b5b614ef2826153be565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fa68261512c565b9150614fb18361512c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fe657614fe561528b565b5b828201905092915050565b6000614ffc8261512c565b91506150078361512c565b925082615017576150166152ba565b5b828204905092915050565b600061502d8261512c565b91506150388361512c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150715761507061528b565b5b828202905092915050565b60006150878261512c565b91506150928361512c565b9250828210156150a5576150a461528b565b5b828203905092915050565b60006150bb8261510c565b9050919050565b60006150cd8261510c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061514182615148565b9050919050565b60006151538261515a565b9050919050565b60006151658261510c565b9050919050565b82818337600083830152505050565b60005b8381101561519957808201518184015260208101905061517e565b838111156151a8576000848401525b50505050565b600060028204905060018216806151c657607f821691505b602082108114156151da576151d96152e9565b5b50919050565b6151e9826153be565b810181811067ffffffffffffffff8211171561520857615207615376565b5b80604052505050565b600061521c8261512c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561524f5761524e61528b565b5b600182019050919050565b60006152658261512c565b91506152708361512c565b9250826152805761527f6152ba565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4578636565647320737570706c79000000000000000000000000000000000000600082015250565b7f53616c6520706175736564000000000000000000000000000000000000000000600082015250565b7f53616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f53706563696669656420737570706c79206973206c6f776572207468616e206360008201527f757272656e742062616c616e6365000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f53706563696669656420737570706c792069732067726561746572207468616e60008201527f206d617820737570706c79000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4f7264657220746f6f2062696700000000000000000000000000000000000000600082015250565b7f446f6e2774206265206772656564790000000000000000000000000000000000600082015250565b7f496e76616c696420494400000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b615bcd816150b0565b8114615bd857600080fd5b50565b615be4816150c2565b8114615bef57600080fd5b50565b615bfb816150d4565b8114615c0657600080fd5b50565b615c12816150e0565b8114615c1d57600080fd5b50565b615c298161512c565b8114615c3457600080fd5b5056fea26469706673582212207c6b0891c431ca63a07814f5872bfda180c8a5dbf7da43cd12651e447100d65f64736f6c63430008070033

Deployed Bytecode Sourcemap

58221:6001:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55703:40;55719:12;:10;:12::i;:::-;55733:9;55703:40;;;;;;;:::i;:::-;;;;;;;;58221:6001;;;;;39817:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26977:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28670:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28193:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62427:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40620:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56909:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58354:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29729:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58734:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58824:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58866:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40201:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58936:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58481:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58437:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61757:77;;;;;;;;;;;;;:::i;:::-;;62725:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55834:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30176:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60884:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58664:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40810:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61974:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58526:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26584:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62084:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26227:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9684:94;;;;;;;;;;;;;:::i;:::-;;58622:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61247:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56609:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9033:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62331:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27146:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56409:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58395:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58570:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59678:1198;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29050:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61574:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30432:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62916:638;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61842:124;;;;;;;;;;;;;:::i;:::-;;63920:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56205:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63562:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58778:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62559:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56019:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29448:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9933:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2006:98;2059:7;2086:10;2079:17;;2006:98;:::o;39817:300::-;39964:4;40021:35;40006:50;;;:11;:50;;;;:103;;;;40073:36;40097:11;40073:23;:36::i;:::-;40006:103;39986:123;;39817:300;;;:::o;26977:100::-;27031:13;27064:5;27057:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26977:100;:::o;28670:308::-;28791:7;28838:16;28846:7;28838;:16::i;:::-;28816:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28946:15;:24;28962:7;28946:24;;;;;;;;;;;;;;;;;;;;;28939:31;;28670:308;;;:::o;28193:411::-;28274:13;28290:23;28305:7;28290:14;:23::i;:::-;28274:39;;28338:5;28332:11;;:2;:11;;;;28324:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28432:5;28416:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28441:37;28458:5;28465:12;:10;:12::i;:::-;28441:16;:37::i;:::-;28416:62;28394:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28575:21;28584:2;28588:7;28575:8;:21::i;:::-;28263:341;28193:411;;:::o;62427:124::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62529:14:::1;62512;:31;;;;;;;;;;;;:::i;:::-;;62427:124:::0;:::o;40620:113::-;40681:7;40708:10;:17;;;;40701:24;;40620:113;:::o;56909:613::-;57004:1;56985:7;:16;56993:7;56985:16;;;;;;;;;;;;;;;;:20;56977:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;57061:21;57109:14;;57085:21;:38;;;;:::i;:::-;57061:62;;57134:15;57204:9;:18;57214:7;57204:18;;;;;;;;;;;;;;;;57189:12;;57169:7;:16;57177:7;57169:16;;;;;;;;;;;;;;;;57153:13;:32;;;;:::i;:::-;57152:49;;;;:::i;:::-;:70;;;;:::i;:::-;57134:88;;57254:1;57243:7;:12;;57235:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57358:7;57337:9;:18;57347:7;57337:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;57316:9;:18;57326:7;57316:18;;;;;;;;;;;;;;;:49;;;;57410:7;57393:14;;:24;;;;:::i;:::-;57376:14;:41;;;;57430:35;57448:7;57457;57430:17;:35::i;:::-;57481:33;57497:7;57506;57481:33;;;;;;;:::i;:::-;;;;;;;;56966:556;;56909:613;:::o;58354:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29729:376::-;29938:41;29957:12;:10;:12::i;:::-;29971:7;29938:18;:41::i;:::-;29916:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30069:28;30079:4;30085:2;30089:7;30069:9;:28::i;:::-;29729:376;;;:::o;58734:37::-;;;;:::o;58824:35::-;;;;:::o;58866:43::-;;;;:::o;40201:343::-;40343:7;40398:23;40415:5;40398:16;:23::i;:::-;40390:5;:31;40368:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;40510:12;:19;40523:5;40510:19;;;;;;;;;;;;;;;:26;40530:5;40510:26;;;;;;;;;;;;40503:33;;40201:343;;;;:::o;58936:37::-;;;;:::o;58481:36::-;;;;:::o;58437:37::-;;;;:::o;61757:77::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61820:6:::1;;;;;;;;;;;61819:7;61810:6;;:16;;;;;;;;;;;;;;;;;;61757:77::o:0;62725:183::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62815:6:::1;62810:91;62827:7;:14;62823:1;:18;62810:91;;;62888:1;62863:8;:22;62873:7;62881:1;62873:10;;;;;;;;:::i;:::-;;;;;;;;62863:22;;;;;;;;;;;;;;;:26;;;;62843:3;;;;:::i;:::-;;;62810:91;;;;62725:183:::0;:::o;55834:91::-;55878:7;55905:12;;55898:19;;55834:91;:::o;30176:185::-;30314:39;30331:4;30337:2;30341:7;30314:39;;;;;;;;;;;;:16;:39::i;:::-;30176:185;;;:::o;60884:342::-;60943:16;60972:18;60993:17;61003:6;60993:9;:17::i;:::-;60972:38;;61023:25;61065:10;61051:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61023:53;;61091:9;61087:106;61106:10;61102:1;:14;61087:106;;;61151:30;61171:6;61179:1;61151:19;:30::i;:::-;61137:8;61146:1;61137:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;61118:3;;;;;:::i;:::-;;;;61087:106;;;;61210:8;61203:15;;;;60884:342;;;:::o;58664:43::-;;;;:::o;40810:320::-;40930:7;40985:30;:28;:30::i;:::-;40977:5;:38;40955:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;41105:10;41116:5;41105:17;;;;;;;;:::i;:::-;;;;;;;;;;41098:24;;40810:320;;;:::o;61974:102::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62061:7:::1;62045:13;:23;;;;;;;;;;;;:::i;:::-;;61974:102:::0;:::o;58526:37::-;;;;;;;;;;;;;:::o;26584:326::-;26701:7;26726:13;26742:7;:16;26750:7;26742:16;;;;;;;;;;;;;;;;;;;;;26726:32;;26808:1;26791:19;;:5;:19;;;;26769:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26897:5;26890:12;;;26584:326;;;:::o;62084:192::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62170:13:::1;:11;:13::i;:::-;62158:9;:25;62150:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;62259:9;62246:10;:22;;;;62084:192:::0;:::o;26227:295::-;26344:7;26408:1;26391:19;;:5;:19;;;;26369:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26498:9;:16;26508:5;26498:16;;;;;;;;;;;;;;;;26491:23;;26227:295;;;:::o;9684:94::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9749:21:::1;9767:1;9749:9;:21::i;:::-;9684:94::o:0;58622:35::-;;;;:::o;61247:298::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61326:15:::1;61344:13;:11;:13::i;:::-;61326:31;;61399:10;;61387:8;61377:7;:18;;;;:::i;:::-;:32;;61368:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61446:9;61442:96;61461:8;61457:1;:12;61442:96;;;61491:35;61502:9;61523:1;61513:7;:11;;;;:::i;:::-;61491:9;:35::i;:::-;61471:3;;;;:::i;:::-;;;61442:96;;;;61315:230;61247:298:::0;;:::o;56609:100::-;56660:7;56687;56695:5;56687:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56680:21;;56609:100;;;:::o;9033:87::-;9079:7;9106:6;;;;;;;;;;;9099:13;;9033:87;:::o;62331:88::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62403:8:::1;62395:5;:16;;;;62331:88:::0;:::o;27146:104::-;27202:13;27235:7;27228:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27146:104;:::o;56409:109::-;56465:7;56492:9;:18;56502:7;56492:18;;;;;;;;;;;;;;;;56485:25;;56409:109;;;:::o;58395:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58570:43::-;;;;:::o;59678:1198::-;59746:6;;;;;;;;;;;59745:7;59736:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;59810:8;59802:5;;:16;;;;:::i;:::-;59789:9;:29;;59780:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;59886:15;59904:13;:11;:13::i;:::-;59886:31;;59951:10;;59932:15;:29;59928:831;;60009:13;;59987:8;:35;;59978:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;60087:10;;60075:8;60065:7;:18;;;;:::i;:::-;:32;;60056:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;60182:15;;60170:8;60144:23;60155:10;60144:9;:23::i;:::-;:34;;;;:::i;:::-;:53;;60135:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;59928:831;;;60287:13;;60268:15;:32;60264:495;;60348:16;;60326:8;:38;;60317:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;60429:14;;60417:8;60407:7;:18;;;;:::i;:::-;:36;;60398:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60623:18;;60611:8;60585:23;60596:10;60585:9;:23::i;:::-;:34;;;;:::i;:::-;:56;;60576:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;60264:495;;;60712:5;60703:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;60264:495;59928:831;60776:9;60771:98;60791:8;60787:1;:12;60771:98;;;60821:36;60832:10;60854:1;60844:7;:11;;;;:::i;:::-;60821:9;:36::i;:::-;60801:3;;;;:::i;:::-;;;60771:98;;;;59725:1151;59678:1198;:::o;29050:327::-;29197:12;:10;:12::i;:::-;29185:24;;:8;:24;;;;29177:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29297:8;29252:18;:32;29271:12;:10;:12::i;:::-;29252:32;;;;;;;;;;;;;;;:42;29285:8;29252:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29350:8;29321:48;;29336:12;:10;:12::i;:::-;29321:48;;;29360:8;29321:48;;;;;;:::i;:::-;;;;;;;;29050:327;;:::o;61574:175::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61675:5:::1;61657:23;;:14;;;;;;;;;;;:23;;;61649:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;61733:8;61718:12;:23;;;;;;;;;;;;:::i;:::-;;61574:175:::0;:::o;30432:365::-;30621:41;30640:12;:10;:12::i;:::-;30654:7;30621:18;:41::i;:::-;30599:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30750:39;30764:4;30770:2;30774:7;30783:5;30750:13;:39::i;:::-;30432:365;;;;:::o;62916:638::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63049:13:::1;:11;:13::i;:::-;63039:6;:23;;63030:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;63145:10;;63135:6;:20;;63126:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;63245:8;63225:16;;:28;63221:75;;63288:8;63269:16;:27;;;;63221:75;63330:5;63313:13;;:22;63309:63;;63367:5;63351:13;:21;;;;63309:63;63409:10;63389:16;;:30;63385:81;;63456:10;63435:18;:31;;;;63385:81;63501:6;63483:14;;:24;63479:67;;63540:6;63523:14;:23;;;;63479:67;62916:638:::0;;;;:::o;61842:124::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61911:4:::1;61893:14;;:22;;;;;;;;;;;;;;;;;;61931:27;61945:12;61931:27;;;;;;:::i;:::-;;;;;;;;61842:124::o:0;63920:299::-;63993:13;64027:16;64035:7;64027;:16::i;:::-;64019:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;64143:1;64119:13;64113:27;;;;;:::i;:::-;;;:31;:98;;;;;;;;;;;;;;;;;64171:13;64186:18;:7;:16;:18::i;:::-;64154:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64113:98;64106:105;;63920:299;;;:::o;56205:105::-;56259:7;56286;:16;56294:7;56286:16;;;;;;;;;;;;;;;;56279:23;;56205:105;;;:::o;63562:334::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63680:8:::1;63663:13;;:25;63659:69;;63720:8;63704:13;:24;;;;63659:69;63759:5;63745:10;;:19;63741:57;;63793:5;63780:10;:18;;;;63741:57;63834:10;63815:15;;:29;63811:77;;63878:10;63860:15;:28;;;;63811:77;63562:334:::0;;;:::o;58778:37::-;;;;:::o;62559:158::-;62611:13;62651;:11;:13::i;:::-;62645:3;:19;62637:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62697:12;62690:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62559:158;;;:::o;56019:95::-;56065:7;56092:14;;56085:21;;56019:95;:::o;29448:214::-;29590:4;29619:18;:25;29638:5;29619:25;;;;;;;;;;;;;;;:35;29645:8;29619:35;;;;;;;;;;;;;;;;;;;;;;;;;29612:42;;29448:214;;;;:::o;9933:229::-;9264:12;:10;:12::i;:::-;9253:23;;:7;:5;:7::i;:::-;:23;;;9245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10056:1:::1;10036:22;;:8;:22;;;;10014:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;10135:19;10145:8;10135:9;:19::i;:::-;9933:229:::0;:::o;25808:355::-;25955:4;26012:25;25997:40;;;:11;:40;;;;:105;;;;26069:33;26054:48;;;:11;:48;;;;25997:105;:158;;;;26119:36;26143:11;26119:23;:36::i;:::-;25997:158;25977:178;;25808:355;;;:::o;32344:127::-;32409:4;32461:1;32433:30;;:7;:16;32441:7;32433:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32426:37;;32344:127;;;:::o;36467:174::-;36569:2;36542:15;:24;36558:7;36542:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36625:7;36621:2;36587:46;;36596:23;36611:7;36596:14;:23::i;:::-;36587:46;;;;;;;;;;;;36467:174;;:::o;16550:391::-;16679:6;16654:21;:31;;16632:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;16756:12;16774:9;:14;;16796:6;16774:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16755:52;;;16840:7;16818:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;16621:320;16550:391;;:::o;32638:452::-;32767:4;32811:16;32819:7;32811;:16::i;:::-;32789:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32910:13;32926:23;32941:7;32926:14;:23::i;:::-;32910:39;;32979:5;32968:16;;:7;:16;;;:64;;;;33025:7;33001:31;;:20;33013:7;33001:11;:20::i;:::-;:31;;;32968:64;:113;;;;33049:32;33066:5;33073:7;33049:16;:32::i;:::-;32968:113;32960:122;;;32638:452;;;;:::o;35734:615::-;35907:4;35880:31;;:23;35895:7;35880:14;:23::i;:::-;:31;;;35858:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;36013:1;35999:16;;:2;:16;;;;35991:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36069:39;36090:4;36096:2;36100:7;36069:20;:39::i;:::-;36173:29;36190:1;36194:7;36173:8;:29::i;:::-;36234:1;36215:9;:15;36225:4;36215:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36263:1;36246:9;:13;36256:2;36246:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36294:2;36275:7;:16;36283:7;36275:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36333:7;36329:2;36314:27;;36323:4;36314:27;;;;;;;;;;;;35734:615;;;:::o;10170:173::-;10226:16;10245:6;;;;;;;;;;;10226:25;;10271:8;10262:6;;:17;;;;;;;;;;;;;;;;;;10326:8;10295:40;;10316:8;10295:40;;;;;;;;;;;;10215:128;10170:173;:::o;33432:110::-;33508:26;33518:2;33522:7;33508:26;;;;;;;;;;;;:9;:26::i;:::-;33432:110;;:::o;31679:352::-;31836:28;31846:4;31852:2;31856:7;31836:9;:28::i;:::-;31897:48;31920:4;31926:2;31930:7;31939:5;31897:22;:48::i;:::-;31875:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;31679:352;;;;:::o;12675:723::-;12731:13;12961:1;12952:5;:10;12948:53;;;12979:10;;;;;;;;;;;;;;;;;;;;;12948:53;13011:12;13026:5;13011:20;;13042:14;13067:78;13082:1;13074:4;:9;13067:78;;13100:8;;;;;:::i;:::-;;;;13131:2;13123:10;;;;;:::i;:::-;;;13067:78;;;13155:19;13187:6;13177:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13155:39;;13205:154;13221:1;13212:5;:10;13205:154;;13249:1;13239:11;;;;;:::i;:::-;;;13316:2;13308:5;:10;;;;:::i;:::-;13295:2;:24;;;;:::i;:::-;13282:39;;13265:6;13272;13265:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;13345:2;13336:11;;;;;:::i;:::-;;;13205:154;;;13383:6;13369:21;;;;;12675:723;;;;:::o;12154:207::-;12284:4;12328:25;12313:40;;;:11;:40;;;;12306:47;;12154:207;;;:::o;41743:589::-;41887:45;41914:4;41920:2;41924:7;41887:26;:45::i;:::-;41965:1;41949:18;;:4;:18;;;41945:187;;;41984:40;42016:7;41984:31;:40::i;:::-;41945:187;;;42054:2;42046:10;;:4;:10;;;42042:90;;42073:47;42106:4;42112:7;42073:32;:47::i;:::-;42042:90;41945:187;42160:1;42146:16;;:2;:16;;;42142:183;;;42179:45;42216:7;42179:36;:45::i;:::-;42142:183;;;42252:4;42246:10;;:2;:10;;;42242:83;;42273:40;42301:2;42305:7;42273:27;:40::i;:::-;42242:83;42142:183;41743:589;;;:::o;33769:321::-;33899:18;33905:2;33909:7;33899:5;:18::i;:::-;33950:54;33981:1;33985:2;33989:7;33998:5;33950:22;:54::i;:::-;33928:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33769:321;;;:::o;37206:984::-;37361:4;37382:15;:2;:13;;;:15::i;:::-;37378:805;;;37451:2;37435:36;;;37494:12;:10;:12::i;:::-;37529:4;37556:7;37586:5;37435:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37414:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37814:1;37797:6;:13;:18;37793:320;;;37840:108;;;;;;;;;;:::i;:::-;;;;;;;;37793:320;38063:6;38057:13;38048:6;38044:2;38040:15;38033:38;37414:714;37684:45;;;37674:55;;;:6;:55;;;;37667:62;;;;;37378:805;38167:4;38160:11;;37206:984;;;;;;;:::o;38762:126::-;;;;:::o;43055:164::-;43159:10;:17;;;;43132:15;:24;43148:7;43132:24;;;;;;;;;;;:44;;;;43187:10;43203:7;43187:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43055:164;:::o;43846:1002::-;44126:22;44176:1;44151:22;44168:4;44151:16;:22::i;:::-;:26;;;;:::i;:::-;44126:51;;44188:18;44209:17;:26;44227:7;44209:26;;;;;;;;;;;;44188:47;;44356:14;44342:10;:28;44338:328;;44387:19;44409:12;:18;44422:4;44409:18;;;;;;;;;;;;;;;:34;44428:14;44409:34;;;;;;;;;;;;44387:56;;44493:11;44460:12;:18;44473:4;44460:18;;;;;;;;;;;;;;;:30;44479:10;44460:30;;;;;;;;;;;:44;;;;44610:10;44577:17;:30;44595:11;44577:30;;;;;;;;;;;:43;;;;44372:294;44338:328;44762:17;:26;44780:7;44762:26;;;;;;;;;;;44755:33;;;44806:12;:18;44819:4;44806:18;;;;;;;;;;;;;;;:34;44825:14;44806:34;;;;;;;;;;;44799:41;;;43941:907;;43846:1002;;:::o;45143:1079::-;45396:22;45441:1;45421:10;:17;;;;:21;;;;:::i;:::-;45396:46;;45453:18;45474:15;:24;45490:7;45474:24;;;;;;;;;;;;45453:45;;45825:19;45847:10;45858:14;45847:26;;;;;;;;:::i;:::-;;;;;;;;;;45825:48;;45911:11;45886:10;45897;45886:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46022:10;45991:15;:28;46007:11;45991:28;;;;;;;;;;;:41;;;;46163:15;:24;46179:7;46163:24;;;;;;;;;;;46156:31;;;46198:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45214:1008;;;45143:1079;:::o;42633:221::-;42718:14;42735:20;42752:2;42735:16;:20::i;:::-;42718:37;;42793:7;42766:12;:16;42779:2;42766:16;;;;;;;;;;;;;;;:24;42783:6;42766:24;;;;;;;;;;;:34;;;;42840:6;42811:17;:26;42829:7;42811:26;;;;;;;;;;;:35;;;;42707:147;42633:221;;:::o;34426:382::-;34520:1;34506:16;;:2;:16;;;;34498:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34579:16;34587:7;34579;:16::i;:::-;34578:17;34570:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34641:45;34670:1;34674:2;34678:7;34641:20;:45::i;:::-;34716:1;34699:9;:13;34709:2;34699:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34747:2;34728:7;:16;34736:7;34728:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34792:7;34788:2;34767:33;;34784:1;34767:33;;;;;;;;;;;;34426:382;;:::o;15228:387::-;15288:4;15496:12;15563:7;15551:20;15543:28;;15606:1;15599:4;:8;15592:15;;;15228:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1731:155::-;1785:5;1823:6;1810:20;1801:29;;1839:41;1874:5;1839:41;:::i;:::-;1731:155;;;;:::o;1909:370::-;1980:5;2029:3;2022:4;2014:6;2010:17;2006:27;1996:122;;2037:79;;:::i;:::-;1996:122;2154:6;2141:20;2179:94;2269:3;2261:6;2254:4;2246:6;2242:17;2179:94;:::i;:::-;2170:103;;1986:293;1909:370;;;;:::o;2285:133::-;2328:5;2366:6;2353:20;2344:29;;2382:30;2406:5;2382:30;:::i;:::-;2285:133;;;;:::o;2424:137::-;2469:5;2507:6;2494:20;2485:29;;2523:32;2549:5;2523:32;:::i;:::-;2424:137;;;;:::o;2567:141::-;2623:5;2654:6;2648:13;2639:22;;2670:32;2696:5;2670:32;:::i;:::-;2567:141;;;;:::o;2727:338::-;2782:5;2831:3;2824:4;2816:6;2812:17;2808:27;2798:122;;2839:79;;:::i;:::-;2798:122;2956:6;2943:20;2981:78;3055:3;3047:6;3040:4;3032:6;3028:17;2981:78;:::i;:::-;2972:87;;2788:277;2727:338;;;;:::o;3085:340::-;3141:5;3190:3;3183:4;3175:6;3171:17;3167:27;3157:122;;3198:79;;:::i;:::-;3157:122;3315:6;3302:20;3340:79;3415:3;3407:6;3400:4;3392:6;3388:17;3340:79;:::i;:::-;3331:88;;3147:278;3085:340;;;;:::o;3431:139::-;3477:5;3515:6;3502:20;3493:29;;3531:33;3558:5;3531:33;:::i;:::-;3431:139;;;;:::o;3576:329::-;3635:6;3684:2;3672:9;3663:7;3659:23;3655:32;3652:119;;;3690:79;;:::i;:::-;3652:119;3810:1;3835:53;3880:7;3871:6;3860:9;3856:22;3835:53;:::i;:::-;3825:63;;3781:117;3576:329;;;;:::o;3911:345::-;3978:6;4027:2;4015:9;4006:7;4002:23;3998:32;3995:119;;;4033:79;;:::i;:::-;3995:119;4153:1;4178:61;4231:7;4222:6;4211:9;4207:22;4178:61;:::i;:::-;4168:71;;4124:125;3911:345;;;;:::o;4262:474::-;4330:6;4338;4387:2;4375:9;4366:7;4362:23;4358:32;4355:119;;;4393:79;;:::i;:::-;4355:119;4513:1;4538:53;4583:7;4574:6;4563:9;4559:22;4538:53;:::i;:::-;4528:63;;4484:117;4640:2;4666:53;4711:7;4702:6;4691:9;4687:22;4666:53;:::i;:::-;4656:63;;4611:118;4262:474;;;;;:::o;4742:619::-;4819:6;4827;4835;4884:2;4872:9;4863:7;4859:23;4855:32;4852:119;;;4890:79;;:::i;:::-;4852:119;5010:1;5035:53;5080:7;5071:6;5060:9;5056:22;5035:53;:::i;:::-;5025:63;;4981:117;5137:2;5163:53;5208:7;5199:6;5188:9;5184:22;5163:53;:::i;:::-;5153:63;;5108:118;5265:2;5291:53;5336:7;5327:6;5316:9;5312:22;5291:53;:::i;:::-;5281:63;;5236:118;4742:619;;;;;:::o;5367:943::-;5462:6;5470;5478;5486;5535:3;5523:9;5514:7;5510:23;5506:33;5503:120;;;5542:79;;:::i;:::-;5503:120;5662:1;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5633:117;5789:2;5815:53;5860:7;5851:6;5840:9;5836:22;5815:53;:::i;:::-;5805:63;;5760:118;5917:2;5943:53;5988:7;5979:6;5968:9;5964:22;5943:53;:::i;:::-;5933:63;;5888:118;6073:2;6062:9;6058:18;6045:32;6104:18;6096:6;6093:30;6090:117;;;6126:79;;:::i;:::-;6090:117;6231:62;6285:7;6276:6;6265:9;6261:22;6231:62;:::i;:::-;6221:72;;6016:287;5367:943;;;;;;;:::o;6316:468::-;6381:6;6389;6438:2;6426:9;6417:7;6413:23;6409:32;6406:119;;;6444:79;;:::i;:::-;6406:119;6564:1;6589:53;6634:7;6625:6;6614:9;6610:22;6589:53;:::i;:::-;6579:63;;6535:117;6691:2;6717:50;6759:7;6750:6;6739:9;6735:22;6717:50;:::i;:::-;6707:60;;6662:115;6316:468;;;;;:::o;6790:474::-;6858:6;6866;6915:2;6903:9;6894:7;6890:23;6886:32;6883:119;;;6921:79;;:::i;:::-;6883:119;7041:1;7066:53;7111:7;7102:6;7091:9;7087:22;7066:53;:::i;:::-;7056:63;;7012:117;7168:2;7194:53;7239:7;7230:6;7219:9;7215:22;7194:53;:::i;:::-;7184:63;;7139:118;6790:474;;;;;:::o;7270:539::-;7354:6;7403:2;7391:9;7382:7;7378:23;7374:32;7371:119;;;7409:79;;:::i;:::-;7371:119;7557:1;7546:9;7542:17;7529:31;7587:18;7579:6;7576:30;7573:117;;;7609:79;;:::i;:::-;7573:117;7714:78;7784:7;7775:6;7764:9;7760:22;7714:78;:::i;:::-;7704:88;;7500:302;7270:539;;;;:::o;7815:327::-;7873:6;7922:2;7910:9;7901:7;7897:23;7893:32;7890:119;;;7928:79;;:::i;:::-;7890:119;8048:1;8073:52;8117:7;8108:6;8097:9;8093:22;8073:52;:::i;:::-;8063:62;;8019:116;7815:327;;;;:::o;8148:349::-;8217:6;8266:2;8254:9;8245:7;8241:23;8237:32;8234:119;;;8272:79;;:::i;:::-;8234:119;8392:1;8417:63;8472:7;8463:6;8452:9;8448:22;8417:63;:::i;:::-;8407:73;;8363:127;8148:349;;;;:::o;8503:509::-;8572:6;8621:2;8609:9;8600:7;8596:23;8592:32;8589:119;;;8627:79;;:::i;:::-;8589:119;8775:1;8764:9;8760:17;8747:31;8805:18;8797:6;8794:30;8791:117;;;8827:79;;:::i;:::-;8791:117;8932:63;8987:7;8978:6;8967:9;8963:22;8932:63;:::i;:::-;8922:73;;8718:287;8503:509;;;;:::o;9018:329::-;9077:6;9126:2;9114:9;9105:7;9101:23;9097:32;9094:119;;;9132:79;;:::i;:::-;9094:119;9252:1;9277:53;9322:7;9313:6;9302:9;9298:22;9277:53;:::i;:::-;9267:63;;9223:117;9018:329;;;;:::o;9353:474::-;9421:6;9429;9478:2;9466:9;9457:7;9453:23;9449:32;9446:119;;;9484:79;;:::i;:::-;9446:119;9604:1;9629:53;9674:7;9665:6;9654:9;9650:22;9629:53;:::i;:::-;9619:63;;9575:117;9731:2;9757:53;9802:7;9793:6;9782:9;9778:22;9757:53;:::i;:::-;9747:63;;9702:118;9353:474;;;;;:::o;9833:619::-;9910:6;9918;9926;9975:2;9963:9;9954:7;9950:23;9946:32;9943:119;;;9981:79;;:::i;:::-;9943:119;10101:1;10126:53;10171:7;10162:6;10151:9;10147:22;10126:53;:::i;:::-;10116:63;;10072:117;10228:2;10254:53;10299:7;10290:6;10279:9;10275:22;10254:53;:::i;:::-;10244:63;;10199:118;10356:2;10382:53;10427:7;10418:6;10407:9;10403:22;10382:53;:::i;:::-;10372:63;;10327:118;9833:619;;;;;:::o;10458:765::-;10544:6;10552;10560;10568;10617:3;10605:9;10596:7;10592:23;10588:33;10585:120;;;10624:79;;:::i;:::-;10585:120;10744:1;10769:53;10814:7;10805:6;10794:9;10790:22;10769:53;:::i;:::-;10759:63;;10715:117;10871:2;10897:53;10942:7;10933:6;10922:9;10918:22;10897:53;:::i;:::-;10887:63;;10842:118;10999:2;11025:53;11070:7;11061:6;11050:9;11046:22;11025:53;:::i;:::-;11015:63;;10970:118;11127:2;11153:53;11198:7;11189:6;11178:9;11174:22;11153:53;:::i;:::-;11143:63;;11098:118;10458:765;;;;;;;:::o;11229:179::-;11298:10;11319:46;11361:3;11353:6;11319:46;:::i;:::-;11397:4;11392:3;11388:14;11374:28;;11229:179;;;;:::o;11414:147::-;11509:45;11548:5;11509:45;:::i;:::-;11504:3;11497:58;11414:147;;:::o;11567:118::-;11654:24;11672:5;11654:24;:::i;:::-;11649:3;11642:37;11567:118;;:::o;11721:732::-;11840:3;11869:54;11917:5;11869:54;:::i;:::-;11939:86;12018:6;12013:3;11939:86;:::i;:::-;11932:93;;12049:56;12099:5;12049:56;:::i;:::-;12128:7;12159:1;12144:284;12169:6;12166:1;12163:13;12144:284;;;12245:6;12239:13;12272:63;12331:3;12316:13;12272:63;:::i;:::-;12265:70;;12358:60;12411:6;12358:60;:::i;:::-;12348:70;;12204:224;12191:1;12188;12184:9;12179:14;;12144:284;;;12148:14;12444:3;12437:10;;11845:608;;;11721:732;;;;:::o;12459:109::-;12540:21;12555:5;12540:21;:::i;:::-;12535:3;12528:34;12459:109;;:::o;12574:360::-;12660:3;12688:38;12720:5;12688:38;:::i;:::-;12742:70;12805:6;12800:3;12742:70;:::i;:::-;12735:77;;12821:52;12866:6;12861:3;12854:4;12847:5;12843:16;12821:52;:::i;:::-;12898:29;12920:6;12898:29;:::i;:::-;12893:3;12889:39;12882:46;;12664:270;12574:360;;;;:::o;12940:364::-;13028:3;13056:39;13089:5;13056:39;:::i;:::-;13111:71;13175:6;13170:3;13111:71;:::i;:::-;13104:78;;13191:52;13236:6;13231:3;13224:4;13217:5;13213:16;13191:52;:::i;:::-;13268:29;13290:6;13268:29;:::i;:::-;13263:3;13259:39;13252:46;;13032:272;12940:364;;;;:::o;13310:377::-;13416:3;13444:39;13477:5;13444:39;:::i;:::-;13499:89;13581:6;13576:3;13499:89;:::i;:::-;13492:96;;13597:52;13642:6;13637:3;13630:4;13623:5;13619:16;13597:52;:::i;:::-;13674:6;13669:3;13665:16;13658:23;;13420:267;13310:377;;;;:::o;13717:802::-;13802:3;13839:5;13833:12;13868:36;13894:9;13868:36;:::i;:::-;13920:71;13984:6;13979:3;13920:71;:::i;:::-;13913:78;;14022:1;14011:9;14007:17;14038:1;14033:135;;;;14182:1;14177:336;;;;14000:513;;14033:135;14117:4;14113:9;14102;14098:25;14093:3;14086:38;14153:4;14148:3;14144:14;14137:21;;14033:135;;14177:336;14244:38;14276:5;14244:38;:::i;:::-;14304:1;14318:154;14332:6;14329:1;14326:13;14318:154;;;14406:7;14400:14;14396:1;14391:3;14387:11;14380:35;14456:1;14447:7;14443:15;14432:26;;14354:4;14351:1;14347:12;14342:17;;14318:154;;;14501:1;14496:3;14492:11;14485:18;;14184:329;;14000:513;;13806:713;;13717:802;;;;:::o;14549:845::-;14652:3;14689:5;14683:12;14718:36;14744:9;14718:36;:::i;:::-;14770:89;14852:6;14847:3;14770:89;:::i;:::-;14763:96;;14890:1;14879:9;14875:17;14906:1;14901:137;;;;15052:1;15047:341;;;;14868:520;;14901:137;14985:4;14981:9;14970;14966:25;14961:3;14954:38;15021:6;15016:3;15012:16;15005:23;;14901:137;;15047:341;15114:38;15146:5;15114:38;:::i;:::-;15174:1;15188:154;15202:6;15199:1;15196:13;15188:154;;;15276:7;15270:14;15266:1;15261:3;15257:11;15250:35;15326:1;15317:7;15313:15;15302:26;;15224:4;15221:1;15217:12;15212:17;;15188:154;;;15371:6;15366:3;15362:16;15355:23;;15054:334;;14868:520;;14656:738;;14549:845;;;;:::o;15400:366::-;15542:3;15563:67;15627:2;15622:3;15563:67;:::i;:::-;15556:74;;15639:93;15728:3;15639:93;:::i;:::-;15757:2;15752:3;15748:12;15741:19;;15400:366;;;:::o;15772:::-;15914:3;15935:67;15999:2;15994:3;15935:67;:::i;:::-;15928:74;;16011:93;16100:3;16011:93;:::i;:::-;16129:2;16124:3;16120:12;16113:19;;15772:366;;;:::o;16144:::-;16286:3;16307:67;16371:2;16366:3;16307:67;:::i;:::-;16300:74;;16383:93;16472:3;16383:93;:::i;:::-;16501:2;16496:3;16492:12;16485:19;;16144:366;;;:::o;16516:::-;16658:3;16679:67;16743:2;16738:3;16679:67;:::i;:::-;16672:74;;16755:93;16844:3;16755:93;:::i;:::-;16873:2;16868:3;16864:12;16857:19;;16516:366;;;:::o;16888:::-;17030:3;17051:67;17115:2;17110:3;17051:67;:::i;:::-;17044:74;;17127:93;17216:3;17127:93;:::i;:::-;17245:2;17240:3;17236:12;17229:19;;16888:366;;;:::o;17260:::-;17402:3;17423:67;17487:2;17482:3;17423:67;:::i;:::-;17416:74;;17499:93;17588:3;17499:93;:::i;:::-;17617:2;17612:3;17608:12;17601:19;;17260:366;;;:::o;17632:::-;17774:3;17795:67;17859:2;17854:3;17795:67;:::i;:::-;17788:74;;17871:93;17960:3;17871:93;:::i;:::-;17989:2;17984:3;17980:12;17973:19;;17632:366;;;:::o;18004:::-;18146:3;18167:67;18231:2;18226:3;18167:67;:::i;:::-;18160:74;;18243:93;18332:3;18243:93;:::i;:::-;18361:2;18356:3;18352:12;18345:19;;18004:366;;;:::o;18376:::-;18518:3;18539:67;18603:2;18598:3;18539:67;:::i;:::-;18532:74;;18615:93;18704:3;18615:93;:::i;:::-;18733:2;18728:3;18724:12;18717:19;;18376:366;;;:::o;18748:::-;18890:3;18911:67;18975:2;18970:3;18911:67;:::i;:::-;18904:74;;18987:93;19076:3;18987:93;:::i;:::-;19105:2;19100:3;19096:12;19089:19;;18748:366;;;:::o;19120:::-;19262:3;19283:67;19347:2;19342:3;19283:67;:::i;:::-;19276:74;;19359:93;19448:3;19359:93;:::i;:::-;19477:2;19472:3;19468:12;19461:19;;19120:366;;;:::o;19492:::-;19634:3;19655:67;19719:2;19714:3;19655:67;:::i;:::-;19648:74;;19731:93;19820:3;19731:93;:::i;:::-;19849:2;19844:3;19840:12;19833:19;;19492:366;;;:::o;19864:::-;20006:3;20027:67;20091:2;20086:3;20027:67;:::i;:::-;20020:74;;20103:93;20192:3;20103:93;:::i;:::-;20221:2;20216:3;20212:12;20205:19;;19864:366;;;:::o;20236:::-;20378:3;20399:67;20463:2;20458:3;20399:67;:::i;:::-;20392:74;;20475:93;20564:3;20475:93;:::i;:::-;20593:2;20588:3;20584:12;20577:19;;20236:366;;;:::o;20608:::-;20750:3;20771:67;20835:2;20830:3;20771:67;:::i;:::-;20764:74;;20847:93;20936:3;20847:93;:::i;:::-;20965:2;20960:3;20956:12;20949:19;;20608:366;;;:::o;20980:::-;21122:3;21143:67;21207:2;21202:3;21143:67;:::i;:::-;21136:74;;21219:93;21308:3;21219:93;:::i;:::-;21337:2;21332:3;21328:12;21321:19;;20980:366;;;:::o;21352:::-;21494:3;21515:67;21579:2;21574:3;21515:67;:::i;:::-;21508:74;;21591:93;21680:3;21591:93;:::i;:::-;21709:2;21704:3;21700:12;21693:19;;21352:366;;;:::o;21724:::-;21866:3;21887:67;21951:2;21946:3;21887:67;:::i;:::-;21880:74;;21963:93;22052:3;21963:93;:::i;:::-;22081:2;22076:3;22072:12;22065:19;;21724:366;;;:::o;22096:::-;22238:3;22259:67;22323:2;22318:3;22259:67;:::i;:::-;22252:74;;22335:93;22424:3;22335:93;:::i;:::-;22453:2;22448:3;22444:12;22437:19;;22096:366;;;:::o;22468:::-;22610:3;22631:67;22695:2;22690:3;22631:67;:::i;:::-;22624:74;;22707:93;22796:3;22707:93;:::i;:::-;22825:2;22820:3;22816:12;22809:19;;22468:366;;;:::o;22840:::-;22982:3;23003:67;23067:2;23062:3;23003:67;:::i;:::-;22996:74;;23079:93;23168:3;23079:93;:::i;:::-;23197:2;23192:3;23188:12;23181:19;;22840:366;;;:::o;23212:::-;23354:3;23375:67;23439:2;23434:3;23375:67;:::i;:::-;23368:74;;23451:93;23540:3;23451:93;:::i;:::-;23569:2;23564:3;23560:12;23553:19;;23212:366;;;:::o;23584:::-;23726:3;23747:67;23811:2;23806:3;23747:67;:::i;:::-;23740:74;;23823:93;23912:3;23823:93;:::i;:::-;23941:2;23936:3;23932:12;23925:19;;23584:366;;;:::o;23956:::-;24098:3;24119:67;24183:2;24178:3;24119:67;:::i;:::-;24112:74;;24195:93;24284:3;24195:93;:::i;:::-;24313:2;24308:3;24304:12;24297:19;;23956:366;;;:::o;24328:::-;24470:3;24491:67;24555:2;24550:3;24491:67;:::i;:::-;24484:74;;24567:93;24656:3;24567:93;:::i;:::-;24685:2;24680:3;24676:12;24669:19;;24328:366;;;:::o;24700:::-;24842:3;24863:67;24927:2;24922:3;24863:67;:::i;:::-;24856:74;;24939:93;25028:3;24939:93;:::i;:::-;25057:2;25052:3;25048:12;25041:19;;24700:366;;;:::o;25072:::-;25214:3;25235:67;25299:2;25294:3;25235:67;:::i;:::-;25228:74;;25311:93;25400:3;25311:93;:::i;:::-;25429:2;25424:3;25420:12;25413:19;;25072:366;;;:::o;25444:::-;25586:3;25607:67;25671:2;25666:3;25607:67;:::i;:::-;25600:74;;25683:93;25772:3;25683:93;:::i;:::-;25801:2;25796:3;25792:12;25785:19;;25444:366;;;:::o;25816:::-;25958:3;25979:67;26043:2;26038:3;25979:67;:::i;:::-;25972:74;;26055:93;26144:3;26055:93;:::i;:::-;26173:2;26168:3;26164:12;26157:19;;25816:366;;;:::o;26188:::-;26330:3;26351:67;26415:2;26410:3;26351:67;:::i;:::-;26344:74;;26427:93;26516:3;26427:93;:::i;:::-;26545:2;26540:3;26536:12;26529:19;;26188:366;;;:::o;26560:398::-;26719:3;26740:83;26821:1;26816:3;26740:83;:::i;:::-;26733:90;;26832:93;26921:3;26832:93;:::i;:::-;26950:1;26945:3;26941:11;26934:18;;26560:398;;;:::o;26964:366::-;27106:3;27127:67;27191:2;27186:3;27127:67;:::i;:::-;27120:74;;27203:93;27292:3;27203:93;:::i;:::-;27321:2;27316:3;27312:12;27305:19;;26964:366;;;:::o;27336:::-;27478:3;27499:67;27563:2;27558:3;27499:67;:::i;:::-;27492:74;;27575:93;27664:3;27575:93;:::i;:::-;27693:2;27688:3;27684:12;27677:19;;27336:366;;;:::o;27708:108::-;27785:24;27803:5;27785:24;:::i;:::-;27780:3;27773:37;27708:108;;:::o;27822:118::-;27909:24;27927:5;27909:24;:::i;:::-;27904:3;27897:37;27822:118;;:::o;27946:429::-;28123:3;28145:92;28233:3;28224:6;28145:92;:::i;:::-;28138:99;;28254:95;28345:3;28336:6;28254:95;:::i;:::-;28247:102;;28366:3;28359:10;;27946:429;;;;;:::o;28381:379::-;28565:3;28587:147;28730:3;28587:147;:::i;:::-;28580:154;;28751:3;28744:10;;28381:379;;;:::o;28766:222::-;28859:4;28897:2;28886:9;28882:18;28874:26;;28910:71;28978:1;28967:9;28963:17;28954:6;28910:71;:::i;:::-;28766:222;;;;:::o;28994:348::-;29123:4;29161:2;29150:9;29146:18;29138:26;;29174:79;29250:1;29239:9;29235:17;29226:6;29174:79;:::i;:::-;29263:72;29331:2;29320:9;29316:18;29307:6;29263:72;:::i;:::-;28994:348;;;;;:::o;29348:640::-;29543:4;29581:3;29570:9;29566:19;29558:27;;29595:71;29663:1;29652:9;29648:17;29639:6;29595:71;:::i;:::-;29676:72;29744:2;29733:9;29729:18;29720:6;29676:72;:::i;:::-;29758;29826:2;29815:9;29811:18;29802:6;29758:72;:::i;:::-;29877:9;29871:4;29867:20;29862:2;29851:9;29847:18;29840:48;29905:76;29976:4;29967:6;29905:76;:::i;:::-;29897:84;;29348:640;;;;;;;:::o;29994:332::-;30115:4;30153:2;30142:9;30138:18;30130:26;;30166:71;30234:1;30223:9;30219:17;30210:6;30166:71;:::i;:::-;30247:72;30315:2;30304:9;30300:18;30291:6;30247:72;:::i;:::-;29994:332;;;;;:::o;30332:373::-;30475:4;30513:2;30502:9;30498:18;30490:26;;30562:9;30556:4;30552:20;30548:1;30537:9;30533:17;30526:47;30590:108;30693:4;30684:6;30590:108;:::i;:::-;30582:116;;30332:373;;;;:::o;30711:210::-;30798:4;30836:2;30825:9;30821:18;30813:26;;30849:65;30911:1;30900:9;30896:17;30887:6;30849:65;:::i;:::-;30711:210;;;;:::o;30927:313::-;31040:4;31078:2;31067:9;31063:18;31055:26;;31127:9;31121:4;31117:20;31113:1;31102:9;31098:17;31091:47;31155:78;31228:4;31219:6;31155:78;:::i;:::-;31147:86;;30927:313;;;;:::o;31246:307::-;31356:4;31394:2;31383:9;31379:18;31371:26;;31443:9;31437:4;31433:20;31429:1;31418:9;31414:17;31407:47;31471:75;31541:4;31532:6;31471:75;:::i;:::-;31463:83;;31246:307;;;;:::o;31559:419::-;31725:4;31763:2;31752:9;31748:18;31740:26;;31812:9;31806:4;31802:20;31798:1;31787:9;31783:17;31776:47;31840:131;31966:4;31840:131;:::i;:::-;31832:139;;31559:419;;;:::o;31984:::-;32150:4;32188:2;32177:9;32173:18;32165:26;;32237:9;32231:4;32227:20;32223:1;32212:9;32208:17;32201:47;32265:131;32391:4;32265:131;:::i;:::-;32257:139;;31984:419;;;:::o;32409:::-;32575:4;32613:2;32602:9;32598:18;32590:26;;32662:9;32656:4;32652:20;32648:1;32637:9;32633:17;32626:47;32690:131;32816:4;32690:131;:::i;:::-;32682:139;;32409:419;;;:::o;32834:::-;33000:4;33038:2;33027:9;33023:18;33015:26;;33087:9;33081:4;33077:20;33073:1;33062:9;33058:17;33051:47;33115:131;33241:4;33115:131;:::i;:::-;33107:139;;32834:419;;;:::o;33259:::-;33425:4;33463:2;33452:9;33448:18;33440:26;;33512:9;33506:4;33502:20;33498:1;33487:9;33483:17;33476:47;33540:131;33666:4;33540:131;:::i;:::-;33532:139;;33259:419;;;:::o;33684:::-;33850:4;33888:2;33877:9;33873:18;33865:26;;33937:9;33931:4;33927:20;33923:1;33912:9;33908:17;33901:47;33965:131;34091:4;33965:131;:::i;:::-;33957:139;;33684:419;;;:::o;34109:::-;34275:4;34313:2;34302:9;34298:18;34290:26;;34362:9;34356:4;34352:20;34348:1;34337:9;34333:17;34326:47;34390:131;34516:4;34390:131;:::i;:::-;34382:139;;34109:419;;;:::o;34534:::-;34700:4;34738:2;34727:9;34723:18;34715:26;;34787:9;34781:4;34777:20;34773:1;34762:9;34758:17;34751:47;34815:131;34941:4;34815:131;:::i;:::-;34807:139;;34534:419;;;:::o;34959:::-;35125:4;35163:2;35152:9;35148:18;35140:26;;35212:9;35206:4;35202:20;35198:1;35187:9;35183:17;35176:47;35240:131;35366:4;35240:131;:::i;:::-;35232:139;;34959:419;;;:::o;35384:::-;35550:4;35588:2;35577:9;35573:18;35565:26;;35637:9;35631:4;35627:20;35623:1;35612:9;35608:17;35601:47;35665:131;35791:4;35665:131;:::i;:::-;35657:139;;35384:419;;;:::o;35809:::-;35975:4;36013:2;36002:9;35998:18;35990:26;;36062:9;36056:4;36052:20;36048:1;36037:9;36033:17;36026:47;36090:131;36216:4;36090:131;:::i;:::-;36082:139;;35809:419;;;:::o;36234:::-;36400:4;36438:2;36427:9;36423:18;36415:26;;36487:9;36481:4;36477:20;36473:1;36462:9;36458:17;36451:47;36515:131;36641:4;36515:131;:::i;:::-;36507:139;;36234:419;;;:::o;36659:::-;36825:4;36863:2;36852:9;36848:18;36840:26;;36912:9;36906:4;36902:20;36898:1;36887:9;36883:17;36876:47;36940:131;37066:4;36940:131;:::i;:::-;36932:139;;36659:419;;;:::o;37084:::-;37250:4;37288:2;37277:9;37273:18;37265:26;;37337:9;37331:4;37327:20;37323:1;37312:9;37308:17;37301:47;37365:131;37491:4;37365:131;:::i;:::-;37357:139;;37084:419;;;:::o;37509:::-;37675:4;37713:2;37702:9;37698:18;37690:26;;37762:9;37756:4;37752:20;37748:1;37737:9;37733:17;37726:47;37790:131;37916:4;37790:131;:::i;:::-;37782:139;;37509:419;;;:::o;37934:::-;38100:4;38138:2;38127:9;38123:18;38115:26;;38187:9;38181:4;38177:20;38173:1;38162:9;38158:17;38151:47;38215:131;38341:4;38215:131;:::i;:::-;38207:139;;37934:419;;;:::o;38359:::-;38525:4;38563:2;38552:9;38548:18;38540:26;;38612:9;38606:4;38602:20;38598:1;38587:9;38583:17;38576:47;38640:131;38766:4;38640:131;:::i;:::-;38632:139;;38359:419;;;:::o;38784:::-;38950:4;38988:2;38977:9;38973:18;38965:26;;39037:9;39031:4;39027:20;39023:1;39012:9;39008:17;39001:47;39065:131;39191:4;39065:131;:::i;:::-;39057:139;;38784:419;;;:::o;39209:::-;39375:4;39413:2;39402:9;39398:18;39390:26;;39462:9;39456:4;39452:20;39448:1;39437:9;39433:17;39426:47;39490:131;39616:4;39490:131;:::i;:::-;39482:139;;39209:419;;;:::o;39634:::-;39800:4;39838:2;39827:9;39823:18;39815:26;;39887:9;39881:4;39877:20;39873:1;39862:9;39858:17;39851:47;39915:131;40041:4;39915:131;:::i;:::-;39907:139;;39634:419;;;:::o;40059:::-;40225:4;40263:2;40252:9;40248:18;40240:26;;40312:9;40306:4;40302:20;40298:1;40287:9;40283:17;40276:47;40340:131;40466:4;40340:131;:::i;:::-;40332:139;;40059:419;;;:::o;40484:::-;40650:4;40688:2;40677:9;40673:18;40665:26;;40737:9;40731:4;40727:20;40723:1;40712:9;40708:17;40701:47;40765:131;40891:4;40765:131;:::i;:::-;40757:139;;40484:419;;;:::o;40909:::-;41075:4;41113:2;41102:9;41098:18;41090:26;;41162:9;41156:4;41152:20;41148:1;41137:9;41133:17;41126:47;41190:131;41316:4;41190:131;:::i;:::-;41182:139;;40909:419;;;:::o;41334:::-;41500:4;41538:2;41527:9;41523:18;41515:26;;41587:9;41581:4;41577:20;41573:1;41562:9;41558:17;41551:47;41615:131;41741:4;41615:131;:::i;:::-;41607:139;;41334:419;;;:::o;41759:::-;41925:4;41963:2;41952:9;41948:18;41940:26;;42012:9;42006:4;42002:20;41998:1;41987:9;41983:17;41976:47;42040:131;42166:4;42040:131;:::i;:::-;42032:139;;41759:419;;;:::o;42184:::-;42350:4;42388:2;42377:9;42373:18;42365:26;;42437:9;42431:4;42427:20;42423:1;42412:9;42408:17;42401:47;42465:131;42591:4;42465:131;:::i;:::-;42457:139;;42184:419;;;:::o;42609:::-;42775:4;42813:2;42802:9;42798:18;42790:26;;42862:9;42856:4;42852:20;42848:1;42837:9;42833:17;42826:47;42890:131;43016:4;42890:131;:::i;:::-;42882:139;;42609:419;;;:::o;43034:::-;43200:4;43238:2;43227:9;43223:18;43215:26;;43287:9;43281:4;43277:20;43273:1;43262:9;43258:17;43251:47;43315:131;43441:4;43315:131;:::i;:::-;43307:139;;43034:419;;;:::o;43459:::-;43625:4;43663:2;43652:9;43648:18;43640:26;;43712:9;43706:4;43702:20;43698:1;43687:9;43683:17;43676:47;43740:131;43866:4;43740:131;:::i;:::-;43732:139;;43459:419;;;:::o;43884:::-;44050:4;44088:2;44077:9;44073:18;44065:26;;44137:9;44131:4;44127:20;44123:1;44112:9;44108:17;44101:47;44165:131;44291:4;44165:131;:::i;:::-;44157:139;;43884:419;;;:::o;44309:::-;44475:4;44513:2;44502:9;44498:18;44490:26;;44562:9;44556:4;44552:20;44548:1;44537:9;44533:17;44526:47;44590:131;44716:4;44590:131;:::i;:::-;44582:139;;44309:419;;;:::o;44734:::-;44900:4;44938:2;44927:9;44923:18;44915:26;;44987:9;44981:4;44977:20;44973:1;44962:9;44958:17;44951:47;45015:131;45141:4;45015:131;:::i;:::-;45007:139;;44734:419;;;:::o;45159:222::-;45252:4;45290:2;45279:9;45275:18;45267:26;;45303:71;45371:1;45360:9;45356:17;45347:6;45303:71;:::i;:::-;45159:222;;;;:::o;45387:129::-;45421:6;45448:20;;:::i;:::-;45438:30;;45477:33;45505:4;45497:6;45477:33;:::i;:::-;45387:129;;;:::o;45522:75::-;45555:6;45588:2;45582:9;45572:19;;45522:75;:::o;45603:311::-;45680:4;45770:18;45762:6;45759:30;45756:56;;;45792:18;;:::i;:::-;45756:56;45842:4;45834:6;45830:17;45822:25;;45902:4;45896;45892:15;45884:23;;45603:311;;;:::o;45920:307::-;45981:4;46071:18;46063:6;46060:30;46057:56;;;46093:18;;:::i;:::-;46057:56;46131:29;46153:6;46131:29;:::i;:::-;46123:37;;46215:4;46209;46205:15;46197:23;;45920:307;;;:::o;46233:308::-;46295:4;46385:18;46377:6;46374:30;46371:56;;;46407:18;;:::i;:::-;46371:56;46445:29;46467:6;46445:29;:::i;:::-;46437:37;;46529:4;46523;46519:15;46511:23;;46233:308;;;:::o;46547:132::-;46614:4;46637:3;46629:11;;46667:4;46662:3;46658:14;46650:22;;46547:132;;;:::o;46685:141::-;46734:4;46757:3;46749:11;;46780:3;46777:1;46770:14;46814:4;46811:1;46801:18;46793:26;;46685:141;;;:::o;46832:114::-;46899:6;46933:5;46927:12;46917:22;;46832:114;;;:::o;46952:98::-;47003:6;47037:5;47031:12;47021:22;;46952:98;;;:::o;47056:99::-;47108:6;47142:5;47136:12;47126:22;;47056:99;;;:::o;47161:113::-;47231:4;47263;47258:3;47254:14;47246:22;;47161:113;;;:::o;47280:184::-;47379:11;47413:6;47408:3;47401:19;47453:4;47448:3;47444:14;47429:29;;47280:184;;;;:::o;47470:168::-;47553:11;47587:6;47582:3;47575:19;47627:4;47622:3;47618:14;47603:29;;47470:168;;;;:::o;47644:147::-;47745:11;47782:3;47767:18;;47644:147;;;;:::o;47797:169::-;47881:11;47915:6;47910:3;47903:19;47955:4;47950:3;47946:14;47931:29;;47797:169;;;;:::o;47972:148::-;48074:11;48111:3;48096:18;;47972:148;;;;:::o;48126:305::-;48166:3;48185:20;48203:1;48185:20;:::i;:::-;48180:25;;48219:20;48237:1;48219:20;:::i;:::-;48214:25;;48373:1;48305:66;48301:74;48298:1;48295:81;48292:107;;;48379:18;;:::i;:::-;48292:107;48423:1;48420;48416:9;48409:16;;48126:305;;;;:::o;48437:185::-;48477:1;48494:20;48512:1;48494:20;:::i;:::-;48489:25;;48528:20;48546:1;48528:20;:::i;:::-;48523:25;;48567:1;48557:35;;48572:18;;:::i;:::-;48557:35;48614:1;48611;48607:9;48602:14;;48437:185;;;;:::o;48628:348::-;48668:7;48691:20;48709:1;48691:20;:::i;:::-;48686:25;;48725:20;48743:1;48725:20;:::i;:::-;48720:25;;48913:1;48845:66;48841:74;48838:1;48835:81;48830:1;48823:9;48816:17;48812:105;48809:131;;;48920:18;;:::i;:::-;48809:131;48968:1;48965;48961:9;48950:20;;48628:348;;;;:::o;48982:191::-;49022:4;49042:20;49060:1;49042:20;:::i;:::-;49037:25;;49076:20;49094:1;49076:20;:::i;:::-;49071:25;;49115:1;49112;49109:8;49106:34;;;49120:18;;:::i;:::-;49106:34;49165:1;49162;49158:9;49150:17;;48982:191;;;;:::o;49179:96::-;49216:7;49245:24;49263:5;49245:24;:::i;:::-;49234:35;;49179:96;;;:::o;49281:104::-;49326:7;49355:24;49373:5;49355:24;:::i;:::-;49344:35;;49281:104;;;:::o;49391:90::-;49425:7;49468:5;49461:13;49454:21;49443:32;;49391:90;;;:::o;49487:149::-;49523:7;49563:66;49556:5;49552:78;49541:89;;49487:149;;;:::o;49642:126::-;49679:7;49719:42;49712:5;49708:54;49697:65;;49642:126;;;:::o;49774:77::-;49811:7;49840:5;49829:16;;49774:77;;;:::o;49857:134::-;49915:9;49948:37;49979:5;49948:37;:::i;:::-;49935:50;;49857:134;;;:::o;49997:126::-;50047:9;50080:37;50111:5;50080:37;:::i;:::-;50067:50;;49997:126;;;:::o;50129:113::-;50179:9;50212:24;50230:5;50212:24;:::i;:::-;50199:37;;50129:113;;;:::o;50248:154::-;50332:6;50327:3;50322;50309:30;50394:1;50385:6;50380:3;50376:16;50369:27;50248:154;;;:::o;50408:307::-;50476:1;50486:113;50500:6;50497:1;50494:13;50486:113;;;50585:1;50580:3;50576:11;50570:18;50566:1;50561:3;50557:11;50550:39;50522:2;50519:1;50515:10;50510:15;;50486:113;;;50617:6;50614:1;50611:13;50608:101;;;50697:1;50688:6;50683:3;50679:16;50672:27;50608:101;50457:258;50408:307;;;:::o;50721:320::-;50765:6;50802:1;50796:4;50792:12;50782:22;;50849:1;50843:4;50839:12;50870:18;50860:81;;50926:4;50918:6;50914:17;50904:27;;50860:81;50988:2;50980:6;50977:14;50957:18;50954:38;50951:84;;;51007:18;;:::i;:::-;50951:84;50772:269;50721:320;;;:::o;51047:281::-;51130:27;51152:4;51130:27;:::i;:::-;51122:6;51118:40;51260:6;51248:10;51245:22;51224:18;51212:10;51209:34;51206:62;51203:88;;;51271:18;;:::i;:::-;51203:88;51311:10;51307:2;51300:22;51090:238;51047:281;;:::o;51334:233::-;51373:3;51396:24;51414:5;51396:24;:::i;:::-;51387:33;;51442:66;51435:5;51432:77;51429:103;;;51512:18;;:::i;:::-;51429:103;51559:1;51552:5;51548:13;51541:20;;51334:233;;;:::o;51573:176::-;51605:1;51622:20;51640:1;51622:20;:::i;:::-;51617:25;;51656:20;51674:1;51656:20;:::i;:::-;51651:25;;51695:1;51685:35;;51700:18;;:::i;:::-;51685:35;51741:1;51738;51734:9;51729:14;;51573:176;;;;:::o;51755:180::-;51803:77;51800:1;51793:88;51900:4;51897:1;51890:15;51924:4;51921:1;51914:15;51941:180;51989:77;51986:1;51979:88;52086:4;52083:1;52076:15;52110:4;52107:1;52100:15;52127:180;52175:77;52172:1;52165:88;52272:4;52269:1;52262:15;52296:4;52293:1;52286:15;52313:180;52361:77;52358:1;52351:88;52458:4;52455:1;52448:15;52482:4;52479:1;52472:15;52499:180;52547:77;52544:1;52537:88;52644:4;52641:1;52634:15;52668:4;52665:1;52658:15;52685:180;52733:77;52730:1;52723:88;52830:4;52827:1;52820:15;52854:4;52851:1;52844:15;52871:117;52980:1;52977;52970:12;52994:117;53103:1;53100;53093:12;53117:117;53226:1;53223;53216:12;53240:117;53349:1;53346;53339:12;53363:117;53472:1;53469;53462:12;53486:102;53527:6;53578:2;53574:7;53569:2;53562:5;53558:14;53554:28;53544:38;;53486:102;;;:::o;53594:164::-;53734:16;53730:1;53722:6;53718:14;53711:40;53594:164;:::o;53764:161::-;53904:13;53900:1;53892:6;53888:14;53881:37;53764:161;:::o;53931:174::-;54071:26;54067:1;54059:6;54055:14;54048:50;53931:174;:::o;54111:230::-;54251:34;54247:1;54239:6;54235:14;54228:58;54320:13;54315:2;54307:6;54303:15;54296:38;54111:230;:::o;54347:237::-;54487:34;54483:1;54475:6;54471:14;54464:58;54556:20;54551:2;54543:6;54539:15;54532:45;54347:237;:::o;54590:225::-;54730:34;54726:1;54718:6;54714:14;54707:58;54799:8;54794:2;54786:6;54782:15;54775:33;54590:225;:::o;54821:178::-;54961:30;54957:1;54949:6;54945:14;54938:54;54821:178;:::o;55005:225::-;55145:34;55141:1;55133:6;55129:14;55122:58;55214:8;55209:2;55201:6;55197:15;55190:33;55005:225;:::o;55236:233::-;55376:34;55372:1;55364:6;55360:14;55353:58;55445:16;55440:2;55432:6;55428:15;55421:41;55236:233;:::o;55475:223::-;55615:34;55611:1;55603:6;55599:14;55592:58;55684:6;55679:2;55671:6;55667:15;55660:31;55475:223;:::o;55704:175::-;55844:27;55840:1;55832:6;55828:14;55821:51;55704:175;:::o;55885:245::-;56025:34;56021:1;56013:6;56009:14;56002:58;56094:28;56089:2;56081:6;56077:15;56070:53;55885:245;:::o;56136:179::-;56276:31;56272:1;56264:6;56260:14;56253:55;56136:179;:::o;56321:231::-;56461:34;56457:1;56449:6;56445:14;56438:58;56530:14;56525:2;56517:6;56513:15;56506:39;56321:231;:::o;56558:230::-;56698:34;56694:1;56686:6;56682:14;56675:58;56767:13;56762:2;56754:6;56750:15;56743:38;56558:230;:::o;56794:::-;56934:34;56930:1;56922:6;56918:14;56911:58;57003:13;56998:2;56990:6;56986:15;56979:38;56794:230;:::o;57030:243::-;57170:34;57166:1;57158:6;57154:14;57147:58;57239:26;57234:2;57226:6;57222:15;57215:51;57030:243;:::o;57279:229::-;57419:34;57415:1;57407:6;57403:14;57396:58;57488:12;57483:2;57475:6;57471:15;57464:37;57279:229;:::o;57514:228::-;57654:34;57650:1;57642:6;57638:14;57631:58;57723:11;57718:2;57710:6;57706:15;57699:36;57514:228;:::o;57748:163::-;57888:15;57884:1;57876:6;57872:14;57865:39;57748:163;:::o;57917:165::-;58057:17;58053:1;58045:6;58041:14;58034:41;57917:165;:::o;58088:160::-;58228:12;58224:1;58216:6;58212:14;58205:36;58088:160;:::o;58254:182::-;58394:34;58390:1;58382:6;58378:14;58371:58;58254:182;:::o;58442:231::-;58582:34;58578:1;58570:6;58566:14;58559:58;58651:14;58646:2;58638:6;58634:15;58627:39;58442:231;:::o;58679:182::-;58819:34;58815:1;58807:6;58803:14;58796:58;58679:182;:::o;58867:228::-;59007:34;59003:1;58995:6;58991:14;58984:58;59076:11;59071:2;59063:6;59059:15;59052:36;58867:228;:::o;59101:234::-;59241:34;59237:1;59229:6;59225:14;59218:58;59310:17;59305:2;59297:6;59293:15;59286:42;59101:234;:::o;59341:220::-;59481:34;59477:1;59469:6;59465:14;59458:58;59550:3;59545:2;59537:6;59533:15;59526:28;59341:220;:::o;59567:175::-;59707:27;59703:1;59695:6;59691:14;59684:51;59567:175;:::o;59748:172::-;59888:24;59884:1;59876:6;59872:14;59865:48;59748:172;:::o;59926:114::-;;:::o;60046:236::-;60186:34;60182:1;60174:6;60170:14;60163:58;60255:19;60250:2;60242:6;60238:15;60231:44;60046:236;:::o;60288:231::-;60428:34;60424:1;60416:6;60412:14;60405:58;60497:14;60492:2;60484:6;60480:15;60473:39;60288:231;:::o;60525:122::-;60598:24;60616:5;60598:24;:::i;:::-;60591:5;60588:35;60578:63;;60637:1;60634;60627:12;60578:63;60525:122;:::o;60653:138::-;60734:32;60760:5;60734:32;:::i;:::-;60727:5;60724:43;60714:71;;60781:1;60778;60771:12;60714:71;60653:138;:::o;60797:116::-;60867:21;60882:5;60867:21;:::i;:::-;60860:5;60857:32;60847:60;;60903:1;60900;60893:12;60847:60;60797:116;:::o;60919:120::-;60991:23;61008:5;60991:23;:::i;:::-;60984:5;60981:34;60971:62;;61029:1;61026;61019:12;60971:62;60919:120;:::o;61045:122::-;61118:24;61136:5;61118:24;:::i;:::-;61111:5;61108:35;61098:63;;61157:1;61154;61147:12;61098:63;61045:122;:::o

Swarm Source

ipfs://7c6b0891c431ca63a07814f5872bfda180c8a5dbf7da43cd12651e447100d65f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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