ETH Price: $3,642.72 (+1.76%)

Token

Boring Security (BoringSEC)
 

Overview

Max Total Supply

3,500 BoringSEC

Holders

1,951

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
marenostrumio.eth
0x7e3b29f2eaafa9008a2c60a2e107a0e6487a7628
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Boring Security is a token to educate people on what they can do to remain safe in the ever-evolving web3 space.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BoringSecurity

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


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

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







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

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

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

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

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

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

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

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

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

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

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

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

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

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

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

        address operator = _msgSender();

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

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

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

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

        address operator = _msgSender();

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

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

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

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

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

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

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

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

        return array;
    }
}

// File: contracts/BoringSec.sol

//SPDX-License-Identifier: MIT
//                ██████   ██████  ██████  ██ ███    ██  ██████      ███████ ███████  ██████ ██    ██ ██████  ██ ████████ ██    ██ 
//                ██   ██ ██    ██ ██   ██ ██ ████   ██ ██           ██      ██      ██      ██    ██ ██   ██ ██    ██     ██  ██
//                ██████  ██    ██ ██████  ██ ██ ██  ██ ██   ███     ███████ █████   ██      ██    ██ ██████  ██    ██      ████
//                ██   ██ ██    ██ ██   ██ ██ ██  ██ ██ ██    ██          ██ ██      ██      ██    ██ ██   ██ ██    ██       ██
//proudly made by:██████   ██████  ██   ██ ██ ██   ████  ██████      ███████ ███████  ██████  ██████  ██   ██ ██    ██       ██



pragma solidity ^0.8.0;




contract BoringSecurity is ERC1155, Ownable {
    string public name;
    string public symbol;
    uint256 public constant BSEC101 = 101;
    uint256 public constant BSEC102 = 102;

    constructor() ERC1155("https://gateway.pinata.cloud/ipfs/QmYf5kUoN4sHZ2dU9mkAKCChFdjtRW64mrFfZc59FS2SAn/metadata101.json") {
        _mint(msg.sender, BSEC101, 500, "");
        _mint(msg.sender, BSEC102, 500, "");
        name = "Boring Security";
        symbol = "BoringSEC";
    }

    function mint(uint256 amount, uint256 tokenID) public onlyOwner {
        _mint(msg.sender, tokenID, amount, "");
    }

    function uri(uint256 _tokenID) override public view returns (string memory) {
        return string (
            abi.encodePacked(
                "https://gateway.pinata.cloud/ipfs/QmYf5kUoN4sHZ2dU9mkAKCChFdjtRW64mrFfZc59FS2SAn/metadata",
                Strings.toString(_tokenID),
                ".json"
            )
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"BSEC101","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BSEC102","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040518060a001604052806061815260200162004043606191396200003d816200014c60201b60201c565b506200005e620000526200016860201b60201c565b6200017060201b60201c565b620000843360656101f4604051806020016040528060008152506200023660201b60201c565b620000aa3360666101f4604051806020016040528060008152506200023660201b60201c565b6040518060400160405280600f81526020017f426f72696e67205365637572697479000000000000000000000000000000000081525060049080519060200190620000f7929190620006b1565b506040518060400160405280600981526020017f426f72696e6753454300000000000000000000000000000000000000000000008152506005908051906020019062000145929190620006b1565b5062000e36565b806002908051906020019062000164929190620006b1565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620002a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a0906200098f565b60405180910390fd5b6000620002bb6200016860201b60201c565b9050620002f481600087620002d688620003fb60201b60201c565b620002e788620003fb60201b60201c565b876200047c60201b60201c565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000355919062000a20565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051620003d5929190620009b1565b60405180910390a4620003f4816000878787876200048460201b60201c565b5050505050565b60606000600167ffffffffffffffff8111156200041d576200041c62000c16565b5b6040519080825280602002602001820160405280156200044c5781602001602082028036833780820191505090505b509050828160008151811062000467576200046662000be7565b5b60200260200101818152505080915050919050565b505050505050565b620004b08473ffffffffffffffffffffffffffffffffffffffff166200068e60201b62000b6c1760201c565b1562000686578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401620004f9959493929190620008c3565b602060405180830381600087803b1580156200051457600080fd5b505af19250505080156200054857506040513d601f19601f8201168201806040525081019062000545919062000778565b60015b620005fa576200055762000c45565b806308c379a01415620005bb57506200056f62000d7a565b806200057c5750620005bd565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005b2919062000927565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f1906200094b565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161462000684576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200067b906200096d565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054620006bf9062000b1d565b90600052602060002090601f016020900481019282620006e357600085556200072f565b82601f10620006fe57805160ff19168380011785556200072f565b828001600101855582156200072f579182015b828111156200072e57825182559160200191906001019062000711565b5b5090506200073e919062000742565b5090565b5b808211156200075d57600081600090555060010162000743565b5090565b600081519050620007728162000e1c565b92915050565b60006020828403121562000791576200079062000c6a565b5b6000620007a18482850162000761565b91505092915050565b620007b58162000a7d565b82525050565b6000620007c882620009e8565b620007d48185620009fe565b9350620007e681856020860162000ae7565b620007f18162000c6f565b840191505092915050565b60006200080982620009f3565b62000815818562000a0f565b93506200082781856020860162000ae7565b620008328162000c6f565b840191505092915050565b60006200084c60348362000a0f565b9150620008598262000c8d565b604082019050919050565b60006200087360288362000a0f565b9150620008808262000cdc565b604082019050919050565b60006200089a60218362000a0f565b9150620008a78262000d2b565b604082019050919050565b620008bd8162000add565b82525050565b600060a082019050620008da6000830188620007aa565b620008e96020830187620007aa565b620008f86040830186620008b2565b620009076060830185620008b2565b81810360808301526200091b8184620007bb565b90509695505050505050565b60006020820190508181036000830152620009438184620007fc565b905092915050565b6000602082019050818103600083015262000966816200083d565b9050919050565b60006020820190508181036000830152620009888162000864565b9050919050565b60006020820190508181036000830152620009aa816200088b565b9050919050565b6000604082019050620009c86000830185620008b2565b620009d76020830184620008b2565b9392505050565b6000604051905090565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000a2d8262000add565b915062000a3a8362000add565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a725762000a7162000b89565b5b828201905092915050565b600062000a8a8262000abd565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b0757808201518184015260208101905062000aea565b8381111562000b17576000848401525b50505050565b6000600282049050600182168062000b3657607f821691505b6020821081141562000b4d5762000b4c62000bb8565b5b50919050565b62000b5e8262000c6f565b810181811067ffffffffffffffff8211171562000b805762000b7f62000c16565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111562000c675760046000803e62000c6460005162000c80565b90505b90565b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101562000d8c5762000e19565b62000d96620009de565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000dc057505062000e19565b808201805167ffffffffffffffff81111562000de0575050505062000e19565b80602083010160043d03850181111562000dff57505050505062000e19565b62000e108260200185018662000b53565b82955050505050505b90565b62000e278162000a91565b811462000e3357600080fd5b50565b6131fd8062000e466000396000f3fe608060405234801561001057600080fd5b50600436106100ff5760003560e01c8063715018a611610097578063c502284711610066578063c50228471461029a578063e985e9c5146102b8578063f242432a146102e8578063f2fde38b14610304576100ff565b8063715018a6146102385780638da5cb5b1461024257806395d89b4114610260578063a22cb4651461027e576100ff565b80631b2ef1ca116100d35780631b2ef1ca146101b25780632eb2c2d6146101ce5780634e1273f4146101ea5780636f777e491461021a576100ff565b8062fdd58e1461010457806301ffc9a71461013457806306fdde03146101645780630e89341c14610182575b600080fd5b61011e60048036038101906101199190611f39565b610320565b60405161012b919061275a565b60405180910390f35b61014e60048036038101906101499190611ff1565b6103e9565b60405161015b919061257d565b60405180910390f35b61016c6104cb565b6040516101799190612598565b60405180910390f35b61019c6004803603810190610197919061204b565b610559565b6040516101a99190612598565b60405180910390f35b6101cc60048036038101906101c79190612078565b61058a565b005b6101e860048036038101906101e39190611d93565b610625565b005b61020460048036038101906101ff9190611f79565b6106c6565b6040516102119190612524565b60405180910390f35b6102226107df565b60405161022f919061275a565b60405180910390f35b6102406107e4565b005b61024a61086c565b6040516102579190612447565b60405180910390f35b610268610896565b6040516102759190612598565b60405180910390f35b61029860048036038101906102939190611ef9565b610924565b005b6102a261093a565b6040516102af919061275a565b60405180910390f35b6102d260048036038101906102cd9190611d53565b61093f565b6040516102df919061257d565b60405180910390f35b61030260048036038101906102fd9190611e62565b6109d3565b005b61031e60048036038101906103199190611d26565b610a74565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610391576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610388906125fa565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104b457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104c457506104c382610b8f565b5b9050919050565b600480546104d890612a39565b80601f016020809104026020016040519081016040528092919081815260200182805461050490612a39565b80156105515780601f1061052657610100808354040283529160200191610551565b820191906000526020600020905b81548152906001019060200180831161053457829003601f168201915b505050505081565b606061056482610bf9565b604051602001610574919061241a565b6040516020818303038152906040529050919050565b610592610d5a565b73ffffffffffffffffffffffffffffffffffffffff166105b061086c565b73ffffffffffffffffffffffffffffffffffffffff1614610606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fd906126ba565b60405180910390fd5b61062133828460405180602001604052806000815250610d62565b5050565b61062d610d5a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061067357506106728561066d610d5a565b61093f565b5b6106b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a99061267a565b60405180910390fd5b6106bf8585858585610ef8565b5050505050565b6060815183511461070c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610703906126fa565b60405180910390fd5b6000835167ffffffffffffffff81111561072957610728612bd2565b5b6040519080825280602002602001820160405280156107575781602001602082028036833780820191505090505b50905060005b84518110156107d4576107a485828151811061077c5761077b612ba3565b5b602002602001015185838151811061079757610796612ba3565b5b6020026020010151610320565b8282815181106107b7576107b6612ba3565b5b602002602001018181525050806107cd90612a9c565b905061075d565b508091505092915050565b606581565b6107ec610d5a565b73ffffffffffffffffffffffffffffffffffffffff1661080a61086c565b73ffffffffffffffffffffffffffffffffffffffff1614610860576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610857906126ba565b60405180910390fd5b61086a600061120c565b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600580546108a390612a39565b80601f01602080910402602001604051908101604052809291908181526020018280546108cf90612a39565b801561091c5780601f106108f15761010080835404028352916020019161091c565b820191906000526020600020905b8154815290600101906020018083116108ff57829003601f168201915b505050505081565b61093661092f610d5a565b83836112d2565b5050565b606681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6109db610d5a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610a215750610a2085610a1b610d5a565b61093f565b5b610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a579061263a565b60405180910390fd5b610a6d858585858561143f565b5050505050565b610a7c610d5a565b73ffffffffffffffffffffffffffffffffffffffff16610a9a61086c565b73ffffffffffffffffffffffffffffffffffffffff1614610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906126ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b579061261a565b60405180910390fd5b610b698161120c565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000821415610c41576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050610d55565b600082905060005b60008214610c73578080610c5c90612a9c565b915050600a82610c6c919061291e565b9150610c49565b60008167ffffffffffffffff811115610c8f57610c8e612bd2565b5b6040519080825280601f01601f191660200182016040528015610cc15781602001600182028036833780820191505090505b5090505b60008514610d4e57600182610cda919061294f565b9150600a85610ce99190612ae5565b6030610cf591906128c8565b60f81b818381518110610d0b57610d0a612ba3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85610d47919061291e565b9450610cc5565b8093505050505b919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc99061273a565b60405180910390fd5b6000610ddc610d5a565b9050610dfd81600087610dee886116c1565b610df7886116c1565b8761173b565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e5c91906128c8565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051610eda929190612775565b60405180910390a4610ef181600087878787611743565b5050505050565b8151835114610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f339061271a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa39061265a565b60405180910390fd5b6000610fb6610d5a565b9050610fc681878787878761173b565b60005b8451811015611177576000858281518110610fe757610fe6612ba3565b5b60200260200101519050600085838151811061100657611005612ba3565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e9061269a565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461115c91906128c8565b925050819055505050508061117090612a9c565b9050610fc9565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516111ee929190612546565b60405180910390a461120481878787878761192a565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611341576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611338906126da565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611432919061257d565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a69061265a565b60405180910390fd5b60006114b9610d5a565b90506114d98187876114ca886116c1565b6114d3886116c1565b8761173b565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115679061269a565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461162591906128c8565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516116a2929190612775565b60405180910390a46116b8828888888888611743565b50505050505050565b60606000600167ffffffffffffffff8111156116e0576116df612bd2565b5b60405190808252806020026020018201604052801561170e5781602001602082028036833780820191505090505b509050828160008151811061172657611725612ba3565b5b60200260200101818152505080915050919050565b505050505050565b6117628473ffffffffffffffffffffffffffffffffffffffff16610b6c565b15611922578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016117a89594939291906124ca565b602060405180830381600087803b1580156117c257600080fd5b505af19250505080156117f357506040513d601f19601f820116820180604052508101906117f0919061201e565b60015b611899576117ff612c01565b806308c379a0141561185c57506118146130d5565b8061181f575061185e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118539190612598565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611890906125ba565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611920576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611917906125da565b60405180910390fd5b505b505050505050565b6119498473ffffffffffffffffffffffffffffffffffffffff16610b6c565b15611b09578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161198f959493929190612462565b602060405180830381600087803b1580156119a957600080fd5b505af19250505080156119da57506040513d601f19601f820116820180604052508101906119d7919061201e565b60015b611a80576119e6612c01565b806308c379a01415611a4357506119fb6130d5565b80611a065750611a45565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a9190612598565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a77906125ba565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe906125da565b60405180910390fd5b505b505050505050565b6000611b24611b1f846127c3565b61279e565b90508083825260208201905082856020860282011115611b4757611b46612c28565b5b60005b85811015611b775781611b5d8882611c33565b845260208401935060208301925050600181019050611b4a565b5050509392505050565b6000611b94611b8f846127ef565b61279e565b90508083825260208201905082856020860282011115611bb757611bb6612c28565b5b60005b85811015611be75781611bcd8882611d11565b845260208401935060208301925050600181019050611bba565b5050509392505050565b6000611c04611bff8461281b565b61279e565b905082815260208101848484011115611c2057611c1f612c2d565b5b611c2b8482856129f7565b509392505050565b600081359050611c428161316b565b92915050565b600082601f830112611c5d57611c5c612c23565b5b8135611c6d848260208601611b11565b91505092915050565b600082601f830112611c8b57611c8a612c23565b5b8135611c9b848260208601611b81565b91505092915050565b600081359050611cb381613182565b92915050565b600081359050611cc881613199565b92915050565b600081519050611cdd81613199565b92915050565b600082601f830112611cf857611cf7612c23565b5b8135611d08848260208601611bf1565b91505092915050565b600081359050611d20816131b0565b92915050565b600060208284031215611d3c57611d3b612c37565b5b6000611d4a84828501611c33565b91505092915050565b60008060408385031215611d6a57611d69612c37565b5b6000611d7885828601611c33565b9250506020611d8985828601611c33565b9150509250929050565b600080600080600060a08688031215611daf57611dae612c37565b5b6000611dbd88828901611c33565b9550506020611dce88828901611c33565b945050604086013567ffffffffffffffff811115611def57611dee612c32565b5b611dfb88828901611c76565b935050606086013567ffffffffffffffff811115611e1c57611e1b612c32565b5b611e2888828901611c76565b925050608086013567ffffffffffffffff811115611e4957611e48612c32565b5b611e5588828901611ce3565b9150509295509295909350565b600080600080600060a08688031215611e7e57611e7d612c37565b5b6000611e8c88828901611c33565b9550506020611e9d88828901611c33565b9450506040611eae88828901611d11565b9350506060611ebf88828901611d11565b925050608086013567ffffffffffffffff811115611ee057611edf612c32565b5b611eec88828901611ce3565b9150509295509295909350565b60008060408385031215611f1057611f0f612c37565b5b6000611f1e85828601611c33565b9250506020611f2f85828601611ca4565b9150509250929050565b60008060408385031215611f5057611f4f612c37565b5b6000611f5e85828601611c33565b9250506020611f6f85828601611d11565b9150509250929050565b60008060408385031215611f9057611f8f612c37565b5b600083013567ffffffffffffffff811115611fae57611fad612c32565b5b611fba85828601611c48565b925050602083013567ffffffffffffffff811115611fdb57611fda612c32565b5b611fe785828601611c76565b9150509250929050565b60006020828403121561200757612006612c37565b5b600061201584828501611cb9565b91505092915050565b60006020828403121561203457612033612c37565b5b600061204284828501611cce565b91505092915050565b60006020828403121561206157612060612c37565b5b600061206f84828501611d11565b91505092915050565b6000806040838503121561208f5761208e612c37565b5b600061209d85828601611d11565b92505060206120ae85828601611d11565b9150509250929050565b60006120c483836123fc565b60208301905092915050565b6120d981612983565b82525050565b60006120ea8261285c565b6120f4818561288a565b93506120ff8361284c565b8060005b8381101561213057815161211788826120b8565b97506121228361287d565b925050600181019050612103565b5085935050505092915050565b61214681612995565b82525050565b600061215782612867565b612161818561289b565b9350612171818560208601612a06565b61217a81612c3c565b840191505092915050565b600061219082612872565b61219a81856128ac565b93506121aa818560208601612a06565b6121b381612c3c565b840191505092915050565b60006121c982612872565b6121d381856128bd565b93506121e3818560208601612a06565b80840191505092915050565b60006121fc6034836128ac565b915061220782612c5a565b604082019050919050565b600061221f6028836128ac565b915061222a82612ca9565b604082019050919050565b6000612242602b836128ac565b915061224d82612cf8565b604082019050919050565b60006122656026836128ac565b915061227082612d47565b604082019050919050565b60006122886029836128ac565b915061229382612d96565b604082019050919050565b60006122ab6025836128ac565b91506122b682612de5565b604082019050919050565b60006122ce6032836128ac565b91506122d982612e34565b604082019050919050565b60006122f16059836128bd565b91506122fc82612e83565b605982019050919050565b6000612314602a836128ac565b915061231f82612ef8565b604082019050919050565b60006123376005836128bd565b915061234282612f47565b600582019050919050565b600061235a6020836128ac565b915061236582612f70565b602082019050919050565b600061237d6029836128ac565b915061238882612f99565b604082019050919050565b60006123a06029836128ac565b91506123ab82612fe8565b604082019050919050565b60006123c36028836128ac565b91506123ce82613037565b604082019050919050565b60006123e66021836128ac565b91506123f182613086565b604082019050919050565b612405816129ed565b82525050565b612414816129ed565b82525050565b6000612425826122e4565b915061243182846121be565b915061243c8261232a565b915081905092915050565b600060208201905061245c60008301846120d0565b92915050565b600060a08201905061247760008301886120d0565b61248460208301876120d0565b818103604083015261249681866120df565b905081810360608301526124aa81856120df565b905081810360808301526124be818461214c565b90509695505050505050565b600060a0820190506124df60008301886120d0565b6124ec60208301876120d0565b6124f9604083018661240b565b612506606083018561240b565b8181036080830152612518818461214c565b90509695505050505050565b6000602082019050818103600083015261253e81846120df565b905092915050565b6000604082019050818103600083015261256081856120df565b9050818103602083015261257481846120df565b90509392505050565b6000602082019050612592600083018461213d565b92915050565b600060208201905081810360008301526125b28184612185565b905092915050565b600060208201905081810360008301526125d3816121ef565b9050919050565b600060208201905081810360008301526125f381612212565b9050919050565b6000602082019050818103600083015261261381612235565b9050919050565b6000602082019050818103600083015261263381612258565b9050919050565b600060208201905081810360008301526126538161227b565b9050919050565b600060208201905081810360008301526126738161229e565b9050919050565b60006020820190508181036000830152612693816122c1565b9050919050565b600060208201905081810360008301526126b381612307565b9050919050565b600060208201905081810360008301526126d38161234d565b9050919050565b600060208201905081810360008301526126f381612370565b9050919050565b6000602082019050818103600083015261271381612393565b9050919050565b60006020820190508181036000830152612733816123b6565b9050919050565b60006020820190508181036000830152612753816123d9565b9050919050565b600060208201905061276f600083018461240b565b92915050565b600060408201905061278a600083018561240b565b612797602083018461240b565b9392505050565b60006127a86127b9565b90506127b48282612a6b565b919050565b6000604051905090565b600067ffffffffffffffff8211156127de576127dd612bd2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561280a57612809612bd2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561283657612835612bd2565b5b61283f82612c3c565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006128d3826129ed565b91506128de836129ed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561291357612912612b16565b5b828201905092915050565b6000612929826129ed565b9150612934836129ed565b92508261294457612943612b45565b5b828204905092915050565b600061295a826129ed565b9150612965836129ed565b92508282101561297857612977612b16565b5b828203905092915050565b600061298e826129cd565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612a24578082015181840152602081019050612a09565b83811115612a33576000848401525b50505050565b60006002820490506001821680612a5157607f821691505b60208210811415612a6557612a64612b74565b5b50919050565b612a7482612c3c565b810181811067ffffffffffffffff82111715612a9357612a92612bd2565b5b80604052505050565b6000612aa7826129ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ada57612ad9612b16565b5b600182019050919050565b6000612af0826129ed565b9150612afb836129ed565b925082612b0b57612b0a612b45565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115612c205760046000803e612c1d600051612c4d565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f69706660008201527f732f516d5966356b556f4e3473485a326455396d6b414b43436846646a74525760208201527f36346d7246665a63353946533253416e2f6d6574616461746100000000000000604082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d10156130e557613168565b6130ed6127b9565b60043d036004823e80513d602482011167ffffffffffffffff82111715613115575050613168565b808201805167ffffffffffffffff8111156131335750505050613168565b80602083010160043d038501811115613150575050505050613168565b61315f82602001850186612a6b565b82955050505050505b90565b61317481612983565b811461317f57600080fd5b50565b61318b81612995565b811461319657600080fd5b50565b6131a2816129a1565b81146131ad57600080fd5b50565b6131b9816129ed565b81146131c457600080fd5b5056fea26469706673582212206c7788fe8df5ddc38796bbc3be006fa1f23bf9c3a5402248c14bec6f5576c23864736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5966356b556f4e3473485a326455396d6b414b43436846646a74525736346d7246665a63353946533253416e2f6d657461646174613130312e6a736f6e

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ff5760003560e01c8063715018a611610097578063c502284711610066578063c50228471461029a578063e985e9c5146102b8578063f242432a146102e8578063f2fde38b14610304576100ff565b8063715018a6146102385780638da5cb5b1461024257806395d89b4114610260578063a22cb4651461027e576100ff565b80631b2ef1ca116100d35780631b2ef1ca146101b25780632eb2c2d6146101ce5780634e1273f4146101ea5780636f777e491461021a576100ff565b8062fdd58e1461010457806301ffc9a71461013457806306fdde03146101645780630e89341c14610182575b600080fd5b61011e60048036038101906101199190611f39565b610320565b60405161012b919061275a565b60405180910390f35b61014e60048036038101906101499190611ff1565b6103e9565b60405161015b919061257d565b60405180910390f35b61016c6104cb565b6040516101799190612598565b60405180910390f35b61019c6004803603810190610197919061204b565b610559565b6040516101a99190612598565b60405180910390f35b6101cc60048036038101906101c79190612078565b61058a565b005b6101e860048036038101906101e39190611d93565b610625565b005b61020460048036038101906101ff9190611f79565b6106c6565b6040516102119190612524565b60405180910390f35b6102226107df565b60405161022f919061275a565b60405180910390f35b6102406107e4565b005b61024a61086c565b6040516102579190612447565b60405180910390f35b610268610896565b6040516102759190612598565b60405180910390f35b61029860048036038101906102939190611ef9565b610924565b005b6102a261093a565b6040516102af919061275a565b60405180910390f35b6102d260048036038101906102cd9190611d53565b61093f565b6040516102df919061257d565b60405180910390f35b61030260048036038101906102fd9190611e62565b6109d3565b005b61031e60048036038101906103199190611d26565b610a74565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610391576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610388906125fa565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104b457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104c457506104c382610b8f565b5b9050919050565b600480546104d890612a39565b80601f016020809104026020016040519081016040528092919081815260200182805461050490612a39565b80156105515780601f1061052657610100808354040283529160200191610551565b820191906000526020600020905b81548152906001019060200180831161053457829003601f168201915b505050505081565b606061056482610bf9565b604051602001610574919061241a565b6040516020818303038152906040529050919050565b610592610d5a565b73ffffffffffffffffffffffffffffffffffffffff166105b061086c565b73ffffffffffffffffffffffffffffffffffffffff1614610606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fd906126ba565b60405180910390fd5b61062133828460405180602001604052806000815250610d62565b5050565b61062d610d5a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061067357506106728561066d610d5a565b61093f565b5b6106b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a99061267a565b60405180910390fd5b6106bf8585858585610ef8565b5050505050565b6060815183511461070c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610703906126fa565b60405180910390fd5b6000835167ffffffffffffffff81111561072957610728612bd2565b5b6040519080825280602002602001820160405280156107575781602001602082028036833780820191505090505b50905060005b84518110156107d4576107a485828151811061077c5761077b612ba3565b5b602002602001015185838151811061079757610796612ba3565b5b6020026020010151610320565b8282815181106107b7576107b6612ba3565b5b602002602001018181525050806107cd90612a9c565b905061075d565b508091505092915050565b606581565b6107ec610d5a565b73ffffffffffffffffffffffffffffffffffffffff1661080a61086c565b73ffffffffffffffffffffffffffffffffffffffff1614610860576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610857906126ba565b60405180910390fd5b61086a600061120c565b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600580546108a390612a39565b80601f01602080910402602001604051908101604052809291908181526020018280546108cf90612a39565b801561091c5780601f106108f15761010080835404028352916020019161091c565b820191906000526020600020905b8154815290600101906020018083116108ff57829003601f168201915b505050505081565b61093661092f610d5a565b83836112d2565b5050565b606681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6109db610d5a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610a215750610a2085610a1b610d5a565b61093f565b5b610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a579061263a565b60405180910390fd5b610a6d858585858561143f565b5050505050565b610a7c610d5a565b73ffffffffffffffffffffffffffffffffffffffff16610a9a61086c565b73ffffffffffffffffffffffffffffffffffffffff1614610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906126ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b579061261a565b60405180910390fd5b610b698161120c565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000821415610c41576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050610d55565b600082905060005b60008214610c73578080610c5c90612a9c565b915050600a82610c6c919061291e565b9150610c49565b60008167ffffffffffffffff811115610c8f57610c8e612bd2565b5b6040519080825280601f01601f191660200182016040528015610cc15781602001600182028036833780820191505090505b5090505b60008514610d4e57600182610cda919061294f565b9150600a85610ce99190612ae5565b6030610cf591906128c8565b60f81b818381518110610d0b57610d0a612ba3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85610d47919061291e565b9450610cc5565b8093505050505b919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc99061273a565b60405180910390fd5b6000610ddc610d5a565b9050610dfd81600087610dee886116c1565b610df7886116c1565b8761173b565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e5c91906128c8565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051610eda929190612775565b60405180910390a4610ef181600087878787611743565b5050505050565b8151835114610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f339061271a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa39061265a565b60405180910390fd5b6000610fb6610d5a565b9050610fc681878787878761173b565b60005b8451811015611177576000858281518110610fe757610fe6612ba3565b5b60200260200101519050600085838151811061100657611005612ba3565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e9061269a565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461115c91906128c8565b925050819055505050508061117090612a9c565b9050610fc9565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516111ee929190612546565b60405180910390a461120481878787878761192a565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611341576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611338906126da565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611432919061257d565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a69061265a565b60405180910390fd5b60006114b9610d5a565b90506114d98187876114ca886116c1565b6114d3886116c1565b8761173b565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115679061269a565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461162591906128c8565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516116a2929190612775565b60405180910390a46116b8828888888888611743565b50505050505050565b60606000600167ffffffffffffffff8111156116e0576116df612bd2565b5b60405190808252806020026020018201604052801561170e5781602001602082028036833780820191505090505b509050828160008151811061172657611725612ba3565b5b60200260200101818152505080915050919050565b505050505050565b6117628473ffffffffffffffffffffffffffffffffffffffff16610b6c565b15611922578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016117a89594939291906124ca565b602060405180830381600087803b1580156117c257600080fd5b505af19250505080156117f357506040513d601f19601f820116820180604052508101906117f0919061201e565b60015b611899576117ff612c01565b806308c379a0141561185c57506118146130d5565b8061181f575061185e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118539190612598565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611890906125ba565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611920576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611917906125da565b60405180910390fd5b505b505050505050565b6119498473ffffffffffffffffffffffffffffffffffffffff16610b6c565b15611b09578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161198f959493929190612462565b602060405180830381600087803b1580156119a957600080fd5b505af19250505080156119da57506040513d601f19601f820116820180604052508101906119d7919061201e565b60015b611a80576119e6612c01565b806308c379a01415611a4357506119fb6130d5565b80611a065750611a45565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a9190612598565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a77906125ba565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe906125da565b60405180910390fd5b505b505050505050565b6000611b24611b1f846127c3565b61279e565b90508083825260208201905082856020860282011115611b4757611b46612c28565b5b60005b85811015611b775781611b5d8882611c33565b845260208401935060208301925050600181019050611b4a565b5050509392505050565b6000611b94611b8f846127ef565b61279e565b90508083825260208201905082856020860282011115611bb757611bb6612c28565b5b60005b85811015611be75781611bcd8882611d11565b845260208401935060208301925050600181019050611bba565b5050509392505050565b6000611c04611bff8461281b565b61279e565b905082815260208101848484011115611c2057611c1f612c2d565b5b611c2b8482856129f7565b509392505050565b600081359050611c428161316b565b92915050565b600082601f830112611c5d57611c5c612c23565b5b8135611c6d848260208601611b11565b91505092915050565b600082601f830112611c8b57611c8a612c23565b5b8135611c9b848260208601611b81565b91505092915050565b600081359050611cb381613182565b92915050565b600081359050611cc881613199565b92915050565b600081519050611cdd81613199565b92915050565b600082601f830112611cf857611cf7612c23565b5b8135611d08848260208601611bf1565b91505092915050565b600081359050611d20816131b0565b92915050565b600060208284031215611d3c57611d3b612c37565b5b6000611d4a84828501611c33565b91505092915050565b60008060408385031215611d6a57611d69612c37565b5b6000611d7885828601611c33565b9250506020611d8985828601611c33565b9150509250929050565b600080600080600060a08688031215611daf57611dae612c37565b5b6000611dbd88828901611c33565b9550506020611dce88828901611c33565b945050604086013567ffffffffffffffff811115611def57611dee612c32565b5b611dfb88828901611c76565b935050606086013567ffffffffffffffff811115611e1c57611e1b612c32565b5b611e2888828901611c76565b925050608086013567ffffffffffffffff811115611e4957611e48612c32565b5b611e5588828901611ce3565b9150509295509295909350565b600080600080600060a08688031215611e7e57611e7d612c37565b5b6000611e8c88828901611c33565b9550506020611e9d88828901611c33565b9450506040611eae88828901611d11565b9350506060611ebf88828901611d11565b925050608086013567ffffffffffffffff811115611ee057611edf612c32565b5b611eec88828901611ce3565b9150509295509295909350565b60008060408385031215611f1057611f0f612c37565b5b6000611f1e85828601611c33565b9250506020611f2f85828601611ca4565b9150509250929050565b60008060408385031215611f5057611f4f612c37565b5b6000611f5e85828601611c33565b9250506020611f6f85828601611d11565b9150509250929050565b60008060408385031215611f9057611f8f612c37565b5b600083013567ffffffffffffffff811115611fae57611fad612c32565b5b611fba85828601611c48565b925050602083013567ffffffffffffffff811115611fdb57611fda612c32565b5b611fe785828601611c76565b9150509250929050565b60006020828403121561200757612006612c37565b5b600061201584828501611cb9565b91505092915050565b60006020828403121561203457612033612c37565b5b600061204284828501611cce565b91505092915050565b60006020828403121561206157612060612c37565b5b600061206f84828501611d11565b91505092915050565b6000806040838503121561208f5761208e612c37565b5b600061209d85828601611d11565b92505060206120ae85828601611d11565b9150509250929050565b60006120c483836123fc565b60208301905092915050565b6120d981612983565b82525050565b60006120ea8261285c565b6120f4818561288a565b93506120ff8361284c565b8060005b8381101561213057815161211788826120b8565b97506121228361287d565b925050600181019050612103565b5085935050505092915050565b61214681612995565b82525050565b600061215782612867565b612161818561289b565b9350612171818560208601612a06565b61217a81612c3c565b840191505092915050565b600061219082612872565b61219a81856128ac565b93506121aa818560208601612a06565b6121b381612c3c565b840191505092915050565b60006121c982612872565b6121d381856128bd565b93506121e3818560208601612a06565b80840191505092915050565b60006121fc6034836128ac565b915061220782612c5a565b604082019050919050565b600061221f6028836128ac565b915061222a82612ca9565b604082019050919050565b6000612242602b836128ac565b915061224d82612cf8565b604082019050919050565b60006122656026836128ac565b915061227082612d47565b604082019050919050565b60006122886029836128ac565b915061229382612d96565b604082019050919050565b60006122ab6025836128ac565b91506122b682612de5565b604082019050919050565b60006122ce6032836128ac565b91506122d982612e34565b604082019050919050565b60006122f16059836128bd565b91506122fc82612e83565b605982019050919050565b6000612314602a836128ac565b915061231f82612ef8565b604082019050919050565b60006123376005836128bd565b915061234282612f47565b600582019050919050565b600061235a6020836128ac565b915061236582612f70565b602082019050919050565b600061237d6029836128ac565b915061238882612f99565b604082019050919050565b60006123a06029836128ac565b91506123ab82612fe8565b604082019050919050565b60006123c36028836128ac565b91506123ce82613037565b604082019050919050565b60006123e66021836128ac565b91506123f182613086565b604082019050919050565b612405816129ed565b82525050565b612414816129ed565b82525050565b6000612425826122e4565b915061243182846121be565b915061243c8261232a565b915081905092915050565b600060208201905061245c60008301846120d0565b92915050565b600060a08201905061247760008301886120d0565b61248460208301876120d0565b818103604083015261249681866120df565b905081810360608301526124aa81856120df565b905081810360808301526124be818461214c565b90509695505050505050565b600060a0820190506124df60008301886120d0565b6124ec60208301876120d0565b6124f9604083018661240b565b612506606083018561240b565b8181036080830152612518818461214c565b90509695505050505050565b6000602082019050818103600083015261253e81846120df565b905092915050565b6000604082019050818103600083015261256081856120df565b9050818103602083015261257481846120df565b90509392505050565b6000602082019050612592600083018461213d565b92915050565b600060208201905081810360008301526125b28184612185565b905092915050565b600060208201905081810360008301526125d3816121ef565b9050919050565b600060208201905081810360008301526125f381612212565b9050919050565b6000602082019050818103600083015261261381612235565b9050919050565b6000602082019050818103600083015261263381612258565b9050919050565b600060208201905081810360008301526126538161227b565b9050919050565b600060208201905081810360008301526126738161229e565b9050919050565b60006020820190508181036000830152612693816122c1565b9050919050565b600060208201905081810360008301526126b381612307565b9050919050565b600060208201905081810360008301526126d38161234d565b9050919050565b600060208201905081810360008301526126f381612370565b9050919050565b6000602082019050818103600083015261271381612393565b9050919050565b60006020820190508181036000830152612733816123b6565b9050919050565b60006020820190508181036000830152612753816123d9565b9050919050565b600060208201905061276f600083018461240b565b92915050565b600060408201905061278a600083018561240b565b612797602083018461240b565b9392505050565b60006127a86127b9565b90506127b48282612a6b565b919050565b6000604051905090565b600067ffffffffffffffff8211156127de576127dd612bd2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561280a57612809612bd2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561283657612835612bd2565b5b61283f82612c3c565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006128d3826129ed565b91506128de836129ed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561291357612912612b16565b5b828201905092915050565b6000612929826129ed565b9150612934836129ed565b92508261294457612943612b45565b5b828204905092915050565b600061295a826129ed565b9150612965836129ed565b92508282101561297857612977612b16565b5b828203905092915050565b600061298e826129cd565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612a24578082015181840152602081019050612a09565b83811115612a33576000848401525b50505050565b60006002820490506001821680612a5157607f821691505b60208210811415612a6557612a64612b74565b5b50919050565b612a7482612c3c565b810181811067ffffffffffffffff82111715612a9357612a92612bd2565b5b80604052505050565b6000612aa7826129ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ada57612ad9612b16565b5b600182019050919050565b6000612af0826129ed565b9150612afb836129ed565b925082612b0b57612b0a612b45565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115612c205760046000803e612c1d600051612c4d565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f69706660008201527f732f516d5966356b556f4e3473485a326455396d6b414b43436846646a74525760208201527f36346d7246665a63353946533253416e2f6d6574616461746100000000000000604082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d10156130e557613168565b6130ed6127b9565b60043d036004823e80513d602482011167ffffffffffffffff82111715613115575050613168565b808201805167ffffffffffffffff8111156131335750505050613168565b80602083010160043d038501811115613150575050505050613168565b61315f82602001850186612a6b565b82955050505050505b90565b61317481612983565b811461317f57600080fd5b50565b61318b81612995565b811461319657600080fd5b50565b6131a2816129a1565b81146131ad57600080fd5b50565b6131b9816129ed565b81146131c457600080fd5b5056fea26469706673582212206c7788fe8df5ddc38796bbc3be006fa1f23bf9c3a5402248c14bec6f5576c23864736f6c63430008070033

Deployed Bytecode Sourcemap

40343:969:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25501:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24524:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40394:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40962:347;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40833:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27440:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25898:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40446:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;:::i;:::-;;4079:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40419:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26495:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40490:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26722:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26962:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4988:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25501:231;25587:7;25634:1;25615:21;;:7;:21;;;;25607:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;25702:9;:13;25712:2;25702:13;;;;;;;;;;;:22;25716:7;25702:22;;;;;;;;;;;;;;;;25695:29;;25501:231;;;;:::o;24524:310::-;24626:4;24678:26;24663:41;;;:11;:41;;;;:110;;;;24736:37;24721:52;;;:11;:52;;;;24663:110;:163;;;;24790:36;24814:11;24790:23;:36::i;:::-;24663:163;24643:183;;24524:310;;;:::o;40394:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40962:347::-;41023:13;41223:26;41240:8;41223:16;:26::i;:::-;41078:212;;;;;;;;:::i;:::-;;;;;;;;;;;;;41049:252;;40962:347;;;:::o;40833:121::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40908:38:::1;40914:10;40926:7;40935:6;40908:38;;;;;;;;;;;::::0;:5:::1;:38::i;:::-;40833:121:::0;;:::o;27440:442::-;27681:12;:10;:12::i;:::-;27673:20;;:4;:20;;;:60;;;;27697:36;27714:4;27720:12;:10;:12::i;:::-;27697:16;:36::i;:::-;27673:60;27651:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;27822:52;27845:4;27851:2;27855:3;27860:7;27869:4;27822:22;:52::i;:::-;27440:442;;;;;:::o;25898:524::-;26054:16;26115:3;:10;26096:8;:15;:29;26088:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;26184:30;26231:8;:15;26217:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26184:63;;26265:9;26260:122;26284:8;:15;26280:1;:19;26260:122;;;26340:30;26350:8;26359:1;26350:11;;;;;;;;:::i;:::-;;;;;;;;26363:3;26367:1;26363:6;;;;;;;;:::i;:::-;;;;;;;;26340:9;:30::i;:::-;26321:13;26335:1;26321:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;26301:3;;;;:::i;:::-;;;26260:122;;;;26401:13;26394:20;;;25898:524;;;;:::o;40446:37::-;40480:3;40446:37;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;40419:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26495:155::-;26590:52;26609:12;:10;:12::i;:::-;26623:8;26633;26590:18;:52::i;:::-;26495:155;;:::o;40490:37::-;40524:3;40490:37;:::o;26722:168::-;26821:4;26845:18;:27;26864:7;26845:27;;;;;;;;;;;;;;;:37;26873:8;26845:37;;;;;;;;;;;;;;;;;;;;;;;;;26838:44;;26722:168;;;;:::o;26962:401::-;27178:12;:10;:12::i;:::-;27170:20;;:4;:20;;;:60;;;;27194:36;27211:4;27217:12;:10;:12::i;:::-;27194:16;:36::i;:::-;27170:60;27148:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;27310:45;27328:4;27334:2;27338;27342:6;27350:4;27310:17;:45::i;:::-;26962:401;;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;6780:326::-;6840:4;7097:1;7075:7;:19;;;:23;7068:30;;6780:326;;;:::o;15832:157::-;15917:4;15956:25;15941:40;;;:11;:40;;;;15934:47;;15832:157;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;31916:569::-;32083:1;32069:16;;:2;:16;;;;32061:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32136:16;32155:12;:10;:12::i;:::-;32136:31;;32180:102;32201:8;32219:1;32223:2;32227:21;32245:2;32227:17;:21::i;:::-;32250:25;32268:6;32250:17;:25::i;:::-;32277:4;32180:20;:102::i;:::-;32316:6;32295:9;:13;32305:2;32295:13;;;;;;;;;;;:17;32309:2;32295:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;32375:2;32338:52;;32371:1;32338:52;;32353:8;32338:52;;;32379:2;32383:6;32338:52;;;;;;;:::i;:::-;;;;;;;;32403:74;32434:8;32452:1;32456:2;32460;32464:6;32472:4;32403:30;:74::i;:::-;32050:435;31916:569;;;;:::o;29524:1074::-;29751:7;:14;29737:3;:10;:28;29729:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;29843:1;29829:16;;:2;:16;;;;29821:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;29900:16;29919:12;:10;:12::i;:::-;29900:31;;29944:60;29965:8;29975:4;29981:2;29985:3;29990:7;29999:4;29944:20;:60::i;:::-;30022:9;30017:421;30041:3;:10;30037:1;:14;30017:421;;;30073:10;30086:3;30090:1;30086:6;;;;;;;;:::i;:::-;;;;;;;;30073:19;;30107:14;30124:7;30132:1;30124:10;;;;;;;;:::i;:::-;;;;;;;;30107:27;;30151:19;30173:9;:13;30183:2;30173:13;;;;;;;;;;;:19;30187:4;30173:19;;;;;;;;;;;;;;;;30151:41;;30230:6;30215:11;:21;;30207:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30363:6;30349:11;:20;30327:9;:13;30337:2;30327:13;;;;;;;;;;;:19;30341:4;30327:19;;;;;;;;;;;;;;;:42;;;;30420:6;30399:9;:13;30409:2;30399:13;;;;;;;;;;;:17;30413:2;30399:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;30058:380;;;30053:3;;;;:::i;:::-;;;30017:421;;;;30485:2;30455:47;;30479:4;30455:47;;30469:8;30455:47;;;30489:3;30494:7;30455:47;;;;;;;:::i;:::-;;;;;;;;30515:75;30551:8;30561:4;30567:2;30571:3;30576:7;30585:4;30515:35;:75::i;:::-;29718:880;29524:1074;;;;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;35710:331::-;35865:8;35856:17;;:5;:17;;;;35848:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;35968:8;35930:18;:25;35949:5;35930:25;;;;;;;;;;;;;;;:35;35956:8;35930:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36014:8;35992:41;;36007:5;35992:41;;;36024:8;35992:41;;;;;;:::i;:::-;;;;;;;;35710:331;;;:::o;28346:820::-;28548:1;28534:16;;:2;:16;;;;28526:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;28605:16;28624:12;:10;:12::i;:::-;28605:31;;28649:96;28670:8;28680:4;28686:2;28690:21;28708:2;28690:17;:21::i;:::-;28713:25;28731:6;28713:17;:25::i;:::-;28740:4;28649:20;:96::i;:::-;28758:19;28780:9;:13;28790:2;28780:13;;;;;;;;;;;:19;28794:4;28780:19;;;;;;;;;;;;;;;;28758:41;;28833:6;28818:11;:21;;28810:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28958:6;28944:11;:20;28922:9;:13;28932:2;28922:13;;;;;;;;;;;:19;28936:4;28922:19;;;;;;;;;;;;;;;:42;;;;29007:6;28986:9;:13;28996:2;28986:13;;;;;;;;;;;:17;29000:2;28986:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29062:2;29031:46;;29056:4;29031:46;;29046:8;29031:46;;;29066:2;29070:6;29031:46;;;;;;;:::i;:::-;;;;;;;;29090:68;29121:8;29131:4;29137:2;29141;29145:6;29153:4;29090:30;:68::i;:::-;28515:651;;28346:820;;;;;:::o;38799:198::-;38865:16;38894:22;38933:1;38919:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38894:41;;38957:7;38946:5;38952:1;38946:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;38984:5;38977:12;;;38799:198;;;:::o;36997:221::-;;;;;;;:::o;37226:744::-;37441:15;:2;:13;;;:15::i;:::-;37437:526;;;37494:2;37477:38;;;37516:8;37526:4;37532:2;37536:6;37544:4;37477:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37473:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;37825:6;37818:14;;;;;;;;;;;:::i;:::-;;;;;;;;37473:479;;;37874:62;;;;;;;;;;:::i;:::-;;;;;;;;37473:479;37611:43;;;37599:55;;;:8;:55;;;;37595:154;;37679:50;;;;;;;;;;:::i;:::-;;;;;;;;37595:154;37550:214;37437:526;37226:744;;;;;;:::o;37978:813::-;38218:15;:2;:13;;;:15::i;:::-;38214:570;;;38271:2;38254:43;;;38298:8;38308:4;38314:3;38319:7;38328:4;38254:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38250:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;38646:6;38639:14;;;;;;;;;;;:::i;:::-;;;;;;;;38250:523;;;38695:62;;;;;;;;;;:::i;:::-;;;;;;;;38250:523;38427:48;;;38415:60;;;:8;:60;;;;38411:159;;38500:50;;;;;;;;;;:::i;:::-;;;;;;;;38411:159;38334:251;38214:570;37978:813;;;;;;:::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;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:139::-;1959:5;1997:6;1984:20;1975:29;;2013:33;2040:5;2013:33;:::i;:::-;1913:139;;;;:::o;2075:370::-;2146:5;2195:3;2188:4;2180:6;2176:17;2172:27;2162:122;;2203:79;;:::i;:::-;2162:122;2320:6;2307:20;2345:94;2435:3;2427:6;2420:4;2412:6;2408:17;2345:94;:::i;:::-;2336:103;;2152:293;2075:370;;;;:::o;2468:::-;2539:5;2588:3;2581:4;2573:6;2569:17;2565:27;2555:122;;2596:79;;:::i;:::-;2555:122;2713:6;2700:20;2738:94;2828:3;2820:6;2813:4;2805:6;2801:17;2738:94;:::i;:::-;2729:103;;2545:293;2468:370;;;;:::o;2844:133::-;2887:5;2925:6;2912:20;2903:29;;2941:30;2965:5;2941:30;:::i;:::-;2844:133;;;;:::o;2983:137::-;3028:5;3066:6;3053:20;3044:29;;3082:32;3108:5;3082:32;:::i;:::-;2983:137;;;;:::o;3126:141::-;3182:5;3213:6;3207:13;3198:22;;3229:32;3255:5;3229:32;:::i;:::-;3126:141;;;;:::o;3286:338::-;3341:5;3390:3;3383:4;3375:6;3371:17;3367:27;3357:122;;3398:79;;:::i;:::-;3357:122;3515:6;3502:20;3540:78;3614:3;3606:6;3599:4;3591:6;3587:17;3540:78;:::i;:::-;3531:87;;3347:277;3286:338;;;;:::o;3630:139::-;3676:5;3714:6;3701:20;3692:29;;3730:33;3757:5;3730:33;:::i;:::-;3630:139;;;;:::o;3775:329::-;3834:6;3883:2;3871:9;3862:7;3858:23;3854:32;3851:119;;;3889:79;;:::i;:::-;3851:119;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;3775:329;;;;:::o;4110:474::-;4178:6;4186;4235:2;4223:9;4214:7;4210:23;4206:32;4203:119;;;4241:79;;:::i;:::-;4203:119;4361:1;4386:53;4431:7;4422:6;4411:9;4407:22;4386:53;:::i;:::-;4376:63;;4332:117;4488:2;4514:53;4559:7;4550:6;4539:9;4535:22;4514:53;:::i;:::-;4504:63;;4459:118;4110:474;;;;;:::o;4590:1509::-;4744:6;4752;4760;4768;4776;4825:3;4813:9;4804:7;4800:23;4796:33;4793:120;;;4832:79;;:::i;:::-;4793:120;4952:1;4977:53;5022:7;5013:6;5002:9;4998:22;4977:53;:::i;:::-;4967:63;;4923:117;5079:2;5105:53;5150:7;5141:6;5130:9;5126:22;5105:53;:::i;:::-;5095:63;;5050:118;5235:2;5224:9;5220:18;5207:32;5266:18;5258:6;5255:30;5252:117;;;5288:79;;:::i;:::-;5252:117;5393:78;5463:7;5454:6;5443:9;5439:22;5393:78;:::i;:::-;5383:88;;5178:303;5548:2;5537:9;5533:18;5520:32;5579:18;5571:6;5568:30;5565:117;;;5601:79;;:::i;:::-;5565:117;5706:78;5776:7;5767:6;5756:9;5752:22;5706:78;:::i;:::-;5696:88;;5491:303;5861:3;5850:9;5846:19;5833:33;5893:18;5885:6;5882:30;5879:117;;;5915:79;;:::i;:::-;5879:117;6020:62;6074:7;6065:6;6054:9;6050:22;6020:62;:::i;:::-;6010:72;;5804:288;4590:1509;;;;;;;;:::o;6105:1089::-;6209:6;6217;6225;6233;6241;6290:3;6278:9;6269:7;6265:23;6261:33;6258:120;;;6297:79;;:::i;:::-;6258:120;6417:1;6442:53;6487:7;6478:6;6467:9;6463:22;6442:53;:::i;:::-;6432:63;;6388:117;6544:2;6570:53;6615:7;6606:6;6595:9;6591:22;6570:53;:::i;:::-;6560:63;;6515:118;6672:2;6698:53;6743:7;6734:6;6723:9;6719:22;6698:53;:::i;:::-;6688:63;;6643:118;6800:2;6826:53;6871:7;6862:6;6851:9;6847:22;6826:53;:::i;:::-;6816:63;;6771:118;6956:3;6945:9;6941:19;6928:33;6988:18;6980:6;6977:30;6974:117;;;7010:79;;:::i;:::-;6974:117;7115:62;7169:7;7160:6;7149:9;7145:22;7115:62;:::i;:::-;7105:72;;6899:288;6105:1089;;;;;;;;:::o;7200:468::-;7265:6;7273;7322:2;7310:9;7301:7;7297:23;7293:32;7290:119;;;7328:79;;:::i;:::-;7290:119;7448:1;7473:53;7518:7;7509:6;7498:9;7494:22;7473:53;:::i;:::-;7463:63;;7419:117;7575:2;7601:50;7643:7;7634:6;7623:9;7619:22;7601:50;:::i;:::-;7591:60;;7546:115;7200:468;;;;;:::o;7674:474::-;7742:6;7750;7799:2;7787:9;7778:7;7774:23;7770:32;7767:119;;;7805:79;;:::i;:::-;7767:119;7925:1;7950:53;7995:7;7986:6;7975:9;7971:22;7950:53;:::i;:::-;7940:63;;7896:117;8052:2;8078:53;8123:7;8114:6;8103:9;8099:22;8078:53;:::i;:::-;8068:63;;8023:118;7674:474;;;;;:::o;8154:894::-;8272:6;8280;8329:2;8317:9;8308:7;8304:23;8300:32;8297:119;;;8335:79;;:::i;:::-;8297:119;8483:1;8472:9;8468:17;8455:31;8513:18;8505:6;8502:30;8499:117;;;8535:79;;:::i;:::-;8499:117;8640:78;8710:7;8701:6;8690:9;8686:22;8640:78;:::i;:::-;8630:88;;8426:302;8795:2;8784:9;8780:18;8767:32;8826:18;8818:6;8815:30;8812:117;;;8848:79;;:::i;:::-;8812:117;8953:78;9023:7;9014:6;9003:9;8999:22;8953:78;:::i;:::-;8943:88;;8738:303;8154:894;;;;;:::o;9054:327::-;9112:6;9161:2;9149:9;9140:7;9136:23;9132:32;9129:119;;;9167:79;;:::i;:::-;9129:119;9287:1;9312:52;9356:7;9347:6;9336:9;9332:22;9312:52;:::i;:::-;9302:62;;9258:116;9054:327;;;;:::o;9387:349::-;9456:6;9505:2;9493:9;9484:7;9480:23;9476:32;9473:119;;;9511:79;;:::i;:::-;9473:119;9631:1;9656:63;9711:7;9702:6;9691:9;9687:22;9656:63;:::i;:::-;9646:73;;9602:127;9387:349;;;;:::o;9742:329::-;9801:6;9850:2;9838:9;9829:7;9825:23;9821:32;9818:119;;;9856:79;;:::i;:::-;9818:119;9976:1;10001:53;10046:7;10037:6;10026:9;10022:22;10001:53;:::i;:::-;9991:63;;9947:117;9742:329;;;;:::o;10077:474::-;10145:6;10153;10202:2;10190:9;10181:7;10177:23;10173:32;10170:119;;;10208:79;;:::i;:::-;10170:119;10328:1;10353:53;10398:7;10389:6;10378:9;10374:22;10353:53;:::i;:::-;10343:63;;10299:117;10455:2;10481:53;10526:7;10517:6;10506:9;10502:22;10481:53;:::i;:::-;10471:63;;10426:118;10077:474;;;;;:::o;10557:179::-;10626:10;10647:46;10689:3;10681:6;10647:46;:::i;:::-;10725:4;10720:3;10716:14;10702:28;;10557:179;;;;:::o;10742:118::-;10829:24;10847:5;10829:24;:::i;:::-;10824:3;10817:37;10742:118;;:::o;10896:732::-;11015:3;11044:54;11092:5;11044:54;:::i;:::-;11114:86;11193:6;11188:3;11114:86;:::i;:::-;11107:93;;11224:56;11274:5;11224:56;:::i;:::-;11303:7;11334:1;11319:284;11344:6;11341:1;11338:13;11319:284;;;11420:6;11414:13;11447:63;11506:3;11491:13;11447:63;:::i;:::-;11440:70;;11533:60;11586:6;11533:60;:::i;:::-;11523:70;;11379:224;11366:1;11363;11359:9;11354:14;;11319:284;;;11323:14;11619:3;11612:10;;11020:608;;;10896:732;;;;:::o;11634:109::-;11715:21;11730:5;11715:21;:::i;:::-;11710:3;11703:34;11634:109;;:::o;11749:360::-;11835:3;11863:38;11895:5;11863:38;:::i;:::-;11917:70;11980:6;11975:3;11917:70;:::i;:::-;11910:77;;11996:52;12041:6;12036:3;12029:4;12022:5;12018:16;11996:52;:::i;:::-;12073:29;12095:6;12073:29;:::i;:::-;12068:3;12064:39;12057:46;;11839:270;11749:360;;;;:::o;12115:364::-;12203:3;12231:39;12264:5;12231:39;:::i;:::-;12286:71;12350:6;12345:3;12286:71;:::i;:::-;12279:78;;12366:52;12411:6;12406:3;12399:4;12392:5;12388:16;12366:52;:::i;:::-;12443:29;12465:6;12443:29;:::i;:::-;12438:3;12434:39;12427:46;;12207:272;12115:364;;;;:::o;12485:377::-;12591:3;12619:39;12652:5;12619:39;:::i;:::-;12674:89;12756:6;12751:3;12674:89;:::i;:::-;12667:96;;12772:52;12817:6;12812:3;12805:4;12798:5;12794:16;12772:52;:::i;:::-;12849:6;12844:3;12840:16;12833:23;;12595:267;12485:377;;;;:::o;12868:366::-;13010:3;13031:67;13095:2;13090:3;13031:67;:::i;:::-;13024:74;;13107:93;13196:3;13107:93;:::i;:::-;13225:2;13220:3;13216:12;13209:19;;12868:366;;;:::o;13240:::-;13382:3;13403:67;13467:2;13462:3;13403:67;:::i;:::-;13396:74;;13479:93;13568:3;13479:93;:::i;:::-;13597:2;13592:3;13588:12;13581:19;;13240:366;;;:::o;13612:::-;13754:3;13775:67;13839:2;13834:3;13775:67;:::i;:::-;13768:74;;13851:93;13940:3;13851:93;:::i;:::-;13969:2;13964:3;13960:12;13953:19;;13612:366;;;:::o;13984:::-;14126:3;14147:67;14211:2;14206:3;14147:67;:::i;:::-;14140:74;;14223:93;14312:3;14223:93;:::i;:::-;14341:2;14336:3;14332:12;14325:19;;13984:366;;;:::o;14356:::-;14498:3;14519:67;14583:2;14578:3;14519:67;:::i;:::-;14512:74;;14595:93;14684:3;14595:93;:::i;:::-;14713:2;14708:3;14704:12;14697:19;;14356:366;;;:::o;14728:::-;14870:3;14891:67;14955:2;14950:3;14891:67;:::i;:::-;14884:74;;14967:93;15056:3;14967:93;:::i;:::-;15085:2;15080:3;15076:12;15069:19;;14728:366;;;:::o;15100:::-;15242:3;15263:67;15327:2;15322:3;15263:67;:::i;:::-;15256:74;;15339:93;15428:3;15339:93;:::i;:::-;15457:2;15452:3;15448:12;15441:19;;15100:366;;;:::o;15472:402::-;15632:3;15653:85;15735:2;15730:3;15653:85;:::i;:::-;15646:92;;15747:93;15836:3;15747:93;:::i;:::-;15865:2;15860:3;15856:12;15849:19;;15472:402;;;:::o;15880:366::-;16022:3;16043:67;16107:2;16102:3;16043:67;:::i;:::-;16036:74;;16119:93;16208:3;16119:93;:::i;:::-;16237:2;16232:3;16228:12;16221:19;;15880:366;;;:::o;16252:400::-;16412:3;16433:84;16515:1;16510:3;16433:84;:::i;:::-;16426:91;;16526:93;16615:3;16526:93;:::i;:::-;16644:1;16639:3;16635:11;16628:18;;16252:400;;;:::o;16658:366::-;16800:3;16821:67;16885:2;16880:3;16821:67;:::i;:::-;16814:74;;16897:93;16986:3;16897:93;:::i;:::-;17015:2;17010:3;17006:12;16999:19;;16658:366;;;:::o;17030:::-;17172:3;17193:67;17257:2;17252:3;17193:67;:::i;:::-;17186:74;;17269:93;17358:3;17269:93;:::i;:::-;17387:2;17382:3;17378:12;17371:19;;17030:366;;;:::o;17402:::-;17544:3;17565:67;17629:2;17624:3;17565:67;:::i;:::-;17558:74;;17641:93;17730:3;17641:93;:::i;:::-;17759:2;17754:3;17750:12;17743:19;;17402:366;;;:::o;17774:::-;17916:3;17937:67;18001:2;17996:3;17937:67;:::i;:::-;17930:74;;18013:93;18102:3;18013:93;:::i;:::-;18131:2;18126:3;18122:12;18115:19;;17774:366;;;:::o;18146:::-;18288:3;18309:67;18373:2;18368:3;18309:67;:::i;:::-;18302:74;;18385:93;18474:3;18385:93;:::i;:::-;18503:2;18498:3;18494:12;18487:19;;18146:366;;;:::o;18518:108::-;18595:24;18613:5;18595:24;:::i;:::-;18590:3;18583:37;18518:108;;:::o;18632:118::-;18719:24;18737:5;18719:24;:::i;:::-;18714:3;18707:37;18632:118;;:::o;18756:807::-;19090:3;19112:148;19256:3;19112:148;:::i;:::-;19105:155;;19277:95;19368:3;19359:6;19277:95;:::i;:::-;19270:102;;19389:148;19533:3;19389:148;:::i;:::-;19382:155;;19554:3;19547:10;;18756:807;;;;:::o;19569:222::-;19662:4;19700:2;19689:9;19685:18;19677:26;;19713:71;19781:1;19770:9;19766:17;19757:6;19713:71;:::i;:::-;19569:222;;;;:::o;19797:1053::-;20120:4;20158:3;20147:9;20143:19;20135:27;;20172:71;20240:1;20229:9;20225:17;20216:6;20172:71;:::i;:::-;20253:72;20321:2;20310:9;20306:18;20297:6;20253:72;:::i;:::-;20372:9;20366:4;20362:20;20357:2;20346:9;20342:18;20335:48;20400:108;20503:4;20494:6;20400:108;:::i;:::-;20392:116;;20555:9;20549:4;20545:20;20540:2;20529:9;20525:18;20518:48;20583:108;20686:4;20677:6;20583:108;:::i;:::-;20575:116;;20739:9;20733:4;20729:20;20723:3;20712:9;20708:19;20701:49;20767:76;20838:4;20829:6;20767:76;:::i;:::-;20759:84;;19797:1053;;;;;;;;:::o;20856:751::-;21079:4;21117:3;21106:9;21102:19;21094:27;;21131:71;21199:1;21188:9;21184:17;21175:6;21131:71;:::i;:::-;21212:72;21280:2;21269:9;21265:18;21256:6;21212:72;:::i;:::-;21294;21362:2;21351:9;21347:18;21338:6;21294:72;:::i;:::-;21376;21444:2;21433:9;21429:18;21420:6;21376:72;:::i;:::-;21496:9;21490:4;21486:20;21480:3;21469:9;21465:19;21458:49;21524:76;21595:4;21586:6;21524:76;:::i;:::-;21516:84;;20856:751;;;;;;;;:::o;21613:373::-;21756:4;21794:2;21783:9;21779:18;21771:26;;21843:9;21837:4;21833:20;21829:1;21818:9;21814:17;21807:47;21871:108;21974:4;21965:6;21871:108;:::i;:::-;21863:116;;21613:373;;;;:::o;21992:634::-;22213:4;22251:2;22240:9;22236:18;22228:26;;22300:9;22294:4;22290:20;22286:1;22275:9;22271:17;22264:47;22328:108;22431:4;22422:6;22328:108;:::i;:::-;22320:116;;22483:9;22477:4;22473:20;22468:2;22457:9;22453:18;22446:48;22511:108;22614:4;22605:6;22511:108;:::i;:::-;22503:116;;21992:634;;;;;:::o;22632:210::-;22719:4;22757:2;22746:9;22742:18;22734:26;;22770:65;22832:1;22821:9;22817:17;22808:6;22770:65;:::i;:::-;22632:210;;;;:::o;22848:313::-;22961:4;22999:2;22988:9;22984:18;22976:26;;23048:9;23042:4;23038:20;23034:1;23023:9;23019:17;23012:47;23076:78;23149:4;23140:6;23076:78;:::i;:::-;23068:86;;22848:313;;;;:::o;23167:419::-;23333:4;23371:2;23360:9;23356:18;23348:26;;23420:9;23414:4;23410:20;23406:1;23395:9;23391:17;23384:47;23448:131;23574:4;23448:131;:::i;:::-;23440:139;;23167:419;;;:::o;23592:::-;23758:4;23796:2;23785:9;23781:18;23773:26;;23845:9;23839:4;23835:20;23831:1;23820:9;23816:17;23809:47;23873:131;23999:4;23873:131;:::i;:::-;23865:139;;23592:419;;;:::o;24017:::-;24183:4;24221:2;24210:9;24206:18;24198:26;;24270:9;24264:4;24260:20;24256:1;24245:9;24241:17;24234:47;24298:131;24424:4;24298:131;:::i;:::-;24290:139;;24017:419;;;:::o;24442:::-;24608:4;24646:2;24635:9;24631:18;24623:26;;24695:9;24689:4;24685:20;24681:1;24670:9;24666:17;24659:47;24723:131;24849:4;24723:131;:::i;:::-;24715:139;;24442:419;;;:::o;24867:::-;25033:4;25071:2;25060:9;25056:18;25048:26;;25120:9;25114:4;25110:20;25106:1;25095:9;25091:17;25084:47;25148:131;25274:4;25148:131;:::i;:::-;25140:139;;24867:419;;;:::o;25292:::-;25458:4;25496:2;25485:9;25481:18;25473:26;;25545:9;25539:4;25535:20;25531:1;25520:9;25516:17;25509:47;25573:131;25699:4;25573:131;:::i;:::-;25565:139;;25292:419;;;:::o;25717:::-;25883:4;25921:2;25910:9;25906:18;25898:26;;25970:9;25964:4;25960:20;25956:1;25945:9;25941:17;25934:47;25998:131;26124:4;25998:131;:::i;:::-;25990:139;;25717:419;;;:::o;26142:::-;26308:4;26346:2;26335:9;26331:18;26323:26;;26395:9;26389:4;26385:20;26381:1;26370:9;26366:17;26359:47;26423:131;26549:4;26423:131;:::i;:::-;26415:139;;26142:419;;;:::o;26567:::-;26733:4;26771:2;26760:9;26756:18;26748:26;;26820:9;26814:4;26810:20;26806:1;26795:9;26791:17;26784:47;26848:131;26974:4;26848:131;:::i;:::-;26840:139;;26567:419;;;:::o;26992:::-;27158:4;27196:2;27185:9;27181:18;27173:26;;27245:9;27239:4;27235:20;27231:1;27220:9;27216:17;27209:47;27273:131;27399:4;27273:131;:::i;:::-;27265:139;;26992:419;;;:::o;27417:::-;27583:4;27621:2;27610:9;27606:18;27598:26;;27670:9;27664:4;27660:20;27656:1;27645:9;27641:17;27634:47;27698:131;27824:4;27698:131;:::i;:::-;27690:139;;27417:419;;;:::o;27842:::-;28008:4;28046:2;28035:9;28031:18;28023:26;;28095:9;28089:4;28085:20;28081:1;28070:9;28066:17;28059:47;28123:131;28249:4;28123:131;:::i;:::-;28115:139;;27842:419;;;:::o;28267:::-;28433:4;28471:2;28460:9;28456:18;28448:26;;28520:9;28514:4;28510:20;28506:1;28495:9;28491:17;28484:47;28548:131;28674:4;28548:131;:::i;:::-;28540:139;;28267:419;;;:::o;28692:222::-;28785:4;28823:2;28812:9;28808:18;28800:26;;28836:71;28904:1;28893:9;28889:17;28880:6;28836:71;:::i;:::-;28692:222;;;;:::o;28920:332::-;29041:4;29079:2;29068:9;29064:18;29056:26;;29092:71;29160:1;29149:9;29145:17;29136:6;29092:71;:::i;:::-;29173:72;29241:2;29230:9;29226:18;29217:6;29173:72;:::i;:::-;28920:332;;;;;:::o;29258:129::-;29292:6;29319:20;;:::i;:::-;29309:30;;29348:33;29376:4;29368:6;29348:33;:::i;:::-;29258:129;;;:::o;29393:75::-;29426:6;29459:2;29453:9;29443:19;;29393:75;:::o;29474:311::-;29551:4;29641:18;29633:6;29630:30;29627:56;;;29663:18;;:::i;:::-;29627:56;29713:4;29705:6;29701:17;29693:25;;29773:4;29767;29763:15;29755:23;;29474:311;;;:::o;29791:::-;29868:4;29958:18;29950:6;29947:30;29944:56;;;29980:18;;:::i;:::-;29944:56;30030:4;30022:6;30018:17;30010:25;;30090:4;30084;30080:15;30072:23;;29791:311;;;:::o;30108:307::-;30169:4;30259:18;30251:6;30248:30;30245:56;;;30281:18;;:::i;:::-;30245:56;30319:29;30341:6;30319:29;:::i;:::-;30311:37;;30403:4;30397;30393:15;30385:23;;30108:307;;;:::o;30421:132::-;30488:4;30511:3;30503:11;;30541:4;30536:3;30532:14;30524:22;;30421:132;;;:::o;30559:114::-;30626:6;30660:5;30654:12;30644:22;;30559:114;;;:::o;30679:98::-;30730:6;30764:5;30758:12;30748:22;;30679:98;;;:::o;30783:99::-;30835:6;30869:5;30863:12;30853:22;;30783:99;;;:::o;30888:113::-;30958:4;30990;30985:3;30981:14;30973:22;;30888:113;;;:::o;31007:184::-;31106:11;31140:6;31135:3;31128:19;31180:4;31175:3;31171:14;31156:29;;31007:184;;;;:::o;31197:168::-;31280:11;31314:6;31309:3;31302:19;31354:4;31349:3;31345:14;31330:29;;31197:168;;;;:::o;31371:169::-;31455:11;31489:6;31484:3;31477:19;31529:4;31524:3;31520:14;31505:29;;31371:169;;;;:::o;31546:148::-;31648:11;31685:3;31670:18;;31546:148;;;;:::o;31700:305::-;31740:3;31759:20;31777:1;31759:20;:::i;:::-;31754:25;;31793:20;31811:1;31793:20;:::i;:::-;31788:25;;31947:1;31879:66;31875:74;31872:1;31869:81;31866:107;;;31953:18;;:::i;:::-;31866:107;31997:1;31994;31990:9;31983:16;;31700:305;;;;:::o;32011:185::-;32051:1;32068:20;32086:1;32068:20;:::i;:::-;32063:25;;32102:20;32120:1;32102:20;:::i;:::-;32097:25;;32141:1;32131:35;;32146:18;;:::i;:::-;32131:35;32188:1;32185;32181:9;32176:14;;32011:185;;;;:::o;32202:191::-;32242:4;32262:20;32280:1;32262:20;:::i;:::-;32257:25;;32296:20;32314:1;32296:20;:::i;:::-;32291:25;;32335:1;32332;32329:8;32326:34;;;32340:18;;:::i;:::-;32326:34;32385:1;32382;32378:9;32370:17;;32202:191;;;;:::o;32399:96::-;32436:7;32465:24;32483:5;32465:24;:::i;:::-;32454:35;;32399:96;;;:::o;32501:90::-;32535:7;32578:5;32571:13;32564:21;32553:32;;32501:90;;;:::o;32597:149::-;32633:7;32673:66;32666:5;32662:78;32651:89;;32597:149;;;:::o;32752:126::-;32789:7;32829:42;32822:5;32818:54;32807:65;;32752:126;;;:::o;32884:77::-;32921:7;32950:5;32939:16;;32884:77;;;:::o;32967:154::-;33051:6;33046:3;33041;33028:30;33113:1;33104:6;33099:3;33095:16;33088:27;32967:154;;;:::o;33127:307::-;33195:1;33205:113;33219:6;33216:1;33213:13;33205:113;;;33304:1;33299:3;33295:11;33289:18;33285:1;33280:3;33276:11;33269:39;33241:2;33238:1;33234:10;33229:15;;33205:113;;;33336:6;33333:1;33330:13;33327:101;;;33416:1;33407:6;33402:3;33398:16;33391:27;33327:101;33176:258;33127:307;;;:::o;33440:320::-;33484:6;33521:1;33515:4;33511:12;33501:22;;33568:1;33562:4;33558:12;33589:18;33579:81;;33645:4;33637:6;33633:17;33623:27;;33579:81;33707:2;33699:6;33696:14;33676:18;33673:38;33670:84;;;33726:18;;:::i;:::-;33670:84;33491:269;33440:320;;;:::o;33766:281::-;33849:27;33871:4;33849:27;:::i;:::-;33841:6;33837:40;33979:6;33967:10;33964:22;33943:18;33931:10;33928:34;33925:62;33922:88;;;33990:18;;:::i;:::-;33922:88;34030:10;34026:2;34019:22;33809:238;33766:281;;:::o;34053:233::-;34092:3;34115:24;34133:5;34115:24;:::i;:::-;34106:33;;34161:66;34154:5;34151:77;34148:103;;;34231:18;;:::i;:::-;34148:103;34278:1;34271:5;34267:13;34260:20;;34053:233;;;:::o;34292:176::-;34324:1;34341:20;34359:1;34341:20;:::i;:::-;34336:25;;34375:20;34393:1;34375:20;:::i;:::-;34370:25;;34414:1;34404:35;;34419:18;;:::i;:::-;34404:35;34460:1;34457;34453:9;34448:14;;34292:176;;;;:::o;34474:180::-;34522:77;34519:1;34512:88;34619:4;34616:1;34609:15;34643:4;34640:1;34633:15;34660:180;34708:77;34705:1;34698:88;34805:4;34802:1;34795:15;34829:4;34826:1;34819:15;34846:180;34894:77;34891:1;34884:88;34991:4;34988:1;34981:15;35015:4;35012:1;35005:15;35032:180;35080:77;35077:1;35070:88;35177:4;35174:1;35167:15;35201:4;35198:1;35191:15;35218:180;35266:77;35263:1;35256:88;35363:4;35360:1;35353:15;35387:4;35384:1;35377:15;35404:183;35439:3;35477:1;35459:16;35456:23;35453:128;;;35515:1;35512;35509;35494:23;35537:34;35568:1;35562:8;35537:34;:::i;:::-;35530:41;;35453:128;35404:183;:::o;35593:117::-;35702:1;35699;35692:12;35716:117;35825:1;35822;35815:12;35839:117;35948:1;35945;35938:12;35962:117;36071:1;36068;36061:12;36085:117;36194:1;36191;36184:12;36208:102;36249:6;36300:2;36296:7;36291:2;36284:5;36280:14;36276:28;36266:38;;36208:102;;;:::o;36316:106::-;36360:8;36409:5;36404:3;36400:15;36379:36;;36316:106;;;:::o;36428:239::-;36568:34;36564:1;36556:6;36552:14;36545:58;36637:22;36632:2;36624:6;36620:15;36613:47;36428:239;:::o;36673:227::-;36813:34;36809:1;36801:6;36797:14;36790:58;36882:10;36877:2;36869:6;36865:15;36858:35;36673:227;:::o;36906:230::-;37046:34;37042:1;37034:6;37030:14;37023:58;37115:13;37110:2;37102:6;37098:15;37091:38;36906:230;:::o;37142:225::-;37282:34;37278:1;37270:6;37266:14;37259:58;37351:8;37346:2;37338:6;37334:15;37327:33;37142:225;:::o;37373:228::-;37513:34;37509:1;37501:6;37497:14;37490:58;37582:11;37577:2;37569:6;37565:15;37558:36;37373:228;:::o;37607:224::-;37747:34;37743:1;37735:6;37731:14;37724:58;37816:7;37811:2;37803:6;37799:15;37792:32;37607:224;:::o;37837:237::-;37977:34;37973:1;37965:6;37961:14;37954:58;38046:20;38041:2;38033:6;38029:15;38022:45;37837:237;:::o;38080:325::-;38220:34;38216:1;38208:6;38204:14;38197:58;38293:34;38288:2;38280:6;38276:15;38269:59;38366:27;38361:2;38353:6;38349:15;38342:52;38080:325;:::o;38415:241::-;38559:34;38555:1;38547:6;38543:14;38536:58;38632:12;38627:2;38619:6;38615:15;38608:37;38415:241;:::o;38666:163::-;38810:7;38806:1;38798:6;38794:14;38787:31;38666:163;:::o;38839:190::-;38983:34;38979:1;38971:6;38967:14;38960:58;38839:190;:::o;39039:240::-;39183:34;39179:1;39171:6;39167:14;39160:58;39256:11;39251:2;39243:6;39239:15;39232:36;39039:240;:::o;39289:::-;39433:34;39429:1;39421:6;39417:14;39410:58;39506:11;39501:2;39493:6;39489:15;39482:36;39289:240;:::o;39539:239::-;39683:34;39679:1;39671:6;39667:14;39660:58;39756:10;39751:2;39743:6;39739:15;39732:35;39539:239;:::o;39788:232::-;39932:34;39928:1;39920:6;39916:14;39909:58;40005:3;40000:2;39992:6;39988:15;39981:28;39788:232;:::o;40030:783::-;40069:3;40111:4;40093:16;40090:26;40087:39;;;40119:5;;40087:39;40152:20;;:::i;:::-;40231:1;40213:16;40209:24;40206:1;40200:4;40185:49;40268:4;40262:11;40379:16;40372:4;40364:6;40360:17;40357:39;40320:18;40312:6;40309:30;40289:125;40286:166;;;40433:5;;;;40286:166;40487:6;40481:4;40477:17;40527:3;40521:10;40558:18;40550:6;40547:30;40544:43;;;40580:5;;;;;;40544:43;40632:6;40625:4;40620:3;40616:14;40612:27;40695:1;40677:16;40673:24;40667:4;40663:35;40658:3;40655:44;40652:57;;;40702:5;;;;;;;40652:57;40723;40771:6;40765:4;40761:17;40753:6;40749:30;40743:4;40723:57;:::i;:::-;40800:3;40793:10;;40073:740;;;;;40030:783;;:::o;40823:130::-;40900:24;40918:5;40900:24;:::i;:::-;40893:5;40890:35;40880:63;;40939:1;40936;40929:12;40880:63;40823:130;:::o;40963:124::-;41037:21;41052:5;41037:21;:::i;:::-;41030:5;41027:32;41017:60;;41073:1;41070;41063:12;41017:60;40963:124;:::o;41097:128::-;41173:23;41190:5;41173:23;:::i;:::-;41166:5;41163:34;41153:62;;41211:1;41208;41201:12;41153:62;41097:128;:::o;41235:130::-;41312:24;41330:5;41312:24;:::i;:::-;41305:5;41302:35;41292:63;;41351:1;41348;41341:12;41292:63;41235:130;:::o

Swarm Source

ipfs://6c7788fe8df5ddc38796bbc3be006fa1f23bf9c3a5402248c14bec6f5576c238
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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