Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Batch Mint With ... | 16441049 | 703 days ago | IN | 0 ETH | 0.00330378 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LondonToken
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./Ownable.sol"; import "./ERC1155.sol"; import "./ERC2981PerTokenRoyalties.sol"; import {DefaultOperatorFilterer} from "./DefaultOperatorFilterer.sol"; /// @custom:security-contact [email protected] contract LondonToken is ERC1155, Ownable, ERC2981PerTokenRoyalties, DefaultOperatorFilterer { constructor( string memory uri_, address minter_, address gatewayManager_, string memory contractName_ ) ERC1155(uri_) { mintingManager = minter_; gatewayManager = gatewayManager_; name = contractName_; } string public name = "Verse Works v0.4.0"; uint256 public totalSupply; address public mintingManager; address public gatewayManager; modifier onlyMinter() { require(msg.sender == mintingManager); _; } modifier onlyGatewayManager() { require(msg.sender == gatewayManager); _; } /** * @dev OS Operator filtering */ function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } /** * @dev OS Operator filtering */ function safeTransferFrom( address from, address to, uint256 tokenId, uint256 amount, bytes memory data ) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, amount, data); } /** * @dev OS Operator filtering */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override onlyAllowedOperator(from) { super.safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`. * * 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 account, uint256 id, uint256 amount, string memory cid, address royaltyRecipient, uint256 royaltyValue ) public onlyMinter { _mint(account, id, amount, ""); if (royaltyValue > 0) { _setTokenRoyalty(id, royaltyRecipient, royaltyValue); } cids[id] = cid; totalSupply += amount; } /** * @dev Batch 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, string[] memory tokenCids, address[] memory royaltyRecipients, uint256[] memory royaltyValues ) public onlyMinter { require( ids.length == royaltyRecipients.length && ids.length == royaltyValues.length, "ERC1155: Arrays length mismatch" ); _mintBatch(to, ids, amounts, ""); for (uint256 i; i < ids.length; i++) { if (royaltyValues[i] > 0) { _setTokenRoyalty( ids[i], royaltyRecipients[i], royaltyValues[i] ); } // update IPFS CID cids[ids[i]] = tokenCids[i]; } uint256 count; for (uint256 i = 0; i < ids.length; i++) { for (uint256 j = 0; j < amounts.length; j++) { count += ids[i] * amounts[j]; } } totalSupply += count; } /** * @dev Checks for supported interface. * */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981Base) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`. * Method emits two transfer events. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. */ function mintWithCreator( address creator, address to, uint256 tokenId, string memory cid, address royaltyRecipient, uint256 royaltyValue ) public onlyMinter { require(to != address(0), "mint to the zero address"); balances[tokenId][to] += 1; totalSupply += 1; cids[tokenId] = cid; if (royaltyValue > 0) { _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue); } address operator = _msgSender(); emit TransferSingle(operator, address(0), creator, tokenId, 1); emit TransferSingle(operator, creator, to, tokenId, 1); } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`. * Method emits two transfer events. * * Emits a {TransferSingle} events for intermediate artist. * * 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 batchMintWithCreator( address[] memory to, address creator, uint256[] memory tokenIds, string[] memory tokenCids, address royaltyRecipient, uint256 royaltyValue ) public onlyMinter { require( tokenIds.length == to.length && tokenIds.length == tokenCids.length, "ERC1155: Arrays length mismatch" ); address operator = _msgSender(); for (uint256 i = 0; i < tokenIds.length; i++) { balances[tokenIds[i]][to[i]] += 1; // check if recipient can accept NFT _doSafeTransferAcceptanceCheck( operator, address(0), to[i], tokenIds[i], 1, "" ); // update royalties if (royaltyValue > 0) { _setTokenRoyalty(tokenIds[i], royaltyRecipient, royaltyValue); } // update IPFS CID cids[tokenIds[i]] = tokenCids[i]; // emit events based on creator provided if (creator == address(0)) { emit TransferSingle( operator, address(0), to[i], tokenIds[i], 1 ); } else { emit TransferSingle( operator, address(0), creator, tokenIds[i], 1 ); emit TransferSingle(operator, creator, to[i], tokenIds[i], 1); } } // update total supply totalSupply += tokenIds.length; } /** * @dev Sets base URI for metadata. * */ function setURI(string memory newuri) public onlyGatewayManager { _setURI(newuri); } /** * @dev Sets new minter for the contract. * */ function setMintingManager(address minter_) public onlyOwner { mintingManager = minter_; } /** * @dev Sets new gateway manager for the contract. * */ function setGatewayManager(address gatewayManager_) public onlyOwner { gatewayManager = gatewayManager_; } /** * @dev Sets royalties for `tokenId` and `tokenRecipient` with royalty value `royaltyValue`. * */ function setRoyalties( uint256 tokenId, address royaltyRecipient, uint256 royaltyValue ) public onlyOwner { _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue); } /** * @dev Sets IPFS cid metadata hash for token id `tokenId`. * */ function setCID(uint256 tokenId, string memory cid) public onlyGatewayManager { cids[tokenId] = cid; } /** * @dev Sets IPFS cid metadata hash for token id `tokenId`. * */ function setCIDs(uint256[] memory tokenIds, string[] memory cids_) public onlyGatewayManager { require( tokenIds.length == cids_.length, "ERC1155: Arrays length mismatch" ); for (uint256 i = 0; i < tokenIds.length; i++) { cids[tokenIds[i]] = cids_[i]; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {OperatorFilterer} from "./OperatorFilterer.sol"; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol) pragma solidity 0.8.13; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./IERC1155MetadataURI.sol"; import "./Address.sol"; import "./Context.sol"; import "./ERC165.sol"; import "./Strings.sol"; /** * @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)) public balances; // Mapping from token ID to the IPFS cid mapping(uint256 => string) public cids; // 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. string public baseUri; /** * @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 id) public view virtual override returns (string memory) { return string(abi.encodePacked(baseUri, cids[id])); } /** * @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(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, 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); _afterTokenTransfer(operator, from, to, ids, amounts, data); _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); _afterTokenTransfer(operator, from, to, ids, amounts, data); _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 { baseUri = 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(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _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 TransferSingle(operator, address(0), to, ids[i], amounts[i]); } _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck( operator, address(0), to, ids, amounts, data ); } /** * @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 {} /** * @dev Hook that is called after 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 _afterTokenTransfer( 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 ) public { 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./ERC165.sol"; import "./IERC2981Royalties.sol"; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981Base is ERC165, IERC2981Royalties { struct RoyaltyInfo { address recipient; uint24 amount; } /// @inheritdoc ERC165 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC2981Royalties).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./ERC165.sol"; import "./ERC2981Base.sol"; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981PerTokenRoyalties is ERC2981Base { mapping(uint256 => RoyaltyInfo) internal _royalties; /// @dev Sets token royalties /// @param tokenId the token id fir which we register the royalties /// @param recipient recipient of the royalties /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0) function _setTokenRoyalty( uint256 tokenId, address recipient, uint256 value ) internal { require(value <= 10000, "ERC2981Royalties: Too high"); _royalties[tokenId] = RoyaltyInfo(recipient, uint24(value)); } /// @inheritdoc IERC2981Royalties function royaltyInfo(uint256 tokenId, uint256 value) external view override returns (address receiver, uint256 royaltyAmount) { RoyaltyInfo memory royalties = _royalties[tokenId]; receiver = royalties.recipient; royaltyAmount = (value * royalties.amount) / 10000; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; /// @title IERC2981Royalties /// @dev Interface for the ERC2981 - Token Royalty standard interface IERC2981Royalties { /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _value - the sale price of the NFT asset specified by _tokenId /// @return _receiver - address of who should be sent the royalty payment /// @return _royaltyAmount - the royalty payment amount for value sale price function royaltyInfo(uint256 _tokenId, uint256 _value) external view returns (address _receiver, uint256 _royaltyAmount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"uri_","type":"string"},{"internalType":"address","name":"minter_","type":"address"},{"internalType":"address","name":"gatewayManager_","type":"address"},{"internalType":"string","name":"contractName_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"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":"_doSafeTransferAcceptanceCheck","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenCids","type":"string[]"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"batchMintWithCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cids","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gatewayManager","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"string[]","name":"tokenCids","type":"string[]"},{"internalType":"address[]","name":"royaltyRecipients","type":"address[]"},{"internalType":"uint256[]","name":"royaltyValues","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"mintWithCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"tokenId","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"}],"name":"setCID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"cids_","type":"string[]"}],"name":"setCIDs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gatewayManager_","type":"address"}],"name":"setGatewayManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"setMintingManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526040518060400160405280601281526020017f566572736520576f726b732076302e342e300000000000000000000000000000815250600690805190602001906200005192919062000455565b503480156200005f57600080fd5b50604051620059e5380380620059e5833981810160405281019062000085919062000707565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600185620000ae816200036b60201b60201c565b50620000cf620000c36200038760201b60201c565b6200038f60201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002c45780156200018a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000150929190620007c8565b600060405180830381600087803b1580156200016b57600080fd5b505af115801562000180573d6000803e3d6000fd5b50505050620002c3565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000244576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200020a929190620007c8565b600060405180830381600087803b1580156200022557600080fd5b505af11580156200023a573d6000803e3d6000fd5b50505050620002c2565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200028d9190620007f5565b600060405180830381600087803b158015620002a857600080fd5b505af1158015620002bd573d6000803e3d6000fd5b505050505b5b5b505082600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600690805190602001906200036092919062000455565b505050505062000876565b80600390805190602001906200038392919062000455565b5050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004639062000841565b90600052602060002090601f016020900481019282620004875760008555620004d3565b82601f10620004a257805160ff1916838001178555620004d3565b82800160010185558215620004d3579182015b82811115620004d2578251825591602001919060010190620004b5565b5b509050620004e29190620004e6565b5090565b5b8082111562000501576000816000905550600101620004e7565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200056e8262000523565b810181811067ffffffffffffffff8211171562000590576200058f62000534565b5b80604052505050565b6000620005a562000505565b9050620005b3828262000563565b919050565b600067ffffffffffffffff821115620005d657620005d562000534565b5b620005e18262000523565b9050602081019050919050565b60005b838110156200060e578082015181840152602081019050620005f1565b838111156200061e576000848401525b50505050565b60006200063b6200063584620005b8565b62000599565b9050828152602081018484840111156200065a57620006596200051e565b5b62000667848285620005ee565b509392505050565b600082601f83011262000687576200068662000519565b5b81516200069984826020860162000624565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006cf82620006a2565b9050919050565b620006e181620006c2565b8114620006ed57600080fd5b50565b6000815190506200070181620006d6565b92915050565b600080600080608085870312156200072457620007236200050f565b5b600085015167ffffffffffffffff81111562000745576200074462000514565b5b62000753878288016200066f565b94505060206200076687828801620006f0565b93505060406200077987828801620006f0565b925050606085015167ffffffffffffffff8111156200079d576200079c62000514565b5b620007ab878288016200066f565b91505092959194509250565b620007c281620006c2565b82525050565b6000604082019050620007df6000830185620007b7565b620007ee6020830184620007b7565b9392505050565b60006020820190506200080c6000830184620007b7565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200085a57607f821691505b60208210810362000870576200086f62000812565b5b50919050565b61515f80620008866000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c806369b520171161010f5780639abc8320116100a2578063e2c7f33811610071578063e2c7f33814610566578063e985e9c514610582578063f242432a146105b2578063f2fde38b146105ce576101e4565b80639abc8320146104f25780639e42639914610510578063a22cb4651461052c578063d0414c9d14610548576101e4565b806382295a2d116100de57806382295a2d146104805780638d2bb0931461049c5780638da5cb5b146104b857806398faf29b146104d6576101e4565b806369b520171461040e5780636c52c3fb1461042a578063704fe71014610446578063715018a614610476576101e4565b80631f320331116101875780633a330022116101565780633a3300221461038657806341f43434146103a25780634e1273f4146103c057806358884432146103f0576101e4565b80631f320331146102ed5780632a55205a1461031d5780632eb2c2d61461034e578063337648b21461036a576101e4565b806306fdde03116101c357806306fdde0314610265578063084e9e24146102835780630e89341c1461029f57806318160ddd146102cf576101e4565b8062fdd58e146101e957806301ffc9a71461021957806302fe530514610249575b600080fd5b61020360048036038101906101fe91906131e9565b6105ea565b6040516102109190613238565b60405180910390f35b610233600480360381019061022e91906132ab565b6106b2565b60405161024091906132f3565b60405180910390f35b610263600480360381019061025e9190613454565b6106c4565b005b61026d61072a565b60405161027a9190613525565b60405180910390f35b61029d600480360381019061029891906135e8565b6107b8565b005b6102b960048036038101906102b49190613691565b61098f565b6040516102c69190613525565b60405180910390f35b6102d76109cd565b6040516102e49190613238565b60405180910390f35b610307600480360381019061030291906136be565b6109d3565b6040516103149190613238565b60405180910390f35b610337600480360381019061033291906136fe565b6109f8565b60405161034592919061374d565b60405180910390f35b6103686004803603810190610363919061383e565b610ac9565b005b610384600480360381019061037f91906139ee565b610b1c565b005b6103a0600480360381019061039b9190613a66565b610c3a565b005b6103aa610c86565b6040516103b79190613af2565b60405180910390f35b6103da60048036038101906103d59190613bd0565b610c98565b6040516103e79190613d06565b60405180910390f35b6103f8610db1565b6040516104059190613d28565b60405180910390f35b61042860048036038101906104239190613d43565b610dd7565b005b610444600480360381019061043f9190613a66565b61104a565b005b610460600480360381019061045b9190613691565b611096565b60405161046d9190613525565b60405180910390f35b61047e611136565b005b61049a60048036038101906104959190613e5c565b61114a565b005b6104b660048036038101906104b19190613eb8565b6111d0565b005b6104c061146b565b6040516104cd9190613d28565b60405180910390f35b6104f060048036038101906104eb9190613f61565b611495565b005b6104fa611568565b6040516105079190613525565b60405180910390f35b61052a6004803603810190610525919061400a565b6115f6565b005b61054660048036038101906105419190614117565b611aa4565b005b610550611abd565b60405161055d9190613d28565b60405180910390f35b610580600480360381019061057b9190614157565b611ae3565b005b61059c600480360381019061059791906141aa565b611afb565b6040516105a991906132f3565b60405180910390f35b6105cc60048036038101906105c791906141ea565b611b8f565b005b6105e860048036038101906105e39190613a66565b611be2565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361065a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610651906142f3565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006106bd82611c65565b9050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461071e57600080fd5b61072781611cdf565b50565b6006805461073790614342565b80601f016020809104026020016040519081016040528092919081815260200182805461076390614342565b80156107b05780601f10610785576101008083540402835291602001916107b0565b820191906000526020600020905b81548152906001019060200180831161079357829003601f168201915b505050505081565b6107d78473ffffffffffffffffffffffffffffffffffffffff16611cf9565b15610987578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161081d9594939291906143c8565b6020604051808303816000875af192505050801561085957506040513d601f19601f820116820180604052508101906108569190614437565b60015b6108fe57610865614471565b806308c379a0036108c15750610879614493565b8061088457506108c3565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b89190613525565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590614595565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097c90614627565b60405180910390fd5b505b505050505050565b60606003600160008481526020019081526020016000206040516020016109b79291906146e6565b6040516020818303038152906040529050919050565b60075481565b6000602052816000526040600020602052806000526040600020600091509150505481565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff1685610ab59190614739565b610abf91906147c2565b9150509250929050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b0757610b0633611d1c565b5b610b148686868686611e19565b505050505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7657600080fd5b8051825114610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb19061483f565b60405180910390fd5b60005b8251811015610c3557818181518110610bd957610bd861485f565b5b602002602001015160016000858481518110610bf857610bf761485f565b5b602002602001015181526020019081526020016000209080519060200190610c2192919061309e565b508080610c2d9061488e565b915050610bbd565b505050565b610c42611eba565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6daaeb6d7670e522a718067333cd4e81565b60608151835114610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd590614948565b60405180910390fd5b6000835167ffffffffffffffff811115610cfb57610cfa613329565b5b604051908082528060200260200182016040528015610d295781602001602082028036833780820191505090505b50905060005b8451811015610da657610d76858281518110610d4e57610d4d61485f565b5b6020026020010151858381518110610d6957610d6861485f565b5b60200260200101516105ea565b828281518110610d8957610d8861485f565b5b60200260200101818152505080610d9f9061488e565b9050610d2f565b508091505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e3157600080fd5b81518551148015610e43575080518551145b610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e799061483f565b60405180910390fd5b610e9d86868660405180602001604052806000815250611f38565b60005b8551811015610f95576000828281518110610ebe57610ebd61485f565b5b60200260200101511115610f2657610f25868281518110610ee257610ee161485f565b5b6020026020010151848381518110610efd57610efc61485f565b5b6020026020010151848481518110610f1857610f1761485f565b5b6020026020010151612198565b5b838181518110610f3957610f3861485f565b5b602002602001015160016000888481518110610f5857610f5761485f565b5b602002602001015181526020019081526020016000209080519060200190610f8192919061309e565b508080610f8d9061488e565b915050610ea0565b50600080600090505b86518110156110275760005b865181101561101357868181518110610fc657610fc561485f565b5b6020026020010151888381518110610fe157610fe061485f565b5b6020026020010151610ff39190614739565b83610ffe9190614968565b9250808061100b9061488e565b915050610faa565b50808061101f9061488e565b915050610f9e565b50806007600082825461103a9190614968565b9250508190555050505050505050565b611052611eba565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160205280600052604060002060009150905080546110b590614342565b80601f01602080910402602001604051908101604052809291908181526020018280546110e190614342565b801561112e5780601f106111035761010080835404028352916020019161112e565b820191906000526020600020905b81548152906001019060200180831161111157829003601f168201915b505050505081565b61113e611eba565b6111486000612294565b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111a457600080fd5b806001600084815260200190815260200160002090805190602001906111cb92919061309e565b505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461122a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129090614a0a565b60405180910390fd5b600160008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112f99190614968565b925050819055506001600760008282546113139190614968565b925050819055508260016000868152602001908152602001600020908051906020019061134192919061309e565b50600081111561135757611356848383612198565b5b600061136161235a565b90508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628860016040516113db929190614a65565b60405180910390a48573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288600160405161145a929190614a65565b60405180910390a450505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ef57600080fd5b61150a86868660405180602001604052806000815250612362565b600081111561151f5761151e858383612198565b5b8260016000878152602001908152602001600020908051906020019061154692919061309e565b5083600760008282546115599190614968565b92505081905550505050505050565b6003805461157590614342565b80601f01602080910402602001604051908101604052809291908181526020018280546115a190614342565b80156115ee5780601f106115c3576101008083540402835291602001916115ee565b820191906000526020600020905b8154815290600101906020018083116115d157829003601f168201915b505050505081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461165057600080fd5b85518451148015611662575082518451145b6116a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116989061483f565b60405180910390fd5b60006116ab61235a565b905060005b8551811015611a805760016000808884815181106116d1576116d061485f565b5b6020026020010151815260200190815260200160002060008a84815181106116fc576116fb61485f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461174d9190614968565b925050819055506117a78260008a848151811061176d5761176c61485f565b5b60200260200101518985815181106117885761178761485f565b5b60200260200101516001604051806020016040528060008152506107b8565b60008311156117d6576117d58682815181106117c6576117c561485f565b5b60200260200101518585612198565b5b8481815181106117e9576117e861485f565b5b6020026020010151600160008884815181106118085761180761485f565b5b60200260200101518152602001908152602001600020908051906020019061183192919061309e565b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff160361191f578781815181106118795761187861485f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106118fa576118f961485f565b5b60200260200101516001604051611912929190614a65565b60405180910390a4611a6d565b8673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106119995761199861485f565b5b602002602001015160016040516119b1929190614a65565b60405180910390a48781815181106119cc576119cb61485f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898581518110611a4c57611a4b61485f565b5b60200260200101516001604051611a64929190614a65565b60405180910390a45b8080611a789061488e565b9150506116b0565b50845160076000828254611a949190614968565b9250508190555050505050505050565b81611aae81611d1c565b611ab88383612512565b505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611aeb611eba565b611af6838383612198565b505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bcd57611bcc33611d1c565b5b611bda8686868686612528565b505050505050565b611bea611eba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090614b00565b60405180910390fd5b611c6281612294565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cd85750611cd7826125c9565b5b9050919050565b8060039080519060200190611cf592919061309e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611e16576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611d93929190614b20565b602060405180830381865afa158015611db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd49190614b5e565b611e1557806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611e0c9190613d28565b60405180910390fd5b5b50565b611e2161235a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611e675750611e6685611e6161235a565b611afb565b5b611ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d90614bfd565b60405180910390fd5b611eb385858585856126ab565b5050505050565b611ec261235a565b73ffffffffffffffffffffffffffffffffffffffff16611ee061146b565b73ffffffffffffffffffffffffffffffffffffffff1614611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d90614c69565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90614cfb565b60405180910390fd5b8151835114611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614d8d565b60405180910390fd5b6000611ff561235a565b9050612006816000878787876129cc565b60005b8451811015612172578381815181106120255761202461485f565b5b60200260200101516000808784815181106120435761204261485f565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a59190614968565b925050819055508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628885815181106121265761212561485f565b5b60200260200101518886815181106121415761214061485f565b5b6020026020010151604051612157929190614dad565b60405180910390a4808061216a9061488e565b915050612009565b50612182816000878787876129d4565b612191816000878787876129dc565b5050505050565b6127108111156121dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d490614e22565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506005600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890614cfb565b60405180910390fd5b60006123db61235a565b905060006123e885612bb3565b905060006123f585612bb3565b9050612406836000898585896129cc565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124659190614968565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516124e3929190614dad565b60405180910390a46124fa836000898585896129d4565b612509836000898989896107b8565b50505050505050565b61252461251d61235a565b8383612c2d565b5050565b61253061235a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061257657506125758561257061235a565b611afb565b5b6125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac90614eb4565b60405180910390fd5b6125c28585858585612d99565b5050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061269457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126a457506126a382613034565b5b9050919050565b81518351146126ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e690614d8d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361275e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275590614f46565b60405180910390fd5b600061276861235a565b90506127788187878787876129cc565b60005b84518110156129295760008582815181106127995761279861485f565b5b6020026020010151905060008583815181106127b8576127b761485f565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285090614fd8565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290e9190614968565b92505081905550505050806129229061488e565b905061277b565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516129a0929190614ff8565b60405180910390a46129b68187878787876129d4565b6129c48187878787876129dc565b505050505050565b505050505050565b505050505050565b6129fb8473ffffffffffffffffffffffffffffffffffffffff16611cf9565b15612bab578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612a4195949392919061502f565b6020604051808303816000875af1925050508015612a7d57506040513d601f19601f82011682018060405250810190612a7a9190614437565b60015b612b2257612a89614471565b806308c379a003612ae55750612a9d614493565b80612aa85750612ae7565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adc9190613525565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1990614595565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba090614627565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612bd257612bd1613329565b5b604051908082528060200260200182016040528015612c005781602001602082028036833780820191505090505b5090508281600081518110612c1857612c1761485f565b5b60200260200101818152505080915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9290615109565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d8c91906132f3565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dff90614f46565b60405180910390fd5b6000612e1261235a565b90506000612e1f85612bb3565b90506000612e2c85612bb3565b9050612e3c8389898585896129cc565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eca90614fd8565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f889190614968565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051613005929190614dad565b60405180910390a461301b848a8a86868a6129d4565b613029848a8a8a8a8a6107b8565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546130aa90614342565b90600052602060002090601f0160209004810192826130cc5760008555613113565b82601f106130e557805160ff1916838001178555613113565b82800160010185558215613113579182015b828111156131125782518255916020019190600101906130f7565b5b5090506131209190613124565b5090565b5b8082111561313d576000816000905550600101613125565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061318082613155565b9050919050565b61319081613175565b811461319b57600080fd5b50565b6000813590506131ad81613187565b92915050565b6000819050919050565b6131c6816131b3565b81146131d157600080fd5b50565b6000813590506131e3816131bd565b92915050565b60008060408385031215613200576131ff61314b565b5b600061320e8582860161319e565b925050602061321f858286016131d4565b9150509250929050565b613232816131b3565b82525050565b600060208201905061324d6000830184613229565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61328881613253565b811461329357600080fd5b50565b6000813590506132a58161327f565b92915050565b6000602082840312156132c1576132c061314b565b5b60006132cf84828501613296565b91505092915050565b60008115159050919050565b6132ed816132d8565b82525050565b600060208201905061330860008301846132e4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61336182613318565b810181811067ffffffffffffffff821117156133805761337f613329565b5b80604052505050565b6000613393613141565b905061339f8282613358565b919050565b600067ffffffffffffffff8211156133bf576133be613329565b5b6133c882613318565b9050602081019050919050565b82818337600083830152505050565b60006133f76133f2846133a4565b613389565b90508281526020810184848401111561341357613412613313565b5b61341e8482856133d5565b509392505050565b600082601f83011261343b5761343a61330e565b5b813561344b8482602086016133e4565b91505092915050565b60006020828403121561346a5761346961314b565b5b600082013567ffffffffffffffff81111561348857613487613150565b5b61349484828501613426565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134d75780820151818401526020810190506134bc565b838111156134e6576000848401525b50505050565b60006134f78261349d565b61350181856134a8565b93506135118185602086016134b9565b61351a81613318565b840191505092915050565b6000602082019050818103600083015261353f81846134ec565b905092915050565b600067ffffffffffffffff82111561356257613561613329565b5b61356b82613318565b9050602081019050919050565b600061358b61358684613547565b613389565b9050828152602081018484840111156135a7576135a6613313565b5b6135b28482856133d5565b509392505050565b600082601f8301126135cf576135ce61330e565b5b81356135df848260208601613578565b91505092915050565b60008060008060008060c087890312156136055761360461314b565b5b600061361389828a0161319e565b965050602061362489828a0161319e565b955050604061363589828a0161319e565b945050606061364689828a016131d4565b935050608061365789828a016131d4565b92505060a087013567ffffffffffffffff81111561367857613677613150565b5b61368489828a016135ba565b9150509295509295509295565b6000602082840312156136a7576136a661314b565b5b60006136b5848285016131d4565b91505092915050565b600080604083850312156136d5576136d461314b565b5b60006136e3858286016131d4565b92505060206136f48582860161319e565b9150509250929050565b600080604083850312156137155761371461314b565b5b6000613723858286016131d4565b9250506020613734858286016131d4565b9150509250929050565b61374781613175565b82525050565b6000604082019050613762600083018561373e565b61376f6020830184613229565b9392505050565b600067ffffffffffffffff82111561379157613790613329565b5b602082029050602081019050919050565b600080fd5b60006137ba6137b584613776565b613389565b905080838252602082019050602084028301858111156137dd576137dc6137a2565b5b835b8181101561380657806137f288826131d4565b8452602084019350506020810190506137df565b5050509392505050565b600082601f8301126138255761382461330e565b5b81356138358482602086016137a7565b91505092915050565b600080600080600060a0868803121561385a5761385961314b565b5b60006138688882890161319e565b95505060206138798882890161319e565b945050604086013567ffffffffffffffff81111561389a57613899613150565b5b6138a688828901613810565b935050606086013567ffffffffffffffff8111156138c7576138c6613150565b5b6138d388828901613810565b925050608086013567ffffffffffffffff8111156138f4576138f3613150565b5b613900888289016135ba565b9150509295509295909350565b600067ffffffffffffffff82111561392857613927613329565b5b602082029050602081019050919050565b600061394c6139478461390d565b613389565b9050808382526020820190506020840283018581111561396f5761396e6137a2565b5b835b818110156139b657803567ffffffffffffffff8111156139945761399361330e565b5b8086016139a18982613426565b85526020850194505050602081019050613971565b5050509392505050565b600082601f8301126139d5576139d461330e565b5b81356139e5848260208601613939565b91505092915050565b60008060408385031215613a0557613a0461314b565b5b600083013567ffffffffffffffff811115613a2357613a22613150565b5b613a2f85828601613810565b925050602083013567ffffffffffffffff811115613a5057613a4f613150565b5b613a5c858286016139c0565b9150509250929050565b600060208284031215613a7c57613a7b61314b565b5b6000613a8a8482850161319e565b91505092915050565b6000819050919050565b6000613ab8613ab3613aae84613155565b613a93565b613155565b9050919050565b6000613aca82613a9d565b9050919050565b6000613adc82613abf565b9050919050565b613aec81613ad1565b82525050565b6000602082019050613b076000830184613ae3565b92915050565b600067ffffffffffffffff821115613b2857613b27613329565b5b602082029050602081019050919050565b6000613b4c613b4784613b0d565b613389565b90508083825260208201905060208402830185811115613b6f57613b6e6137a2565b5b835b81811015613b985780613b84888261319e565b845260208401935050602081019050613b71565b5050509392505050565b600082601f830112613bb757613bb661330e565b5b8135613bc7848260208601613b39565b91505092915050565b60008060408385031215613be757613be661314b565b5b600083013567ffffffffffffffff811115613c0557613c04613150565b5b613c1185828601613ba2565b925050602083013567ffffffffffffffff811115613c3257613c31613150565b5b613c3e85828601613810565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c7d816131b3565b82525050565b6000613c8f8383613c74565b60208301905092915050565b6000602082019050919050565b6000613cb382613c48565b613cbd8185613c53565b9350613cc883613c64565b8060005b83811015613cf9578151613ce08882613c83565b9750613ceb83613c9b565b925050600181019050613ccc565b5085935050505092915050565b60006020820190508181036000830152613d208184613ca8565b905092915050565b6000602082019050613d3d600083018461373e565b92915050565b60008060008060008060c08789031215613d6057613d5f61314b565b5b6000613d6e89828a0161319e565b965050602087013567ffffffffffffffff811115613d8f57613d8e613150565b5b613d9b89828a01613810565b955050604087013567ffffffffffffffff811115613dbc57613dbb613150565b5b613dc889828a01613810565b945050606087013567ffffffffffffffff811115613de957613de8613150565b5b613df589828a016139c0565b935050608087013567ffffffffffffffff811115613e1657613e15613150565b5b613e2289828a01613ba2565b92505060a087013567ffffffffffffffff811115613e4357613e42613150565b5b613e4f89828a01613810565b9150509295509295509295565b60008060408385031215613e7357613e7261314b565b5b6000613e81858286016131d4565b925050602083013567ffffffffffffffff811115613ea257613ea1613150565b5b613eae85828601613426565b9150509250929050565b60008060008060008060c08789031215613ed557613ed461314b565b5b6000613ee389828a0161319e565b9650506020613ef489828a0161319e565b9550506040613f0589828a016131d4565b945050606087013567ffffffffffffffff811115613f2657613f25613150565b5b613f3289828a01613426565b9350506080613f4389828a0161319e565b92505060a0613f5489828a016131d4565b9150509295509295509295565b60008060008060008060c08789031215613f7e57613f7d61314b565b5b6000613f8c89828a0161319e565b9650506020613f9d89828a016131d4565b9550506040613fae89828a016131d4565b945050606087013567ffffffffffffffff811115613fcf57613fce613150565b5b613fdb89828a01613426565b9350506080613fec89828a0161319e565b92505060a0613ffd89828a016131d4565b9150509295509295509295565b60008060008060008060c087890312156140275761402661314b565b5b600087013567ffffffffffffffff81111561404557614044613150565b5b61405189828a01613ba2565b965050602061406289828a0161319e565b955050604087013567ffffffffffffffff81111561408357614082613150565b5b61408f89828a01613810565b945050606087013567ffffffffffffffff8111156140b0576140af613150565b5b6140bc89828a016139c0565b93505060806140cd89828a0161319e565b92505060a06140de89828a016131d4565b9150509295509295509295565b6140f4816132d8565b81146140ff57600080fd5b50565b600081359050614111816140eb565b92915050565b6000806040838503121561412e5761412d61314b565b5b600061413c8582860161319e565b925050602061414d85828601614102565b9150509250929050565b6000806000606084860312156141705761416f61314b565b5b600061417e868287016131d4565b935050602061418f8682870161319e565b92505060406141a0868287016131d4565b9150509250925092565b600080604083850312156141c1576141c061314b565b5b60006141cf8582860161319e565b92505060206141e08582860161319e565b9150509250929050565b600080600080600060a086880312156142065761420561314b565b5b60006142148882890161319e565b95505060206142258882890161319e565b9450506040614236888289016131d4565b9350506060614247888289016131d4565b925050608086013567ffffffffffffffff81111561426857614267613150565b5b614274888289016135ba565b9150509295509295909350565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006142dd602b836134a8565b91506142e882614281565b604082019050919050565b6000602082019050818103600083015261430c816142d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061435a57607f821691505b60208210810361436d5761436c614313565b5b50919050565b600081519050919050565b600082825260208201905092915050565b600061439a82614373565b6143a4818561437e565b93506143b48185602086016134b9565b6143bd81613318565b840191505092915050565b600060a0820190506143dd600083018861373e565b6143ea602083018761373e565b6143f76040830186613229565b6144046060830185613229565b8181036080830152614416818461438f565b90509695505050505050565b6000815190506144318161327f565b92915050565b60006020828403121561444d5761444c61314b565b5b600061445b84828501614422565b91505092915050565b60008160e01c9050919050565b600060033d11156144905760046000803e61448d600051614464565b90505b90565b600060443d10614520576144a5613141565b60043d036004823e80513d602482011167ffffffffffffffff821117156144cd575050614520565b808201805167ffffffffffffffff8111156144eb5750505050614520565b80602083010160043d038501811115614508575050505050614520565b61451782602001850186613358565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061457f6034836134a8565b915061458a82614523565b604082019050919050565b600060208201905081810360008301526145ae81614572565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006146116028836134a8565b915061461c826145b5565b604082019050919050565b6000602082019050818103600083015261464081614604565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461467481614342565b61467e8186614647565b9450600182166000811461469957600181146146aa576146dd565b60ff198316865281860193506146dd565b6146b385614652565b60005b838110156146d5578154818901526001820191506020810190506146b6565b838801955050505b50505092915050565b60006146f28285614667565b91506146fe8284614667565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614744826131b3565b915061474f836131b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147885761478761470a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147cd826131b3565b91506147d8836131b3565b9250826147e8576147e7614793565b5b828204905092915050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b6000614829601f836134a8565b9150614834826147f3565b602082019050919050565b600060208201905081810360008301526148588161481c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614899826131b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148cb576148ca61470a565b5b600182019050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006149326029836134a8565b915061493d826148d6565b604082019050919050565b6000602082019050818103600083015261496181614925565b9050919050565b6000614973826131b3565b915061497e836131b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149b3576149b261470a565b5b828201905092915050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b60006149f46018836134a8565b91506149ff826149be565b602082019050919050565b60006020820190508181036000830152614a23816149e7565b9050919050565b6000819050919050565b6000614a4f614a4a614a4584614a2a565b613a93565b6131b3565b9050919050565b614a5f81614a34565b82525050565b6000604082019050614a7a6000830185613229565b614a876020830184614a56565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614aea6026836134a8565b9150614af582614a8e565b604082019050919050565b60006020820190508181036000830152614b1981614add565b9050919050565b6000604082019050614b35600083018561373e565b614b42602083018461373e565b9392505050565b600081519050614b58816140eb565b92915050565b600060208284031215614b7457614b7361314b565b5b6000614b8284828501614b49565b91505092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614be76032836134a8565b9150614bf282614b8b565b604082019050919050565b60006020820190508181036000830152614c1681614bda565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614c536020836134a8565b9150614c5e82614c1d565b602082019050919050565b60006020820190508181036000830152614c8281614c46565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ce56021836134a8565b9150614cf082614c89565b604082019050919050565b60006020820190508181036000830152614d1481614cd8565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614d776028836134a8565b9150614d8282614d1b565b604082019050919050565b60006020820190508181036000830152614da681614d6a565b9050919050565b6000604082019050614dc26000830185613229565b614dcf6020830184613229565b9392505050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000614e0c601a836134a8565b9150614e1782614dd6565b602082019050919050565b60006020820190508181036000830152614e3b81614dff565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614e9e6029836134a8565b9150614ea982614e42565b604082019050919050565b60006020820190508181036000830152614ecd81614e91565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614f306025836134a8565b9150614f3b82614ed4565b604082019050919050565b60006020820190508181036000830152614f5f81614f23565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614fc2602a836134a8565b9150614fcd82614f66565b604082019050919050565b60006020820190508181036000830152614ff181614fb5565b9050919050565b600060408201905081810360008301526150128185613ca8565b905081810360208301526150268184613ca8565b90509392505050565b600060a082019050615044600083018861373e565b615051602083018761373e565b81810360408301526150638186613ca8565b905081810360608301526150778185613ca8565b9050818103608083015261508b818461438f565b90509695505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006150f36029836134a8565b91506150fe82615097565b604082019050919050565b60006020820190508181036000830152615122816150e6565b905091905056fea26469706673582212204d3a78dc0abd06680871aef98be23308b0095daf2827cc31bd5803a5274f554c64736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de60000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a45786869626974696f6e00000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e45760003560e01c806369b520171161010f5780639abc8320116100a2578063e2c7f33811610071578063e2c7f33814610566578063e985e9c514610582578063f242432a146105b2578063f2fde38b146105ce576101e4565b80639abc8320146104f25780639e42639914610510578063a22cb4651461052c578063d0414c9d14610548576101e4565b806382295a2d116100de57806382295a2d146104805780638d2bb0931461049c5780638da5cb5b146104b857806398faf29b146104d6576101e4565b806369b520171461040e5780636c52c3fb1461042a578063704fe71014610446578063715018a614610476576101e4565b80631f320331116101875780633a330022116101565780633a3300221461038657806341f43434146103a25780634e1273f4146103c057806358884432146103f0576101e4565b80631f320331146102ed5780632a55205a1461031d5780632eb2c2d61461034e578063337648b21461036a576101e4565b806306fdde03116101c357806306fdde0314610265578063084e9e24146102835780630e89341c1461029f57806318160ddd146102cf576101e4565b8062fdd58e146101e957806301ffc9a71461021957806302fe530514610249575b600080fd5b61020360048036038101906101fe91906131e9565b6105ea565b6040516102109190613238565b60405180910390f35b610233600480360381019061022e91906132ab565b6106b2565b60405161024091906132f3565b60405180910390f35b610263600480360381019061025e9190613454565b6106c4565b005b61026d61072a565b60405161027a9190613525565b60405180910390f35b61029d600480360381019061029891906135e8565b6107b8565b005b6102b960048036038101906102b49190613691565b61098f565b6040516102c69190613525565b60405180910390f35b6102d76109cd565b6040516102e49190613238565b60405180910390f35b610307600480360381019061030291906136be565b6109d3565b6040516103149190613238565b60405180910390f35b610337600480360381019061033291906136fe565b6109f8565b60405161034592919061374d565b60405180910390f35b6103686004803603810190610363919061383e565b610ac9565b005b610384600480360381019061037f91906139ee565b610b1c565b005b6103a0600480360381019061039b9190613a66565b610c3a565b005b6103aa610c86565b6040516103b79190613af2565b60405180910390f35b6103da60048036038101906103d59190613bd0565b610c98565b6040516103e79190613d06565b60405180910390f35b6103f8610db1565b6040516104059190613d28565b60405180910390f35b61042860048036038101906104239190613d43565b610dd7565b005b610444600480360381019061043f9190613a66565b61104a565b005b610460600480360381019061045b9190613691565b611096565b60405161046d9190613525565b60405180910390f35b61047e611136565b005b61049a60048036038101906104959190613e5c565b61114a565b005b6104b660048036038101906104b19190613eb8565b6111d0565b005b6104c061146b565b6040516104cd9190613d28565b60405180910390f35b6104f060048036038101906104eb9190613f61565b611495565b005b6104fa611568565b6040516105079190613525565b60405180910390f35b61052a6004803603810190610525919061400a565b6115f6565b005b61054660048036038101906105419190614117565b611aa4565b005b610550611abd565b60405161055d9190613d28565b60405180910390f35b610580600480360381019061057b9190614157565b611ae3565b005b61059c600480360381019061059791906141aa565b611afb565b6040516105a991906132f3565b60405180910390f35b6105cc60048036038101906105c791906141ea565b611b8f565b005b6105e860048036038101906105e39190613a66565b611be2565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361065a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610651906142f3565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006106bd82611c65565b9050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461071e57600080fd5b61072781611cdf565b50565b6006805461073790614342565b80601f016020809104026020016040519081016040528092919081815260200182805461076390614342565b80156107b05780601f10610785576101008083540402835291602001916107b0565b820191906000526020600020905b81548152906001019060200180831161079357829003601f168201915b505050505081565b6107d78473ffffffffffffffffffffffffffffffffffffffff16611cf9565b15610987578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161081d9594939291906143c8565b6020604051808303816000875af192505050801561085957506040513d601f19601f820116820180604052508101906108569190614437565b60015b6108fe57610865614471565b806308c379a0036108c15750610879614493565b8061088457506108c3565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b89190613525565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590614595565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097c90614627565b60405180910390fd5b505b505050505050565b60606003600160008481526020019081526020016000206040516020016109b79291906146e6565b6040516020818303038152906040529050919050565b60075481565b6000602052816000526040600020602052806000526040600020600091509150505481565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff1685610ab59190614739565b610abf91906147c2565b9150509250929050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b0757610b0633611d1c565b5b610b148686868686611e19565b505050505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7657600080fd5b8051825114610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb19061483f565b60405180910390fd5b60005b8251811015610c3557818181518110610bd957610bd861485f565b5b602002602001015160016000858481518110610bf857610bf761485f565b5b602002602001015181526020019081526020016000209080519060200190610c2192919061309e565b508080610c2d9061488e565b915050610bbd565b505050565b610c42611eba565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6daaeb6d7670e522a718067333cd4e81565b60608151835114610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd590614948565b60405180910390fd5b6000835167ffffffffffffffff811115610cfb57610cfa613329565b5b604051908082528060200260200182016040528015610d295781602001602082028036833780820191505090505b50905060005b8451811015610da657610d76858281518110610d4e57610d4d61485f565b5b6020026020010151858381518110610d6957610d6861485f565b5b60200260200101516105ea565b828281518110610d8957610d8861485f565b5b60200260200101818152505080610d9f9061488e565b9050610d2f565b508091505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e3157600080fd5b81518551148015610e43575080518551145b610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e799061483f565b60405180910390fd5b610e9d86868660405180602001604052806000815250611f38565b60005b8551811015610f95576000828281518110610ebe57610ebd61485f565b5b60200260200101511115610f2657610f25868281518110610ee257610ee161485f565b5b6020026020010151848381518110610efd57610efc61485f565b5b6020026020010151848481518110610f1857610f1761485f565b5b6020026020010151612198565b5b838181518110610f3957610f3861485f565b5b602002602001015160016000888481518110610f5857610f5761485f565b5b602002602001015181526020019081526020016000209080519060200190610f8192919061309e565b508080610f8d9061488e565b915050610ea0565b50600080600090505b86518110156110275760005b865181101561101357868181518110610fc657610fc561485f565b5b6020026020010151888381518110610fe157610fe061485f565b5b6020026020010151610ff39190614739565b83610ffe9190614968565b9250808061100b9061488e565b915050610faa565b50808061101f9061488e565b915050610f9e565b50806007600082825461103a9190614968565b9250508190555050505050505050565b611052611eba565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160205280600052604060002060009150905080546110b590614342565b80601f01602080910402602001604051908101604052809291908181526020018280546110e190614342565b801561112e5780601f106111035761010080835404028352916020019161112e565b820191906000526020600020905b81548152906001019060200180831161111157829003601f168201915b505050505081565b61113e611eba565b6111486000612294565b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111a457600080fd5b806001600084815260200190815260200160002090805190602001906111cb92919061309e565b505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461122a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129090614a0a565b60405180910390fd5b600160008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112f99190614968565b925050819055506001600760008282546113139190614968565b925050819055508260016000868152602001908152602001600020908051906020019061134192919061309e565b50600081111561135757611356848383612198565b5b600061136161235a565b90508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628860016040516113db929190614a65565b60405180910390a48573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288600160405161145a929190614a65565b60405180910390a450505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ef57600080fd5b61150a86868660405180602001604052806000815250612362565b600081111561151f5761151e858383612198565b5b8260016000878152602001908152602001600020908051906020019061154692919061309e565b5083600760008282546115599190614968565b92505081905550505050505050565b6003805461157590614342565b80601f01602080910402602001604051908101604052809291908181526020018280546115a190614342565b80156115ee5780601f106115c3576101008083540402835291602001916115ee565b820191906000526020600020905b8154815290600101906020018083116115d157829003601f168201915b505050505081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461165057600080fd5b85518451148015611662575082518451145b6116a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116989061483f565b60405180910390fd5b60006116ab61235a565b905060005b8551811015611a805760016000808884815181106116d1576116d061485f565b5b6020026020010151815260200190815260200160002060008a84815181106116fc576116fb61485f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461174d9190614968565b925050819055506117a78260008a848151811061176d5761176c61485f565b5b60200260200101518985815181106117885761178761485f565b5b60200260200101516001604051806020016040528060008152506107b8565b60008311156117d6576117d58682815181106117c6576117c561485f565b5b60200260200101518585612198565b5b8481815181106117e9576117e861485f565b5b6020026020010151600160008884815181106118085761180761485f565b5b60200260200101518152602001908152602001600020908051906020019061183192919061309e565b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff160361191f578781815181106118795761187861485f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106118fa576118f961485f565b5b60200260200101516001604051611912929190614a65565b60405180910390a4611a6d565b8673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106119995761199861485f565b5b602002602001015160016040516119b1929190614a65565b60405180910390a48781815181106119cc576119cb61485f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898581518110611a4c57611a4b61485f565b5b60200260200101516001604051611a64929190614a65565b60405180910390a45b8080611a789061488e565b9150506116b0565b50845160076000828254611a949190614968565b9250508190555050505050505050565b81611aae81611d1c565b611ab88383612512565b505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611aeb611eba565b611af6838383612198565b505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bcd57611bcc33611d1c565b5b611bda8686868686612528565b505050505050565b611bea611eba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090614b00565b60405180910390fd5b611c6281612294565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cd85750611cd7826125c9565b5b9050919050565b8060039080519060200190611cf592919061309e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611e16576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611d93929190614b20565b602060405180830381865afa158015611db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd49190614b5e565b611e1557806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611e0c9190613d28565b60405180910390fd5b5b50565b611e2161235a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611e675750611e6685611e6161235a565b611afb565b5b611ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d90614bfd565b60405180910390fd5b611eb385858585856126ab565b5050505050565b611ec261235a565b73ffffffffffffffffffffffffffffffffffffffff16611ee061146b565b73ffffffffffffffffffffffffffffffffffffffff1614611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d90614c69565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90614cfb565b60405180910390fd5b8151835114611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614d8d565b60405180910390fd5b6000611ff561235a565b9050612006816000878787876129cc565b60005b8451811015612172578381815181106120255761202461485f565b5b60200260200101516000808784815181106120435761204261485f565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a59190614968565b925050819055508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628885815181106121265761212561485f565b5b60200260200101518886815181106121415761214061485f565b5b6020026020010151604051612157929190614dad565b60405180910390a4808061216a9061488e565b915050612009565b50612182816000878787876129d4565b612191816000878787876129dc565b5050505050565b6127108111156121dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d490614e22565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506005600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890614cfb565b60405180910390fd5b60006123db61235a565b905060006123e885612bb3565b905060006123f585612bb3565b9050612406836000898585896129cc565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124659190614968565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516124e3929190614dad565b60405180910390a46124fa836000898585896129d4565b612509836000898989896107b8565b50505050505050565b61252461251d61235a565b8383612c2d565b5050565b61253061235a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061257657506125758561257061235a565b611afb565b5b6125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac90614eb4565b60405180910390fd5b6125c28585858585612d99565b5050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061269457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126a457506126a382613034565b5b9050919050565b81518351146126ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e690614d8d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361275e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275590614f46565b60405180910390fd5b600061276861235a565b90506127788187878787876129cc565b60005b84518110156129295760008582815181106127995761279861485f565b5b6020026020010151905060008583815181106127b8576127b761485f565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285090614fd8565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290e9190614968565b92505081905550505050806129229061488e565b905061277b565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516129a0929190614ff8565b60405180910390a46129b68187878787876129d4565b6129c48187878787876129dc565b505050505050565b505050505050565b505050505050565b6129fb8473ffffffffffffffffffffffffffffffffffffffff16611cf9565b15612bab578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612a4195949392919061502f565b6020604051808303816000875af1925050508015612a7d57506040513d601f19601f82011682018060405250810190612a7a9190614437565b60015b612b2257612a89614471565b806308c379a003612ae55750612a9d614493565b80612aa85750612ae7565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adc9190613525565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1990614595565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba090614627565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612bd257612bd1613329565b5b604051908082528060200260200182016040528015612c005781602001602082028036833780820191505090505b5090508281600081518110612c1857612c1761485f565b5b60200260200101818152505080915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9290615109565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d8c91906132f3565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dff90614f46565b60405180910390fd5b6000612e1261235a565b90506000612e1f85612bb3565b90506000612e2c85612bb3565b9050612e3c8389898585896129cc565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eca90614fd8565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f889190614968565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051613005929190614dad565b60405180910390a461301b848a8a86868a6129d4565b613029848a8a8a8a8a6107b8565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546130aa90614342565b90600052602060002090601f0160209004810192826130cc5760008555613113565b82601f106130e557805160ff1916838001178555613113565b82800160010185558215613113579182015b828111156131125782518255916020019190600101906130f7565b5b5090506131209190613124565b5090565b5b8082111561313d576000816000905550600101613125565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061318082613155565b9050919050565b61319081613175565b811461319b57600080fd5b50565b6000813590506131ad81613187565b92915050565b6000819050919050565b6131c6816131b3565b81146131d157600080fd5b50565b6000813590506131e3816131bd565b92915050565b60008060408385031215613200576131ff61314b565b5b600061320e8582860161319e565b925050602061321f858286016131d4565b9150509250929050565b613232816131b3565b82525050565b600060208201905061324d6000830184613229565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61328881613253565b811461329357600080fd5b50565b6000813590506132a58161327f565b92915050565b6000602082840312156132c1576132c061314b565b5b60006132cf84828501613296565b91505092915050565b60008115159050919050565b6132ed816132d8565b82525050565b600060208201905061330860008301846132e4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61336182613318565b810181811067ffffffffffffffff821117156133805761337f613329565b5b80604052505050565b6000613393613141565b905061339f8282613358565b919050565b600067ffffffffffffffff8211156133bf576133be613329565b5b6133c882613318565b9050602081019050919050565b82818337600083830152505050565b60006133f76133f2846133a4565b613389565b90508281526020810184848401111561341357613412613313565b5b61341e8482856133d5565b509392505050565b600082601f83011261343b5761343a61330e565b5b813561344b8482602086016133e4565b91505092915050565b60006020828403121561346a5761346961314b565b5b600082013567ffffffffffffffff81111561348857613487613150565b5b61349484828501613426565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134d75780820151818401526020810190506134bc565b838111156134e6576000848401525b50505050565b60006134f78261349d565b61350181856134a8565b93506135118185602086016134b9565b61351a81613318565b840191505092915050565b6000602082019050818103600083015261353f81846134ec565b905092915050565b600067ffffffffffffffff82111561356257613561613329565b5b61356b82613318565b9050602081019050919050565b600061358b61358684613547565b613389565b9050828152602081018484840111156135a7576135a6613313565b5b6135b28482856133d5565b509392505050565b600082601f8301126135cf576135ce61330e565b5b81356135df848260208601613578565b91505092915050565b60008060008060008060c087890312156136055761360461314b565b5b600061361389828a0161319e565b965050602061362489828a0161319e565b955050604061363589828a0161319e565b945050606061364689828a016131d4565b935050608061365789828a016131d4565b92505060a087013567ffffffffffffffff81111561367857613677613150565b5b61368489828a016135ba565b9150509295509295509295565b6000602082840312156136a7576136a661314b565b5b60006136b5848285016131d4565b91505092915050565b600080604083850312156136d5576136d461314b565b5b60006136e3858286016131d4565b92505060206136f48582860161319e565b9150509250929050565b600080604083850312156137155761371461314b565b5b6000613723858286016131d4565b9250506020613734858286016131d4565b9150509250929050565b61374781613175565b82525050565b6000604082019050613762600083018561373e565b61376f6020830184613229565b9392505050565b600067ffffffffffffffff82111561379157613790613329565b5b602082029050602081019050919050565b600080fd5b60006137ba6137b584613776565b613389565b905080838252602082019050602084028301858111156137dd576137dc6137a2565b5b835b8181101561380657806137f288826131d4565b8452602084019350506020810190506137df565b5050509392505050565b600082601f8301126138255761382461330e565b5b81356138358482602086016137a7565b91505092915050565b600080600080600060a0868803121561385a5761385961314b565b5b60006138688882890161319e565b95505060206138798882890161319e565b945050604086013567ffffffffffffffff81111561389a57613899613150565b5b6138a688828901613810565b935050606086013567ffffffffffffffff8111156138c7576138c6613150565b5b6138d388828901613810565b925050608086013567ffffffffffffffff8111156138f4576138f3613150565b5b613900888289016135ba565b9150509295509295909350565b600067ffffffffffffffff82111561392857613927613329565b5b602082029050602081019050919050565b600061394c6139478461390d565b613389565b9050808382526020820190506020840283018581111561396f5761396e6137a2565b5b835b818110156139b657803567ffffffffffffffff8111156139945761399361330e565b5b8086016139a18982613426565b85526020850194505050602081019050613971565b5050509392505050565b600082601f8301126139d5576139d461330e565b5b81356139e5848260208601613939565b91505092915050565b60008060408385031215613a0557613a0461314b565b5b600083013567ffffffffffffffff811115613a2357613a22613150565b5b613a2f85828601613810565b925050602083013567ffffffffffffffff811115613a5057613a4f613150565b5b613a5c858286016139c0565b9150509250929050565b600060208284031215613a7c57613a7b61314b565b5b6000613a8a8482850161319e565b91505092915050565b6000819050919050565b6000613ab8613ab3613aae84613155565b613a93565b613155565b9050919050565b6000613aca82613a9d565b9050919050565b6000613adc82613abf565b9050919050565b613aec81613ad1565b82525050565b6000602082019050613b076000830184613ae3565b92915050565b600067ffffffffffffffff821115613b2857613b27613329565b5b602082029050602081019050919050565b6000613b4c613b4784613b0d565b613389565b90508083825260208201905060208402830185811115613b6f57613b6e6137a2565b5b835b81811015613b985780613b84888261319e565b845260208401935050602081019050613b71565b5050509392505050565b600082601f830112613bb757613bb661330e565b5b8135613bc7848260208601613b39565b91505092915050565b60008060408385031215613be757613be661314b565b5b600083013567ffffffffffffffff811115613c0557613c04613150565b5b613c1185828601613ba2565b925050602083013567ffffffffffffffff811115613c3257613c31613150565b5b613c3e85828601613810565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c7d816131b3565b82525050565b6000613c8f8383613c74565b60208301905092915050565b6000602082019050919050565b6000613cb382613c48565b613cbd8185613c53565b9350613cc883613c64565b8060005b83811015613cf9578151613ce08882613c83565b9750613ceb83613c9b565b925050600181019050613ccc565b5085935050505092915050565b60006020820190508181036000830152613d208184613ca8565b905092915050565b6000602082019050613d3d600083018461373e565b92915050565b60008060008060008060c08789031215613d6057613d5f61314b565b5b6000613d6e89828a0161319e565b965050602087013567ffffffffffffffff811115613d8f57613d8e613150565b5b613d9b89828a01613810565b955050604087013567ffffffffffffffff811115613dbc57613dbb613150565b5b613dc889828a01613810565b945050606087013567ffffffffffffffff811115613de957613de8613150565b5b613df589828a016139c0565b935050608087013567ffffffffffffffff811115613e1657613e15613150565b5b613e2289828a01613ba2565b92505060a087013567ffffffffffffffff811115613e4357613e42613150565b5b613e4f89828a01613810565b9150509295509295509295565b60008060408385031215613e7357613e7261314b565b5b6000613e81858286016131d4565b925050602083013567ffffffffffffffff811115613ea257613ea1613150565b5b613eae85828601613426565b9150509250929050565b60008060008060008060c08789031215613ed557613ed461314b565b5b6000613ee389828a0161319e565b9650506020613ef489828a0161319e565b9550506040613f0589828a016131d4565b945050606087013567ffffffffffffffff811115613f2657613f25613150565b5b613f3289828a01613426565b9350506080613f4389828a0161319e565b92505060a0613f5489828a016131d4565b9150509295509295509295565b60008060008060008060c08789031215613f7e57613f7d61314b565b5b6000613f8c89828a0161319e565b9650506020613f9d89828a016131d4565b9550506040613fae89828a016131d4565b945050606087013567ffffffffffffffff811115613fcf57613fce613150565b5b613fdb89828a01613426565b9350506080613fec89828a0161319e565b92505060a0613ffd89828a016131d4565b9150509295509295509295565b60008060008060008060c087890312156140275761402661314b565b5b600087013567ffffffffffffffff81111561404557614044613150565b5b61405189828a01613ba2565b965050602061406289828a0161319e565b955050604087013567ffffffffffffffff81111561408357614082613150565b5b61408f89828a01613810565b945050606087013567ffffffffffffffff8111156140b0576140af613150565b5b6140bc89828a016139c0565b93505060806140cd89828a0161319e565b92505060a06140de89828a016131d4565b9150509295509295509295565b6140f4816132d8565b81146140ff57600080fd5b50565b600081359050614111816140eb565b92915050565b6000806040838503121561412e5761412d61314b565b5b600061413c8582860161319e565b925050602061414d85828601614102565b9150509250929050565b6000806000606084860312156141705761416f61314b565b5b600061417e868287016131d4565b935050602061418f8682870161319e565b92505060406141a0868287016131d4565b9150509250925092565b600080604083850312156141c1576141c061314b565b5b60006141cf8582860161319e565b92505060206141e08582860161319e565b9150509250929050565b600080600080600060a086880312156142065761420561314b565b5b60006142148882890161319e565b95505060206142258882890161319e565b9450506040614236888289016131d4565b9350506060614247888289016131d4565b925050608086013567ffffffffffffffff81111561426857614267613150565b5b614274888289016135ba565b9150509295509295909350565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006142dd602b836134a8565b91506142e882614281565b604082019050919050565b6000602082019050818103600083015261430c816142d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061435a57607f821691505b60208210810361436d5761436c614313565b5b50919050565b600081519050919050565b600082825260208201905092915050565b600061439a82614373565b6143a4818561437e565b93506143b48185602086016134b9565b6143bd81613318565b840191505092915050565b600060a0820190506143dd600083018861373e565b6143ea602083018761373e565b6143f76040830186613229565b6144046060830185613229565b8181036080830152614416818461438f565b90509695505050505050565b6000815190506144318161327f565b92915050565b60006020828403121561444d5761444c61314b565b5b600061445b84828501614422565b91505092915050565b60008160e01c9050919050565b600060033d11156144905760046000803e61448d600051614464565b90505b90565b600060443d10614520576144a5613141565b60043d036004823e80513d602482011167ffffffffffffffff821117156144cd575050614520565b808201805167ffffffffffffffff8111156144eb5750505050614520565b80602083010160043d038501811115614508575050505050614520565b61451782602001850186613358565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061457f6034836134a8565b915061458a82614523565b604082019050919050565b600060208201905081810360008301526145ae81614572565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006146116028836134a8565b915061461c826145b5565b604082019050919050565b6000602082019050818103600083015261464081614604565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461467481614342565b61467e8186614647565b9450600182166000811461469957600181146146aa576146dd565b60ff198316865281860193506146dd565b6146b385614652565b60005b838110156146d5578154818901526001820191506020810190506146b6565b838801955050505b50505092915050565b60006146f28285614667565b91506146fe8284614667565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614744826131b3565b915061474f836131b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147885761478761470a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147cd826131b3565b91506147d8836131b3565b9250826147e8576147e7614793565b5b828204905092915050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b6000614829601f836134a8565b9150614834826147f3565b602082019050919050565b600060208201905081810360008301526148588161481c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614899826131b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148cb576148ca61470a565b5b600182019050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006149326029836134a8565b915061493d826148d6565b604082019050919050565b6000602082019050818103600083015261496181614925565b9050919050565b6000614973826131b3565b915061497e836131b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149b3576149b261470a565b5b828201905092915050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b60006149f46018836134a8565b91506149ff826149be565b602082019050919050565b60006020820190508181036000830152614a23816149e7565b9050919050565b6000819050919050565b6000614a4f614a4a614a4584614a2a565b613a93565b6131b3565b9050919050565b614a5f81614a34565b82525050565b6000604082019050614a7a6000830185613229565b614a876020830184614a56565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614aea6026836134a8565b9150614af582614a8e565b604082019050919050565b60006020820190508181036000830152614b1981614add565b9050919050565b6000604082019050614b35600083018561373e565b614b42602083018461373e565b9392505050565b600081519050614b58816140eb565b92915050565b600060208284031215614b7457614b7361314b565b5b6000614b8284828501614b49565b91505092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614be76032836134a8565b9150614bf282614b8b565b604082019050919050565b60006020820190508181036000830152614c1681614bda565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614c536020836134a8565b9150614c5e82614c1d565b602082019050919050565b60006020820190508181036000830152614c8281614c46565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ce56021836134a8565b9150614cf082614c89565b604082019050919050565b60006020820190508181036000830152614d1481614cd8565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614d776028836134a8565b9150614d8282614d1b565b604082019050919050565b60006020820190508181036000830152614da681614d6a565b9050919050565b6000604082019050614dc26000830185613229565b614dcf6020830184613229565b9392505050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000614e0c601a836134a8565b9150614e1782614dd6565b602082019050919050565b60006020820190508181036000830152614e3b81614dff565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614e9e6029836134a8565b9150614ea982614e42565b604082019050919050565b60006020820190508181036000830152614ecd81614e91565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614f306025836134a8565b9150614f3b82614ed4565b604082019050919050565b60006020820190508181036000830152614f5f81614f23565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614fc2602a836134a8565b9150614fcd82614f66565b604082019050919050565b60006020820190508181036000830152614ff181614fb5565b9050919050565b600060408201905081810360008301526150128185613ca8565b905081810360208301526150268184613ca8565b90509392505050565b600060a082019050615044600083018861373e565b615051602083018761373e565b81810360408301526150638186613ca8565b905081810360608301526150778185613ca8565b9050818103608083015261508b818461438f565b90509695505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006150f36029836134a8565b91506150fe82615097565b604082019050919050565b60006020820190508181036000830152615122816150e6565b905091905056fea26469706673582212204d3a78dc0abd06680871aef98be23308b0095daf2827cc31bd5803a5274f554c64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de60000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a45786869626974696f6e00000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : uri_ (string): ipfs://
Arg [1] : minter_ (address): 0xe445Fb0297F7D1f507dF708185946210eB6a9DE6
Arg [2] : gatewayManager_ (address): 0x1BFe7452477Accc0188c34B3a4e8E3B15bF671B0
Arg [3] : contractName_ (string): Exhibition
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de6
Arg [2] : 0000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b0
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 697066733a2f2f00000000000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [7] : 45786869626974696f6e00000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
267:9013:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2339:305:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4225:217:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7802:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;655:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13969:870:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2008:189;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;703:26:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;693:63:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;836:329:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1630:294:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8931:347;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8159:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;737:142:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2801:542:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;736:29:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3098:1054;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7973:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;808:38:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:16;;;:::i;:::-;;8704:134:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4802:664;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1194:85:16;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2389:408:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1060:21:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5997:1736:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1052:202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;772:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8403:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3659:210:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1310:264:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2074:198:16;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2339:305:3;2465:7;2528:1;2509:21;;:7;:21;;;2488:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;2616:8;:12;2625:2;2616:12;;;;;;;;;;;:21;2629:7;2616:21;;;;;;;;;;;;;;;;2609:28;;2339:305;;;;:::o;4225:217:13:-;4372:4;4399:36;4423:11;4399:23;:36::i;:::-;4392:43;;4225:217;;;:::o;7802:96::-;963:14;;;;;;;;;;;949:28;;:10;:28;;;941:37;;;;;;7876:15:::1;7884:6;7876:7;:15::i;:::-;7802:96:::0;:::o;655:41::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13969:870:3:-;14175:15;:2;:13;;;:15::i;:::-;14171:662;;;14243:2;14226:38;;;14286:8;14316:4;14342:2;14366:6;14394:4;14226:190;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14206:617;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;14699:6;14692:14;;;;;;;;;;;:::i;:::-;;;;;;;;14206:617;;;14746:62;;;;;;;;;;:::i;:::-;;;;;;;;14206:617;14489:43;;;14477:55;;;:8;:55;;;;14473:152;;14556:50;;;;;;;;;;:::i;:::-;;;;;;;;14473:152;14429:210;14171:662;13969:870;;;;;;:::o;2008:189::-;2111:13;2171:7;2180:4;:8;2185:2;2180:8;;;;;;;;;;;2154:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2140:50;;2008:189;;;:::o;703:26:13:-;;;;:::o;693:63:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;836:329:6:-;953:16;971:21;1008:28;1039:10;:19;1050:7;1039:19;;;;;;;;;;;1008:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1079:9;:19;;;1068:30;;1153:5;1133:9;:16;;;1125:24;;:5;:24;;;;:::i;:::-;1124:34;;;;:::i;:::-;1108:50;;998:167;836:329;;;;;:::o;1630:294:13:-;1844:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1860:57:13::1;1888:4;1894:2;1898:3;1903:7;1912:4;1860:27;:57::i;:::-;1630:294:::0;;;;;;:::o;8931:347::-;963:14;;;;;;;;;;;949:28;;:10;:28;;;941:37;;;;;;9094:5:::1;:12;9075:8;:15;:31;9054:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;9178:9;9173:99;9197:8;:15;9193:1;:19;9173:99;;;9253:5;9259:1;9253:8;;;;;;;;:::i;:::-;;;;;;;;9233:4;:17;9238:8;9247:1;9238:11;;;;;;;;:::i;:::-;;;;;;;;9233:17;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;;9214:3;;;;;:::i;:::-;;;;9173:99;;;;8931:347:::0;;:::o;8159:118::-;1087:13:16;:11;:13::i;:::-;8255:15:13::1;8238:14;;:32;;;;;;;;;;;;;;;;;;8159:118:::0;:::o;737:142:15:-;836:42;737:142;:::o;2801:542:3:-;2952:16;3024:3;:10;3005:8;:15;:29;2984:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;3112:30;3159:8;:15;3145:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3112:63;;3191:9;3186:120;3210:8;:15;3206:1;:19;3186:120;;;3265:30;3275:8;3284:1;3275:11;;;;;;;;:::i;:::-;;;;;;;;3288:3;3292:1;3288:6;;;;;;;;:::i;:::-;;;;;;;;3265:9;:30::i;:::-;3246:13;3260:1;3246:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;3227:3;;;;:::i;:::-;;;3186:120;;;;3323:13;3316:20;;;2801:542;;;;:::o;736:29:13:-;;;;;;;;;;;;;:::o;3098:1054::-;862:14;;;;;;;;;;;848:28;;:10;:28;;;840:37;;;;;;3389:17:::1;:24;3375:3;:10;:38;:92;;;;;3447:13;:20;3433:3;:10;:34;3375:92;3354:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;3534:32;3545:2;3549:3;3554:7;3534:32;;;;;;;;;;;::::0;:10:::1;:32::i;:::-;3582:9;3577:335;3597:3;:10;3593:1;:14;3577:335;;;3651:1;3632:13;3646:1;3632:16;;;;;;;;:::i;:::-;;;;;;;;:20;3628:201;;;3672:142;3710:3;3714:1;3710:6;;;;;;;;:::i;:::-;;;;;;;;3738:17;3756:1;3738:20;;;;;;;;:::i;:::-;;;;;;;;3780:13;3794:1;3780:16;;;;;;;;:::i;:::-;;;;;;;;3672;:142::i;:::-;3628:201;3889:9;3899:1;3889:12;;;;;;;;:::i;:::-;;;;;;;;3874:4;:12;3879:3;3883:1;3879:6;;;;;;;;:::i;:::-;;;;;;;;3874:12;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;3609:3;;;;;:::i;:::-;;;;3577:335;;;;3922:13;3950:9:::0;3962:1:::1;3950:13;;3945:171;3969:3;:10;3965:1;:14;3945:171;;;4005:9;4000:106;4024:7;:14;4020:1;:18;4000:106;;;4081:7;4089:1;4081:10;;;;;;;;:::i;:::-;;;;;;;;4072:3;4076:1;4072:6;;;;;;;;:::i;:::-;;;;;;;;:19;;;;:::i;:::-;4063:28;;;;;:::i;:::-;;;4040:3;;;;;:::i;:::-;;;;4000:106;;;;3981:3;;;;;:::i;:::-;;;;3945:171;;;;4140:5;4125:11;;:20;;;;;;;:::i;:::-;;;;;;;;3344:808;3098:1054:::0;;;;;;:::o;7973:102::-;1087:13:16;:11;:13::i;:::-;8061:7:13::1;8044:14;;:24;;;;;;;;;;;;;;;;;;7973:102:::0;:::o;808:38:3:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1824:101:16:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;8704:134:13:-;963:14;;;;;;;;;;;949:28;;:10;:28;;;941:37;;;;;;8828:3:::1;8812:4;:13;8817:7;8812:13;;;;;;;;;;;:19;;;;;;;;;;;;:::i;:::-;;8704:134:::0;;:::o;4802:664::-;862:14;;;;;;;;;;;848:28;;:10;:28;;;840:37;;;;;;5044:1:::1;5030:16;;:2;:16;;::::0;5022:53:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5111:1;5086:8;:17:::0;5095:7:::1;5086:17;;;;;;;;;;;:21;5104:2;5086:21;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;5137:1;5122:11;;:16;;;;;;;:::i;:::-;;;;;;;;5164:3;5148:4;:13;5153:7;5148:13;;;;;;;;;;;:19;;;;;;;;;;;;:::i;:::-;;5197:1;5182:12;:16;5178:104;;;5214:57;5231:7;5240:16;5258:12;5214:16;:57::i;:::-;5178:104;5292:16;5311:12;:10;:12::i;:::-;5292:31;;5375:7;5338:57;;5371:1;5338:57;;5353:8;5338:57;;;5384:7;5393:1;5338:57;;;;;;;:::i;:::-;;;;;;;;5444:2;5410:49;;5435:7;5410:49;;5425:8;5410:49;;;5448:7;5457:1;5410:49;;;;;;;:::i;:::-;;;;;;;;5012:454;4802:664:::0;;;;;;:::o;1194:85:16:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;2389:408:13:-;862:14;;;;;;;;;;;848:28;;:10;:28;;;840:37;;;;;;2597:30:::1;2603:7;2612:2;2616:6;2597:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;2656:1;2641:12;:16;2637:99;;;2673:52;2690:2;2694:16;2712:12;2673:16;:52::i;:::-;2637:99;2756:3;2745:4;:8;2750:2;2745:8;;;;;;;;;;;:14;;;;;;;;;;;;:::i;:::-;;2784:6;2769:11;;:21;;;;;;;:::i;:::-;;;;;;;;2389:408:::0;;;;;;:::o;1060:21:3:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5997:1736:13:-;862:14;;;;;;;;;;;848:28;;:10;:28;;;840:37;;;;;;6289:2:::1;:9;6270:8;:15;:28;:67;;;;;6321:9;:16;6302:8;:15;:35;6270:67;6249:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;6405:16;6424:12;:10;:12::i;:::-;6405:31;;6452:9;6447:1208;6471:8;:15;6467:1;:19;6447:1208;;;6539:1;6507:8;:21:::0;6516:8:::1;6525:1;6516:11;;;;;;;;:::i;:::-;;;;;;;;6507:21;;;;;;;;;;;:28;6529:2;6532:1;6529:5;;;;;;;;:::i;:::-;;;;;;;;6507:28;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;6604:189;6652:8;6686:1;6706:2;6709:1;6706:5;;;;;;;;:::i;:::-;;;;;;;;6729:8;6738:1;6729:11;;;;;;;;:::i;:::-;;;;;;;;6758:1;6604:189;;;;;;;;;;;::::0;:30:::1;:189::i;:::-;6859:1;6844:12;:16;6840:116;;;6880:61;6897:8;6906:1;6897:11;;;;;;;;:::i;:::-;;;;;;;;6910:16;6928:12;6880:16;:61::i;:::-;6840:116;7021:9;7031:1;7021:12;;;;;;;;:::i;:::-;;;;;;;;7001:4;:17;7006:8;7015:1;7006:11;;;;;;;;:::i;:::-;;;;;;;;7001:17;;;;;;;;;;;:32;;;;;;;;;;;;:::i;:::-;;7124:1;7105:21;;:7;:21;;::::0;7101:544:::1;;7249:2;7252:1;7249:5;;;;;;;;:::i;:::-;;;;;;;;7151:177;;7225:1;7151:177;;7187:8;7151:177;;;7276:8;7285:1;7276:11;;;;;;;;:::i;:::-;;;;;;;;7309:1;7151:177;;;;;;;:::i;:::-;;;;;;;;7101:544;;;7470:7;7372:179;;7446:1;7372:179;;7408:8;7372:179;;;7499:8;7508:1;7499:11;;;;;;;;:::i;:::-;;;;;;;;7532:1;7372:179;;;;;;;:::i;:::-;;;;;;;;7608:2;7611:1;7608:5;;;;;;;;:::i;:::-;;;;;;;;7574:56;;7599:7;7574:56;;7589:8;7574:56;;;7615:8;7624:1;7615:11;;;;;;;;:::i;:::-;;;;;;;;7628:1;7574:56;;;;;;;:::i;:::-;;;;;;;;7101:544;6488:3;;;;;:::i;:::-;;;;6447:1208;;;;7711:8;:15;7696:11;;:30;;;;;;;:::i;:::-;;;;;;;;6239:1494;5997:1736:::0;;;;;;:::o;1052:202::-;1180:8;2227:30:15;2248:8;2227:20;:30::i;:::-;1204:43:13::1;1228:8;1238;1204:23;:43::i;:::-;1052:202:::0;;;:::o;772:29::-;;;;;;;;;;;;;:::o;8403:208::-;1087:13:16;:11;:13::i;:::-;8547:57:13::1;8564:7;8573:16;8591:12;8547:16;:57::i;:::-;8403:208:::0;;;:::o;3659:210:3:-;3798:4;3825:18;:27;3844:7;3825:27;;;;;;;;;;;;;;;:37;3853:8;3825:37;;;;;;;;;;;;;;;;;;;;;;;;;3818:44;;3659:210;;;;:::o;1310:264:13:-;1496:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1512:55:13::1;1535:4;1541:2;1545:7;1554:6;1562:4;1512:22;:55::i;:::-;1310:264:::0;;;;;;:::o;2074:198:16:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;::::0;2154:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;365:273:5:-;490:4;544:35;529:50;;;:11;:50;;;;:102;;;;595:36;619:11;595:23;:36::i;:::-;529:102;510:121;;365:273;;;:::o;8698:89:3:-;8774:6;8764:7;:16;;;;;;;;;;;;:::i;:::-;;8698:89;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;2285:412:15:-;2522:1;836:42;2474:45;;;:49;2470:221;;;836:42;2544;;;2595:4;2602:8;2544:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2539:142;;2657:8;2638:28;;;;;;;;;;;:::i;:::-;;;;;;;;2539:142;2470:221;2285:412;:::o;4397:430:3:-;4630:12;:10;:12::i;:::-;4622:20;;:4;:20;;;:60;;;;4646:36;4663:4;4669:12;:10;:12::i;:::-;4646:16;:36::i;:::-;4622:60;4601:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;4768:52;4791:4;4797:2;4801:3;4806:7;4815:4;4768:22;:52::i;:::-;4397:430;;;;;:::o;1352:130:16:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;10295:916:3:-;10481:1;10467:16;;:2;:16;;;10459:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;10566:7;:14;10552:3;:10;:28;10531:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;10657:16;10676:12;:10;:12::i;:::-;10657:31;;10699:66;10720:8;10738:1;10742:2;10746:3;10751:7;10760:4;10699:20;:66::i;:::-;10781:9;10776:179;10800:3;:10;10796:1;:14;10776:179;;;10855:7;10863:1;10855:10;;;;;;;;:::i;:::-;;;;;;;;10831:8;:16;10840:3;10844:1;10840:6;;;;;;;;:::i;:::-;;;;;;;;10831:16;;;;;;;;;;;:20;10848:2;10831:20;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;10921:2;10884:60;;10917:1;10884:60;;10899:8;10884:60;;;10925:3;10929:1;10925:6;;;;;;;;:::i;:::-;;;;;;;;10933:7;10941:1;10933:10;;;;;;;;:::i;:::-;;;;;;;;10884:60;;;;;;;:::i;:::-;;;;;;;;10812:3;;;;;:::i;:::-;;;;10776:179;;;;10965:65;10985:8;11003:1;11007:2;11011:3;11016:7;11025:4;10965:19;:65::i;:::-;11041:163;11090:8;11120:1;11136:2;11152:3;11169:7;11190:4;11041:35;:163::i;:::-;10449:762;10295:916;;;;:::o;537:255:6:-;680:5;671;:14;;663:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;748:37;;;;;;;;760:9;748:37;;;;;;778:5;748:37;;;;;726:10;:19;737:7;726:19;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;537:255;;;:::o;2426:187:16:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;9160:790:3:-;9321:1;9307:16;;:2;:16;;;9299:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9372:16;9391:12;:10;:12::i;:::-;9372:31;;9413:20;9436:21;9454:2;9436:17;:21::i;:::-;9413:44;;9467:24;9494:25;9512:6;9494:17;:25::i;:::-;9467:52;;9530:66;9551:8;9569:1;9573:2;9577:3;9582:7;9591:4;9530:20;:66::i;:::-;9627:6;9607:8;:12;9616:2;9607:12;;;;;;;;;;;:16;9620:2;9607:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;9685:2;9648:52;;9681:1;9648:52;;9663:8;9648:52;;;9689:2;9693:6;9648:52;;;;;;;:::i;:::-;;;;;;;;9711:65;9731:8;9749:1;9753:2;9757:3;9762:7;9771:4;9711:19;:65::i;:::-;9787:156;9831:8;9861:1;9877:2;9893;9909:6;9929:4;9787:30;:156::i;:::-;9289:661;;;9160:790;;;;:::o;3411:181::-;3533:52;3552:12;:10;:12::i;:::-;3566:8;3576;3533:18;:52::i;:::-;3411:181;;:::o;3936:389::-;4144:12;:10;:12::i;:::-;4136:20;;:4;:20;;;:60;;;;4160:36;4177:4;4183:12;:10;:12::i;:::-;4160:16;:36::i;:::-;4136:60;4115:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;4273:45;4291:4;4297:2;4301;4305:6;4313:4;4273:17;:45::i;:::-;3936:389;;;;;:::o;1260:349::-;1402:4;1456:26;1441:41;;;:11;:41;;;;:109;;;;1513:37;1498:52;;;:11;:52;;;;1441:109;:161;;;;1566:36;1590:11;1566:23;:36::i;:::-;1441:161;1422:180;;1260:349;;;:::o;6601:1274::-;6834:7;:14;6820:3;:10;:28;6799:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;6946:1;6932:16;;:2;:16;;;6924:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;7001:16;7020:12;:10;:12::i;:::-;7001:31;;7043:60;7064:8;7074:4;7080:2;7084:3;7089:7;7098:4;7043:20;:60::i;:::-;7119:9;7114:454;7138:3;:10;7134:1;:14;7114:454;;;7169:10;7182:3;7186:1;7182:6;;;;;;;;:::i;:::-;;;;;;;;7169:19;;7202:14;7219:7;7227:1;7219:10;;;;;;;;:::i;:::-;;;;;;;;7202:27;;7244:19;7266:8;:12;7275:2;7266:12;;;;;;;;;;;:18;7279:4;7266:18;;;;;;;;;;;;;;;;7244:40;;7338:6;7323:11;:21;;7298:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;7497:6;7483:11;:20;7462:8;:12;7471:2;7462:12;;;;;;;;;;;:18;7475:4;7462:18;;;;;;;;;;;;;;;:41;;;;7551:6;7531:8;:12;7540:2;7531:12;;;;;;;;;;;:16;7544:2;7531:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;7155:413;;;7150:3;;;;:::i;:::-;;;7114:454;;;;7613:2;7583:47;;7607:4;7583:47;;7597:8;7583:47;;;7617:3;7622:7;7583:47;;;;;;;:::i;:::-;;;;;;;;7641:59;7661:8;7671:4;7677:2;7681:3;7686:7;7695:4;7641:19;:59::i;:::-;7711:157;7760:8;7782:4;7800:2;7816:3;7833:7;7854:4;7711:35;:157::i;:::-;6789:1086;6601:1274;;;;;:::o;12603:214::-;;;;;;;:::o;13750:213::-;;;;;;;:::o;14845:946::-;15077:15;:2;:13;;;:15::i;:::-;15073:712;;;15145:2;15128:43;;;15193:8;15223:4;15249:3;15274:7;15303:4;15128:197;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;15108:667;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;15651:6;15644:14;;;;;;;;;;;:::i;:::-;;;;;;;;15108:667;;;15698:62;;;;;;;;;;:::i;:::-;;;;;;;;15108:667;15419:48;;;15407:60;;;:8;:60;;;;15382:195;;15508:50;;;;;;;;;;:::i;:::-;;;;;;;;15382:195;15338:253;15073:712;14845:946;;;;;;:::o;15797:221::-;15887:16;15919:22;15958:1;15944:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15919:41;;15981:7;15970:5;15976:1;15970:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;16006:5;15999:12;;;15797:221;;;:::o;11346:323::-;11496:8;11487:17;;:5;:17;;;11479:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;11598:8;11560:18;:25;11579:5;11560:25;;;;;;;;;;;;;;;:35;11586:8;11560:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11643:8;11621:41;;11636:5;11621:41;;;11653:8;11621:41;;;;;;:::i;:::-;;;;;;;;11346:323;;;:::o;5277:978::-;5472:1;5458:16;;:2;:16;;;5450:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5527:16;5546:12;:10;:12::i;:::-;5527:31;;5568:20;5591:21;5609:2;5591:17;:21::i;:::-;5568:44;;5622:24;5649:25;5667:6;5649:17;:25::i;:::-;5622:52;;5685:60;5706:8;5716:4;5722:2;5726:3;5731:7;5740:4;5685:20;:60::i;:::-;5756:19;5778:8;:12;5787:2;5778:12;;;;;;;;;;;:18;5791:4;5778:18;;;;;;;;;;;;;;;;5756:40;;5842:6;5827:11;:21;;5806:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;5985:6;5971:11;:20;5950:8;:12;5959:2;5950:12;;;;;;;;;;;:18;5963:4;5950:18;;;;;;;;;;;;;;;:41;;;;6031:6;6011:8;:12;6020:2;6011:12;;;;;;;;;;;:16;6024:2;6011:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;6084:2;6053:46;;6078:4;6053:46;;6068:8;6053:46;;;6088:2;6092:6;6053:46;;;;;;;:::i;:::-;;;;;;;;6110:59;6130:8;6140:4;6146:2;6150:3;6155:7;6164:4;6110:19;:59::i;:::-;6180:68;6211:8;6221:4;6227:2;6231;6235:6;6243:4;6180:30;:68::i;:::-;5440:815;;;;5277:978;;;;;:::o;829:155:4:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:18:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:154::-;4573:6;4568:3;4563;4550:30;4635:1;4626:6;4621:3;4617:16;4610:27;4489:154;;;:::o;4649:412::-;4727:5;4752:66;4768:49;4810:6;4768:49;:::i;:::-;4752:66;:::i;:::-;4743:75;;4841:6;4834:5;4827:21;4879:4;4872:5;4868:16;4917:3;4908:6;4903:3;4899:16;4896:25;4893:112;;;4924:79;;:::i;:::-;4893:112;5014:41;5048:6;5043:3;5038;5014:41;:::i;:::-;4733:328;4649:412;;;;;:::o;5081:340::-;5137:5;5186:3;5179:4;5171:6;5167:17;5163:27;5153:122;;5194:79;;:::i;:::-;5153:122;5311:6;5298:20;5336:79;5411:3;5403:6;5396:4;5388:6;5384:17;5336:79;:::i;:::-;5327:88;;5143:278;5081:340;;;;:::o;5427:509::-;5496:6;5545:2;5533:9;5524:7;5520:23;5516:32;5513:119;;;5551:79;;:::i;:::-;5513:119;5699:1;5688:9;5684:17;5671:31;5729:18;5721:6;5718:30;5715:117;;;5751:79;;:::i;:::-;5715:117;5856:63;5911:7;5902:6;5891:9;5887:22;5856:63;:::i;:::-;5846:73;;5642:287;5427:509;;;;:::o;5942:99::-;5994:6;6028:5;6022:12;6012:22;;5942:99;;;:::o;6047:169::-;6131:11;6165:6;6160:3;6153:19;6205:4;6200:3;6196:14;6181:29;;6047:169;;;;:::o;6222:307::-;6290:1;6300:113;6314:6;6311:1;6308:13;6300:113;;;6399:1;6394:3;6390:11;6384:18;6380:1;6375:3;6371:11;6364:39;6336:2;6333:1;6329:10;6324:15;;6300:113;;;6431:6;6428:1;6425:13;6422:101;;;6511:1;6502:6;6497:3;6493:16;6486:27;6422:101;6271:258;6222:307;;;:::o;6535:364::-;6623:3;6651:39;6684:5;6651:39;:::i;:::-;6706:71;6770:6;6765:3;6706:71;:::i;:::-;6699:78;;6786:52;6831:6;6826:3;6819:4;6812:5;6808:16;6786:52;:::i;:::-;6863:29;6885:6;6863:29;:::i;:::-;6858:3;6854:39;6847:46;;6627:272;6535:364;;;;:::o;6905:313::-;7018:4;7056:2;7045:9;7041:18;7033:26;;7105:9;7099:4;7095:20;7091:1;7080:9;7076:17;7069:47;7133:78;7206:4;7197:6;7133:78;:::i;:::-;7125:86;;6905:313;;;;:::o;7224:307::-;7285:4;7375:18;7367:6;7364:30;7361:56;;;7397:18;;:::i;:::-;7361:56;7435:29;7457:6;7435:29;:::i;:::-;7427:37;;7519:4;7513;7509:15;7501:23;;7224:307;;;:::o;7537:410::-;7614:5;7639:65;7655:48;7696:6;7655:48;:::i;:::-;7639:65;:::i;:::-;7630:74;;7727:6;7720:5;7713:21;7765:4;7758:5;7754:16;7803:3;7794:6;7789:3;7785:16;7782:25;7779:112;;;7810:79;;:::i;:::-;7779:112;7900:41;7934:6;7929:3;7924;7900:41;:::i;:::-;7620:327;7537:410;;;;;:::o;7966:338::-;8021:5;8070:3;8063:4;8055:6;8051:17;8047:27;8037:122;;8078:79;;:::i;:::-;8037:122;8195:6;8182:20;8220:78;8294:3;8286:6;8279:4;8271:6;8267:17;8220:78;:::i;:::-;8211:87;;8027:277;7966:338;;;;:::o;8310:1235::-;8423:6;8431;8439;8447;8455;8463;8512:3;8500:9;8491:7;8487:23;8483:33;8480:120;;;8519:79;;:::i;:::-;8480:120;8639:1;8664:53;8709:7;8700:6;8689:9;8685:22;8664:53;:::i;:::-;8654:63;;8610:117;8766:2;8792:53;8837:7;8828:6;8817:9;8813:22;8792:53;:::i;:::-;8782:63;;8737:118;8894:2;8920:53;8965:7;8956:6;8945:9;8941:22;8920:53;:::i;:::-;8910:63;;8865:118;9022:2;9048:53;9093:7;9084:6;9073:9;9069:22;9048:53;:::i;:::-;9038:63;;8993:118;9150:3;9177:53;9222:7;9213:6;9202:9;9198:22;9177:53;:::i;:::-;9167:63;;9121:119;9307:3;9296:9;9292:19;9279:33;9339:18;9331:6;9328:30;9325:117;;;9361:79;;:::i;:::-;9325:117;9466:62;9520:7;9511:6;9500:9;9496:22;9466:62;:::i;:::-;9456:72;;9250:288;8310:1235;;;;;;;;:::o;9551:329::-;9610:6;9659:2;9647:9;9638:7;9634:23;9630:32;9627:119;;;9665:79;;:::i;:::-;9627:119;9785:1;9810:53;9855:7;9846:6;9835:9;9831:22;9810:53;:::i;:::-;9800:63;;9756:117;9551:329;;;;:::o;9886:474::-;9954:6;9962;10011:2;9999:9;9990:7;9986:23;9982:32;9979:119;;;10017:79;;:::i;:::-;9979:119;10137:1;10162:53;10207:7;10198:6;10187:9;10183:22;10162:53;:::i;:::-;10152:63;;10108:117;10264:2;10290:53;10335:7;10326:6;10315:9;10311:22;10290:53;:::i;:::-;10280:63;;10235:118;9886:474;;;;;:::o;10366:::-;10434:6;10442;10491:2;10479:9;10470:7;10466:23;10462:32;10459:119;;;10497:79;;:::i;:::-;10459:119;10617:1;10642:53;10687:7;10678:6;10667:9;10663:22;10642:53;:::i;:::-;10632:63;;10588:117;10744:2;10770:53;10815:7;10806:6;10795:9;10791:22;10770:53;:::i;:::-;10760:63;;10715:118;10366:474;;;;;:::o;10846:118::-;10933:24;10951:5;10933:24;:::i;:::-;10928:3;10921:37;10846:118;;:::o;10970:332::-;11091:4;11129:2;11118:9;11114:18;11106:26;;11142:71;11210:1;11199:9;11195:17;11186:6;11142:71;:::i;:::-;11223:72;11291:2;11280:9;11276:18;11267:6;11223:72;:::i;:::-;10970:332;;;;;:::o;11308:311::-;11385:4;11475:18;11467:6;11464:30;11461:56;;;11497:18;;:::i;:::-;11461:56;11547:4;11539:6;11535:17;11527:25;;11607:4;11601;11597:15;11589:23;;11308:311;;;:::o;11625:117::-;11734:1;11731;11724:12;11765:710;11861:5;11886:81;11902:64;11959:6;11902:64;:::i;:::-;11886:81;:::i;:::-;11877:90;;11987:5;12016:6;12009:5;12002:21;12050:4;12043:5;12039:16;12032:23;;12103:4;12095:6;12091:17;12083:6;12079:30;12132:3;12124:6;12121:15;12118:122;;;12151:79;;:::i;:::-;12118:122;12266:6;12249:220;12283:6;12278:3;12275:15;12249:220;;;12358:3;12387:37;12420:3;12408:10;12387:37;:::i;:::-;12382:3;12375:50;12454:4;12449:3;12445:14;12438:21;;12325:144;12309:4;12304:3;12300:14;12293:21;;12249:220;;;12253:21;11867:608;;11765:710;;;;;:::o;12498:370::-;12569:5;12618:3;12611:4;12603:6;12599:17;12595:27;12585:122;;12626:79;;:::i;:::-;12585:122;12743:6;12730:20;12768:94;12858:3;12850:6;12843:4;12835:6;12831:17;12768:94;:::i;:::-;12759:103;;12575:293;12498:370;;;;:::o;12874:1509::-;13028:6;13036;13044;13052;13060;13109:3;13097:9;13088:7;13084:23;13080:33;13077:120;;;13116:79;;:::i;:::-;13077:120;13236:1;13261:53;13306:7;13297:6;13286:9;13282:22;13261:53;:::i;:::-;13251:63;;13207:117;13363:2;13389:53;13434:7;13425:6;13414:9;13410:22;13389:53;:::i;:::-;13379:63;;13334:118;13519:2;13508:9;13504:18;13491:32;13550:18;13542:6;13539:30;13536:117;;;13572:79;;:::i;:::-;13536:117;13677:78;13747:7;13738:6;13727:9;13723:22;13677:78;:::i;:::-;13667:88;;13462:303;13832:2;13821:9;13817:18;13804:32;13863:18;13855:6;13852:30;13849:117;;;13885:79;;:::i;:::-;13849:117;13990:78;14060:7;14051:6;14040:9;14036:22;13990:78;:::i;:::-;13980:88;;13775:303;14145:3;14134:9;14130:19;14117:33;14177:18;14169:6;14166:30;14163:117;;;14199:79;;:::i;:::-;14163:117;14304:62;14358:7;14349:6;14338:9;14334:22;14304:62;:::i;:::-;14294:72;;14088:288;12874:1509;;;;;;;;:::o;14389:321::-;14476:4;14566:18;14558:6;14555:30;14552:56;;;14588:18;;:::i;:::-;14552:56;14638:4;14630:6;14626:17;14618:25;;14698:4;14692;14688:15;14680:23;;14389:321;;;:::o;14732:945::-;14838:5;14863:91;14879:74;14946:6;14879:74;:::i;:::-;14863:91;:::i;:::-;14854:100;;14974:5;15003:6;14996:5;14989:21;15037:4;15030:5;15026:16;15019:23;;15090:4;15082:6;15078:17;15070:6;15066:30;15119:3;15111:6;15108:15;15105:122;;;15138:79;;:::i;:::-;15105:122;15253:6;15236:435;15270:6;15265:3;15262:15;15236:435;;;15359:3;15346:17;15395:18;15382:11;15379:35;15376:122;;;15417:79;;:::i;:::-;15376:122;15541:11;15533:6;15529:24;15579:47;15622:3;15610:10;15579:47;:::i;:::-;15574:3;15567:60;15656:4;15651:3;15647:14;15640:21;;15312:359;;15296:4;15291:3;15287:14;15280:21;;15236:435;;;15240:21;14844:833;;14732:945;;;;;:::o;15699:390::-;15780:5;15829:3;15822:4;15814:6;15810:17;15806:27;15796:122;;15837:79;;:::i;:::-;15796:122;15954:6;15941:20;15979:104;16079:3;16071:6;16064:4;16056:6;16052:17;15979:104;:::i;:::-;15970:113;;15786:303;15699:390;;;;:::o;16095:914::-;16223:6;16231;16280:2;16268:9;16259:7;16255:23;16251:32;16248:119;;;16286:79;;:::i;:::-;16248:119;16434:1;16423:9;16419:17;16406:31;16464:18;16456:6;16453:30;16450:117;;;16486:79;;:::i;:::-;16450:117;16591:78;16661:7;16652:6;16641:9;16637:22;16591:78;:::i;:::-;16581:88;;16377:302;16746:2;16735:9;16731:18;16718:32;16777:18;16769:6;16766:30;16763:117;;;16799:79;;:::i;:::-;16763:117;16904:88;16984:7;16975:6;16964:9;16960:22;16904:88;:::i;:::-;16894:98;;16689:313;16095:914;;;;;:::o;17015:329::-;17074:6;17123:2;17111:9;17102:7;17098:23;17094:32;17091:119;;;17129:79;;:::i;:::-;17091:119;17249:1;17274:53;17319:7;17310:6;17299:9;17295:22;17274:53;:::i;:::-;17264:63;;17220:117;17015:329;;;;:::o;17350:60::-;17378:3;17399:5;17392:12;;17350:60;;;:::o;17416:142::-;17466:9;17499:53;17517:34;17526:24;17544:5;17526:24;:::i;:::-;17517:34;:::i;:::-;17499:53;:::i;:::-;17486:66;;17416:142;;;:::o;17564:126::-;17614:9;17647:37;17678:5;17647:37;:::i;:::-;17634:50;;17564:126;;;:::o;17696:158::-;17778:9;17811:37;17842:5;17811:37;:::i;:::-;17798:50;;17696:158;;;:::o;17860:195::-;17979:69;18042:5;17979:69;:::i;:::-;17974:3;17967:82;17860:195;;:::o;18061:286::-;18186:4;18224:2;18213:9;18209:18;18201:26;;18237:103;18337:1;18326:9;18322:17;18313:6;18237:103;:::i;:::-;18061:286;;;;:::o;18353:311::-;18430:4;18520:18;18512:6;18509:30;18506:56;;;18542:18;;:::i;:::-;18506:56;18592:4;18584:6;18580:17;18572:25;;18652:4;18646;18642:15;18634:23;;18353:311;;;:::o;18687:710::-;18783:5;18808:81;18824:64;18881:6;18824:64;:::i;:::-;18808:81;:::i;:::-;18799:90;;18909:5;18938:6;18931:5;18924:21;18972:4;18965:5;18961:16;18954:23;;19025:4;19017:6;19013:17;19005:6;19001:30;19054:3;19046:6;19043:15;19040:122;;;19073:79;;:::i;:::-;19040:122;19188:6;19171:220;19205:6;19200:3;19197:15;19171:220;;;19280:3;19309:37;19342:3;19330:10;19309:37;:::i;:::-;19304:3;19297:50;19376:4;19371:3;19367:14;19360:21;;19247:144;19231:4;19226:3;19222:14;19215:21;;19171:220;;;19175:21;18789:608;;18687:710;;;;;:::o;19420:370::-;19491:5;19540:3;19533:4;19525:6;19521:17;19517:27;19507:122;;19548:79;;:::i;:::-;19507:122;19665:6;19652:20;19690:94;19780:3;19772:6;19765:4;19757:6;19753:17;19690:94;:::i;:::-;19681:103;;19497:293;19420:370;;;;:::o;19796:894::-;19914:6;19922;19971:2;19959:9;19950:7;19946:23;19942:32;19939:119;;;19977:79;;:::i;:::-;19939:119;20125:1;20114:9;20110:17;20097:31;20155:18;20147:6;20144:30;20141:117;;;20177:79;;:::i;:::-;20141:117;20282:78;20352:7;20343:6;20332:9;20328:22;20282:78;:::i;:::-;20272:88;;20068:302;20437:2;20426:9;20422:18;20409:32;20468:18;20460:6;20457:30;20454:117;;;20490:79;;:::i;:::-;20454:117;20595:78;20665:7;20656:6;20645:9;20641:22;20595:78;:::i;:::-;20585:88;;20380:303;19796:894;;;;;:::o;20696:114::-;20763:6;20797:5;20791:12;20781:22;;20696:114;;;:::o;20816:184::-;20915:11;20949:6;20944:3;20937:19;20989:4;20984:3;20980:14;20965:29;;20816:184;;;;:::o;21006:132::-;21073:4;21096:3;21088:11;;21126:4;21121:3;21117:14;21109:22;;21006:132;;;:::o;21144:108::-;21221:24;21239:5;21221:24;:::i;:::-;21216:3;21209:37;21144:108;;:::o;21258:179::-;21327:10;21348:46;21390:3;21382:6;21348:46;:::i;:::-;21426:4;21421:3;21417:14;21403:28;;21258:179;;;;:::o;21443:113::-;21513:4;21545;21540:3;21536:14;21528:22;;21443:113;;;:::o;21592:732::-;21711:3;21740:54;21788:5;21740:54;:::i;:::-;21810:86;21889:6;21884:3;21810:86;:::i;:::-;21803:93;;21920:56;21970:5;21920:56;:::i;:::-;21999:7;22030:1;22015:284;22040:6;22037:1;22034:13;22015:284;;;22116:6;22110:13;22143:63;22202:3;22187:13;22143:63;:::i;:::-;22136:70;;22229:60;22282:6;22229:60;:::i;:::-;22219:70;;22075:224;22062:1;22059;22055:9;22050:14;;22015:284;;;22019:14;22315:3;22308:10;;21716:608;;;21592:732;;;;:::o;22330:373::-;22473:4;22511:2;22500:9;22496:18;22488:26;;22560:9;22554:4;22550:20;22546:1;22535:9;22531:17;22524:47;22588:108;22691:4;22682:6;22588:108;:::i;:::-;22580:116;;22330:373;;;;:::o;22709:222::-;22802:4;22840:2;22829:9;22825:18;22817:26;;22853:71;22921:1;22910:9;22906:17;22897:6;22853:71;:::i;:::-;22709:222;;;;:::o;22937:2127::-;23176:6;23184;23192;23200;23208;23216;23265:3;23253:9;23244:7;23240:23;23236:33;23233:120;;;23272:79;;:::i;:::-;23233:120;23392:1;23417:53;23462:7;23453:6;23442:9;23438:22;23417:53;:::i;:::-;23407:63;;23363:117;23547:2;23536:9;23532:18;23519:32;23578:18;23570:6;23567:30;23564:117;;;23600:79;;:::i;:::-;23564:117;23705:78;23775:7;23766:6;23755:9;23751:22;23705:78;:::i;:::-;23695:88;;23490:303;23860:2;23849:9;23845:18;23832:32;23891:18;23883:6;23880:30;23877:117;;;23913:79;;:::i;:::-;23877:117;24018:78;24088:7;24079:6;24068:9;24064:22;24018:78;:::i;:::-;24008:88;;23803:303;24173:2;24162:9;24158:18;24145:32;24204:18;24196:6;24193:30;24190:117;;;24226:79;;:::i;:::-;24190:117;24331:88;24411:7;24402:6;24391:9;24387:22;24331:88;:::i;:::-;24321:98;;24116:313;24496:3;24485:9;24481:19;24468:33;24528:18;24520:6;24517:30;24514:117;;;24550:79;;:::i;:::-;24514:117;24655:78;24725:7;24716:6;24705:9;24701:22;24655:78;:::i;:::-;24645:88;;24439:304;24810:3;24799:9;24795:19;24782:33;24842:18;24834:6;24831:30;24828:117;;;24864:79;;:::i;:::-;24828:117;24969:78;25039:7;25030:6;25019:9;25015:22;24969:78;:::i;:::-;24959:88;;24753:304;22937:2127;;;;;;;;:::o;25070:654::-;25148:6;25156;25205:2;25193:9;25184:7;25180:23;25176:32;25173:119;;;25211:79;;:::i;:::-;25173:119;25331:1;25356:53;25401:7;25392:6;25381:9;25377:22;25356:53;:::i;:::-;25346:63;;25302:117;25486:2;25475:9;25471:18;25458:32;25517:18;25509:6;25506:30;25503:117;;;25539:79;;:::i;:::-;25503:117;25644:63;25699:7;25690:6;25679:9;25675:22;25644:63;:::i;:::-;25634:73;;25429:288;25070:654;;;;;:::o;25730:1237::-;25844:6;25852;25860;25868;25876;25884;25933:3;25921:9;25912:7;25908:23;25904:33;25901:120;;;25940:79;;:::i;:::-;25901:120;26060:1;26085:53;26130:7;26121:6;26110:9;26106:22;26085:53;:::i;:::-;26075:63;;26031:117;26187:2;26213:53;26258:7;26249:6;26238:9;26234:22;26213:53;:::i;:::-;26203:63;;26158:118;26315:2;26341:53;26386:7;26377:6;26366:9;26362:22;26341:53;:::i;:::-;26331:63;;26286:118;26471:2;26460:9;26456:18;26443:32;26502:18;26494:6;26491:30;26488:117;;;26524:79;;:::i;:::-;26488:117;26629:63;26684:7;26675:6;26664:9;26660:22;26629:63;:::i;:::-;26619:73;;26414:288;26741:3;26768:53;26813:7;26804:6;26793:9;26789:22;26768:53;:::i;:::-;26758:63;;26712:119;26870:3;26897:53;26942:7;26933:6;26922:9;26918:22;26897:53;:::i;:::-;26887:63;;26841:119;25730:1237;;;;;;;;:::o;26973:::-;27087:6;27095;27103;27111;27119;27127;27176:3;27164:9;27155:7;27151:23;27147:33;27144:120;;;27183:79;;:::i;:::-;27144:120;27303:1;27328:53;27373:7;27364:6;27353:9;27349:22;27328:53;:::i;:::-;27318:63;;27274:117;27430:2;27456:53;27501:7;27492:6;27481:9;27477:22;27456:53;:::i;:::-;27446:63;;27401:118;27558:2;27584:53;27629:7;27620:6;27609:9;27605:22;27584:53;:::i;:::-;27574:63;;27529:118;27714:2;27703:9;27699:18;27686:32;27745:18;27737:6;27734:30;27731:117;;;27767:79;;:::i;:::-;27731:117;27872:63;27927:7;27918:6;27907:9;27903:22;27872:63;:::i;:::-;27862:73;;27657:288;27984:3;28011:53;28056:7;28047:6;28036:9;28032:22;28011:53;:::i;:::-;28001:63;;27955:119;28113:3;28140:53;28185:7;28176:6;28165:9;28161:22;28140:53;:::i;:::-;28130:63;;28084:119;26973:1237;;;;;;;;:::o;28216:1707::-;28405:6;28413;28421;28429;28437;28445;28494:3;28482:9;28473:7;28469:23;28465:33;28462:120;;;28501:79;;:::i;:::-;28462:120;28649:1;28638:9;28634:17;28621:31;28679:18;28671:6;28668:30;28665:117;;;28701:79;;:::i;:::-;28665:117;28806:78;28876:7;28867:6;28856:9;28852:22;28806:78;:::i;:::-;28796:88;;28592:302;28933:2;28959:53;29004:7;28995:6;28984:9;28980:22;28959:53;:::i;:::-;28949:63;;28904:118;29089:2;29078:9;29074:18;29061:32;29120:18;29112:6;29109:30;29106:117;;;29142:79;;:::i;:::-;29106:117;29247:78;29317:7;29308:6;29297:9;29293:22;29247:78;:::i;:::-;29237:88;;29032:303;29402:2;29391:9;29387:18;29374:32;29433:18;29425:6;29422:30;29419:117;;;29455:79;;:::i;:::-;29419:117;29560:88;29640:7;29631:6;29620:9;29616:22;29560:88;:::i;:::-;29550:98;;29345:313;29697:3;29724:53;29769:7;29760:6;29749:9;29745:22;29724:53;:::i;:::-;29714:63;;29668:119;29826:3;29853:53;29898:7;29889:6;29878:9;29874:22;29853:53;:::i;:::-;29843:63;;29797:119;28216:1707;;;;;;;;:::o;29929:116::-;29999:21;30014:5;29999:21;:::i;:::-;29992:5;29989:32;29979:60;;30035:1;30032;30025:12;29979:60;29929:116;:::o;30051:133::-;30094:5;30132:6;30119:20;30110:29;;30148:30;30172:5;30148:30;:::i;:::-;30051:133;;;;:::o;30190:468::-;30255:6;30263;30312:2;30300:9;30291:7;30287:23;30283:32;30280:119;;;30318:79;;:::i;:::-;30280:119;30438:1;30463:53;30508:7;30499:6;30488:9;30484:22;30463:53;:::i;:::-;30453:63;;30409:117;30565:2;30591:50;30633:7;30624:6;30613:9;30609:22;30591:50;:::i;:::-;30581:60;;30536:115;30190:468;;;;;:::o;30664:619::-;30741:6;30749;30757;30806:2;30794:9;30785:7;30781:23;30777:32;30774:119;;;30812:79;;:::i;:::-;30774:119;30932:1;30957:53;31002:7;30993:6;30982:9;30978:22;30957:53;:::i;:::-;30947:63;;30903:117;31059:2;31085:53;31130:7;31121:6;31110:9;31106:22;31085:53;:::i;:::-;31075:63;;31030:118;31187:2;31213:53;31258:7;31249:6;31238:9;31234:22;31213:53;:::i;:::-;31203:63;;31158:118;30664:619;;;;;:::o;31289:474::-;31357:6;31365;31414:2;31402:9;31393:7;31389:23;31385:32;31382:119;;;31420:79;;:::i;:::-;31382:119;31540:1;31565:53;31610:7;31601:6;31590:9;31586:22;31565:53;:::i;:::-;31555:63;;31511:117;31667:2;31693:53;31738:7;31729:6;31718:9;31714:22;31693:53;:::i;:::-;31683:63;;31638:118;31289:474;;;;;:::o;31769:1089::-;31873:6;31881;31889;31897;31905;31954:3;31942:9;31933:7;31929:23;31925:33;31922:120;;;31961:79;;:::i;:::-;31922:120;32081:1;32106:53;32151:7;32142:6;32131:9;32127:22;32106:53;:::i;:::-;32096:63;;32052:117;32208:2;32234:53;32279:7;32270:6;32259:9;32255:22;32234:53;:::i;:::-;32224:63;;32179:118;32336:2;32362:53;32407:7;32398:6;32387:9;32383:22;32362:53;:::i;:::-;32352:63;;32307:118;32464:2;32490:53;32535:7;32526:6;32515:9;32511:22;32490:53;:::i;:::-;32480:63;;32435:118;32620:3;32609:9;32605:19;32592:33;32652:18;32644:6;32641:30;32638:117;;;32674:79;;:::i;:::-;32638:117;32779:62;32833:7;32824:6;32813:9;32809:22;32779:62;:::i;:::-;32769:72;;32563:288;31769:1089;;;;;;;;:::o;32864:230::-;33004:34;33000:1;32992:6;32988:14;32981:58;33073:13;33068:2;33060:6;33056:15;33049:38;32864:230;:::o;33100:366::-;33242:3;33263:67;33327:2;33322:3;33263:67;:::i;:::-;33256:74;;33339:93;33428:3;33339:93;:::i;:::-;33457:2;33452:3;33448:12;33441:19;;33100:366;;;:::o;33472:419::-;33638:4;33676:2;33665:9;33661:18;33653:26;;33725:9;33719:4;33715:20;33711:1;33700:9;33696:17;33689:47;33753:131;33879:4;33753:131;:::i;:::-;33745:139;;33472:419;;;:::o;33897:180::-;33945:77;33942:1;33935:88;34042:4;34039:1;34032:15;34066:4;34063:1;34056:15;34083:320;34127:6;34164:1;34158:4;34154:12;34144:22;;34211:1;34205:4;34201:12;34232:18;34222:81;;34288:4;34280:6;34276:17;34266:27;;34222:81;34350:2;34342:6;34339:14;34319:18;34316:38;34313:84;;34369:18;;:::i;:::-;34313:84;34134:269;34083:320;;;:::o;34409:98::-;34460:6;34494:5;34488:12;34478:22;;34409:98;;;:::o;34513:168::-;34596:11;34630:6;34625:3;34618:19;34670:4;34665:3;34661:14;34646:29;;34513:168;;;;:::o;34687:360::-;34773:3;34801:38;34833:5;34801:38;:::i;:::-;34855:70;34918:6;34913:3;34855:70;:::i;:::-;34848:77;;34934:52;34979:6;34974:3;34967:4;34960:5;34956:16;34934:52;:::i;:::-;35011:29;35033:6;35011:29;:::i;:::-;35006:3;35002:39;34995:46;;34777:270;34687:360;;;;:::o;35053:751::-;35276:4;35314:3;35303:9;35299:19;35291:27;;35328:71;35396:1;35385:9;35381:17;35372:6;35328:71;:::i;:::-;35409:72;35477:2;35466:9;35462:18;35453:6;35409:72;:::i;:::-;35491;35559:2;35548:9;35544:18;35535:6;35491:72;:::i;:::-;35573;35641:2;35630:9;35626:18;35617:6;35573:72;:::i;:::-;35693:9;35687:4;35683:20;35677:3;35666:9;35662:19;35655:49;35721:76;35792:4;35783:6;35721:76;:::i;:::-;35713:84;;35053:751;;;;;;;;:::o;35810:141::-;35866:5;35897:6;35891:13;35882:22;;35913:32;35939:5;35913:32;:::i;:::-;35810:141;;;;:::o;35957:349::-;36026:6;36075:2;36063:9;36054:7;36050:23;36046:32;36043:119;;;36081:79;;:::i;:::-;36043:119;36201:1;36226:63;36281:7;36272:6;36261:9;36257:22;36226:63;:::i;:::-;36216:73;;36172:127;35957:349;;;;:::o;36312:106::-;36356:8;36405:5;36400:3;36396:15;36375:36;;36312:106;;;:::o;36424:183::-;36459:3;36497:1;36479:16;36476:23;36473:128;;;36535:1;36532;36529;36514:23;36557:34;36588:1;36582:8;36557:34;:::i;:::-;36550:41;;36473:128;36424:183;:::o;36613:711::-;36652:3;36690:4;36672:16;36669:26;36698:5;36666:39;36727:20;;:::i;:::-;36802:1;36784:16;36780:24;36777:1;36771:4;36756:49;36835:4;36829:11;36934:16;36927:4;36919:6;36915:17;36912:39;36879:18;36871:6;36868:30;36852:113;36849:146;;;36980:5;;;;36849:146;37026:6;37020:4;37016:17;37062:3;37056:10;37089:18;37081:6;37078:30;37075:43;;;37111:5;;;;;;37075:43;37159:6;37152:4;37147:3;37143:14;37139:27;37218:1;37200:16;37196:24;37190:4;37186:35;37181:3;37178:44;37175:57;;;37225:5;;;;;;;37175:57;37242;37290:6;37284:4;37280:17;37272:6;37268:30;37262:4;37242:57;:::i;:::-;37315:3;37308:10;;36656:668;;;;;36613:711;;:::o;37330:239::-;37470:34;37466:1;37458:6;37454:14;37447:58;37539:22;37534:2;37526:6;37522:15;37515:47;37330:239;:::o;37575:366::-;37717:3;37738:67;37802:2;37797:3;37738:67;:::i;:::-;37731:74;;37814:93;37903:3;37814:93;:::i;:::-;37932:2;37927:3;37923:12;37916:19;;37575:366;;;:::o;37947:419::-;38113:4;38151:2;38140:9;38136:18;38128:26;;38200:9;38194:4;38190:20;38186:1;38175:9;38171:17;38164:47;38228:131;38354:4;38228:131;:::i;:::-;38220:139;;37947:419;;;:::o;38372:227::-;38512:34;38508:1;38500:6;38496:14;38489:58;38581:10;38576:2;38568:6;38564:15;38557:35;38372:227;:::o;38605:366::-;38747:3;38768:67;38832:2;38827:3;38768:67;:::i;:::-;38761:74;;38844:93;38933:3;38844:93;:::i;:::-;38962:2;38957:3;38953:12;38946:19;;38605:366;;;:::o;38977:419::-;39143:4;39181:2;39170:9;39166:18;39158:26;;39230:9;39224:4;39220:20;39216:1;39205:9;39201:17;39194:47;39258:131;39384:4;39258:131;:::i;:::-;39250:139;;38977:419;;;:::o;39402:148::-;39504:11;39541:3;39526:18;;39402:148;;;;:::o;39556:141::-;39605:4;39628:3;39620:11;;39651:3;39648:1;39641:14;39685:4;39682:1;39672:18;39664:26;;39556:141;;;:::o;39727:845::-;39830:3;39867:5;39861:12;39896:36;39922:9;39896:36;:::i;:::-;39948:89;40030:6;40025:3;39948:89;:::i;:::-;39941:96;;40068:1;40057:9;40053:17;40084:1;40079:137;;;;40230:1;40225:341;;;;40046:520;;40079:137;40163:4;40159:9;40148;40144:25;40139:3;40132:38;40199:6;40194:3;40190:16;40183:23;;40079:137;;40225:341;40292:38;40324:5;40292:38;:::i;:::-;40352:1;40366:154;40380:6;40377:1;40374:13;40366:154;;;40454:7;40448:14;40444:1;40439:3;40435:11;40428:35;40504:1;40495:7;40491:15;40480:26;;40402:4;40399:1;40395:12;40390:17;;40366:154;;;40549:6;40544:3;40540:16;40533:23;;40232:334;;40046:520;;39834:738;;39727:845;;;;:::o;40578:423::-;40752:3;40774:92;40862:3;40853:6;40774:92;:::i;:::-;40767:99;;40883:92;40971:3;40962:6;40883:92;:::i;:::-;40876:99;;40992:3;40985:10;;40578:423;;;;;:::o;41007:180::-;41055:77;41052:1;41045:88;41152:4;41149:1;41142:15;41176:4;41173:1;41166:15;41193:348;41233:7;41256:20;41274:1;41256:20;:::i;:::-;41251:25;;41290:20;41308:1;41290:20;:::i;:::-;41285:25;;41478:1;41410:66;41406:74;41403:1;41400:81;41395:1;41388:9;41381:17;41377:105;41374:131;;;41485:18;;:::i;:::-;41374:131;41533:1;41530;41526:9;41515:20;;41193:348;;;;:::o;41547:180::-;41595:77;41592:1;41585:88;41692:4;41689:1;41682:15;41716:4;41713:1;41706:15;41733:185;41773:1;41790:20;41808:1;41790:20;:::i;:::-;41785:25;;41824:20;41842:1;41824:20;:::i;:::-;41819:25;;41863:1;41853:35;;41868:18;;:::i;:::-;41853:35;41910:1;41907;41903:9;41898:14;;41733:185;;;;:::o;41924:181::-;42064:33;42060:1;42052:6;42048:14;42041:57;41924:181;:::o;42111:366::-;42253:3;42274:67;42338:2;42333:3;42274:67;:::i;:::-;42267:74;;42350:93;42439:3;42350:93;:::i;:::-;42468:2;42463:3;42459:12;42452:19;;42111:366;;;:::o;42483:419::-;42649:4;42687:2;42676:9;42672:18;42664:26;;42736:9;42730:4;42726:20;42722:1;42711:9;42707:17;42700:47;42764:131;42890:4;42764:131;:::i;:::-;42756:139;;42483:419;;;:::o;42908:180::-;42956:77;42953:1;42946:88;43053:4;43050:1;43043:15;43077:4;43074:1;43067:15;43094:233;43133:3;43156:24;43174:5;43156:24;:::i;:::-;43147:33;;43202:66;43195:5;43192:77;43189:103;;43272:18;;:::i;:::-;43189:103;43319:1;43312:5;43308:13;43301:20;;43094:233;;;:::o;43333:228::-;43473:34;43469:1;43461:6;43457:14;43450:58;43542:11;43537:2;43529:6;43525:15;43518:36;43333:228;:::o;43567:366::-;43709:3;43730:67;43794:2;43789:3;43730:67;:::i;:::-;43723:74;;43806:93;43895:3;43806:93;:::i;:::-;43924:2;43919:3;43915:12;43908:19;;43567:366;;;:::o;43939:419::-;44105:4;44143:2;44132:9;44128:18;44120:26;;44192:9;44186:4;44182:20;44178:1;44167:9;44163:17;44156:47;44220:131;44346:4;44220:131;:::i;:::-;44212:139;;43939:419;;;:::o;44364:305::-;44404:3;44423:20;44441:1;44423:20;:::i;:::-;44418:25;;44457:20;44475:1;44457:20;:::i;:::-;44452:25;;44611:1;44543:66;44539:74;44536:1;44533:81;44530:107;;;44617:18;;:::i;:::-;44530:107;44661:1;44658;44654:9;44647:16;;44364:305;;;;:::o;44675:174::-;44815:26;44811:1;44803:6;44799:14;44792:50;44675:174;:::o;44855:366::-;44997:3;45018:67;45082:2;45077:3;45018:67;:::i;:::-;45011:74;;45094:93;45183:3;45094:93;:::i;:::-;45212:2;45207:3;45203:12;45196:19;;44855:366;;;:::o;45227:419::-;45393:4;45431:2;45420:9;45416:18;45408:26;;45480:9;45474:4;45470:20;45466:1;45455:9;45451:17;45444:47;45508:131;45634:4;45508:131;:::i;:::-;45500:139;;45227:419;;;:::o;45652:85::-;45697:7;45726:5;45715:16;;45652:85;;;:::o;45743:158::-;45801:9;45834:61;45852:42;45861:32;45887:5;45861:32;:::i;:::-;45852:42;:::i;:::-;45834:61;:::i;:::-;45821:74;;45743:158;;;:::o;45907:147::-;46002:45;46041:5;46002:45;:::i;:::-;45997:3;45990:58;45907:147;;:::o;46060:348::-;46189:4;46227:2;46216:9;46212:18;46204:26;;46240:71;46308:1;46297:9;46293:17;46284:6;46240:71;:::i;:::-;46321:80;46397:2;46386:9;46382:18;46373:6;46321:80;:::i;:::-;46060:348;;;;;:::o;46414:225::-;46554:34;46550:1;46542:6;46538:14;46531:58;46623:8;46618:2;46610:6;46606:15;46599:33;46414:225;:::o;46645:366::-;46787:3;46808:67;46872:2;46867:3;46808:67;:::i;:::-;46801:74;;46884:93;46973:3;46884:93;:::i;:::-;47002:2;46997:3;46993:12;46986:19;;46645:366;;;:::o;47017:419::-;47183:4;47221:2;47210:9;47206:18;47198:26;;47270:9;47264:4;47260:20;47256:1;47245:9;47241:17;47234:47;47298:131;47424:4;47298:131;:::i;:::-;47290:139;;47017:419;;;:::o;47442:332::-;47563:4;47601:2;47590:9;47586:18;47578:26;;47614:71;47682:1;47671:9;47667:17;47658:6;47614:71;:::i;:::-;47695:72;47763:2;47752:9;47748:18;47739:6;47695:72;:::i;:::-;47442:332;;;;;:::o;47780:137::-;47834:5;47865:6;47859:13;47850:22;;47881:30;47905:5;47881:30;:::i;:::-;47780:137;;;;:::o;47923:345::-;47990:6;48039:2;48027:9;48018:7;48014:23;48010:32;48007:119;;;48045:79;;:::i;:::-;48007:119;48165:1;48190:61;48243:7;48234:6;48223:9;48219:22;48190:61;:::i;:::-;48180:71;;48136:125;47923:345;;;;:::o;48274:237::-;48414:34;48410:1;48402:6;48398:14;48391:58;48483:20;48478:2;48470:6;48466:15;48459:45;48274:237;:::o;48517:366::-;48659:3;48680:67;48744:2;48739:3;48680:67;:::i;:::-;48673:74;;48756:93;48845:3;48756:93;:::i;:::-;48874:2;48869:3;48865:12;48858:19;;48517:366;;;:::o;48889:419::-;49055:4;49093:2;49082:9;49078:18;49070:26;;49142:9;49136:4;49132:20;49128:1;49117:9;49113:17;49106:47;49170:131;49296:4;49170:131;:::i;:::-;49162:139;;48889:419;;;:::o;49314:182::-;49454:34;49450:1;49442:6;49438:14;49431:58;49314:182;:::o;49502:366::-;49644:3;49665:67;49729:2;49724:3;49665:67;:::i;:::-;49658:74;;49741:93;49830:3;49741:93;:::i;:::-;49859:2;49854:3;49850:12;49843:19;;49502:366;;;:::o;49874:419::-;50040:4;50078:2;50067:9;50063:18;50055:26;;50127:9;50121:4;50117:20;50113:1;50102:9;50098:17;50091:47;50155:131;50281:4;50155:131;:::i;:::-;50147:139;;49874:419;;;:::o;50299:220::-;50439:34;50435:1;50427:6;50423:14;50416:58;50508:3;50503:2;50495:6;50491:15;50484:28;50299:220;:::o;50525:366::-;50667:3;50688:67;50752:2;50747:3;50688:67;:::i;:::-;50681:74;;50764:93;50853:3;50764:93;:::i;:::-;50882:2;50877:3;50873:12;50866:19;;50525:366;;;:::o;50897:419::-;51063:4;51101:2;51090:9;51086:18;51078:26;;51150:9;51144:4;51140:20;51136:1;51125:9;51121:17;51114:47;51178:131;51304:4;51178:131;:::i;:::-;51170:139;;50897:419;;;:::o;51322:227::-;51462:34;51458:1;51450:6;51446:14;51439:58;51531:10;51526:2;51518:6;51514:15;51507:35;51322:227;:::o;51555:366::-;51697:3;51718:67;51782:2;51777:3;51718:67;:::i;:::-;51711:74;;51794:93;51883:3;51794:93;:::i;:::-;51912:2;51907:3;51903:12;51896:19;;51555:366;;;:::o;51927:419::-;52093:4;52131:2;52120:9;52116:18;52108:26;;52180:9;52174:4;52170:20;52166:1;52155:9;52151:17;52144:47;52208:131;52334:4;52208:131;:::i;:::-;52200:139;;51927:419;;;:::o;52352:332::-;52473:4;52511:2;52500:9;52496:18;52488:26;;52524:71;52592:1;52581:9;52577:17;52568:6;52524:71;:::i;:::-;52605:72;52673:2;52662:9;52658:18;52649:6;52605:72;:::i;:::-;52352:332;;;;;:::o;52690:176::-;52830:28;52826:1;52818:6;52814:14;52807:52;52690:176;:::o;52872:366::-;53014:3;53035:67;53099:2;53094:3;53035:67;:::i;:::-;53028:74;;53111:93;53200:3;53111:93;:::i;:::-;53229:2;53224:3;53220:12;53213:19;;52872:366;;;:::o;53244:419::-;53410:4;53448:2;53437:9;53433:18;53425:26;;53497:9;53491:4;53487:20;53483:1;53472:9;53468:17;53461:47;53525:131;53651:4;53525:131;:::i;:::-;53517:139;;53244:419;;;:::o;53669:228::-;53809:34;53805:1;53797:6;53793:14;53786:58;53878:11;53873:2;53865:6;53861:15;53854:36;53669:228;:::o;53903:366::-;54045:3;54066:67;54130:2;54125:3;54066:67;:::i;:::-;54059:74;;54142:93;54231:3;54142:93;:::i;:::-;54260:2;54255:3;54251:12;54244:19;;53903:366;;;:::o;54275:419::-;54441:4;54479:2;54468:9;54464:18;54456:26;;54528:9;54522:4;54518:20;54514:1;54503:9;54499:17;54492:47;54556:131;54682:4;54556:131;:::i;:::-;54548:139;;54275:419;;;:::o;54700:224::-;54840:34;54836:1;54828:6;54824:14;54817:58;54909:7;54904:2;54896:6;54892:15;54885:32;54700:224;:::o;54930:366::-;55072:3;55093:67;55157:2;55152:3;55093:67;:::i;:::-;55086:74;;55169:93;55258:3;55169:93;:::i;:::-;55287:2;55282:3;55278:12;55271:19;;54930:366;;;:::o;55302:419::-;55468:4;55506:2;55495:9;55491:18;55483:26;;55555:9;55549:4;55545:20;55541:1;55530:9;55526:17;55519:47;55583:131;55709:4;55583:131;:::i;:::-;55575:139;;55302:419;;;:::o;55727:229::-;55867:34;55863:1;55855:6;55851:14;55844:58;55936:12;55931:2;55923:6;55919:15;55912:37;55727:229;:::o;55962:366::-;56104:3;56125:67;56189:2;56184:3;56125:67;:::i;:::-;56118:74;;56201:93;56290:3;56201:93;:::i;:::-;56319:2;56314:3;56310:12;56303:19;;55962:366;;;:::o;56334:419::-;56500:4;56538:2;56527:9;56523:18;56515:26;;56587:9;56581:4;56577:20;56573:1;56562:9;56558:17;56551:47;56615:131;56741:4;56615:131;:::i;:::-;56607:139;;56334:419;;;:::o;56759:634::-;56980:4;57018:2;57007:9;57003:18;56995:26;;57067:9;57061:4;57057:20;57053:1;57042:9;57038:17;57031:47;57095:108;57198:4;57189:6;57095:108;:::i;:::-;57087:116;;57250:9;57244:4;57240:20;57235:2;57224:9;57220:18;57213:48;57278:108;57381:4;57372:6;57278:108;:::i;:::-;57270:116;;56759:634;;;;;:::o;57399:1053::-;57722:4;57760:3;57749:9;57745:19;57737:27;;57774:71;57842:1;57831:9;57827:17;57818:6;57774:71;:::i;:::-;57855:72;57923:2;57912:9;57908:18;57899:6;57855:72;:::i;:::-;57974:9;57968:4;57964:20;57959:2;57948:9;57944:18;57937:48;58002:108;58105:4;58096:6;58002:108;:::i;:::-;57994:116;;58157:9;58151:4;58147:20;58142:2;58131:9;58127:18;58120:48;58185:108;58288:4;58279:6;58185:108;:::i;:::-;58177:116;;58341:9;58335:4;58331:20;58325:3;58314:9;58310:19;58303:49;58369:76;58440:4;58431:6;58369:76;:::i;:::-;58361:84;;57399:1053;;;;;;;;:::o;58458:228::-;58598:34;58594:1;58586:6;58582:14;58575:58;58667:11;58662:2;58654:6;58650:15;58643:36;58458:228;:::o;58692:366::-;58834:3;58855:67;58919:2;58914:3;58855:67;:::i;:::-;58848:74;;58931:93;59020:3;58931:93;:::i;:::-;59049:2;59044:3;59040:12;59033:19;;58692:366;;;:::o;59064:419::-;59230:4;59268:2;59257:9;59253:18;59245:26;;59317:9;59311:4;59307:20;59303:1;59292:9;59288:17;59281:47;59345:131;59471:4;59345:131;:::i;:::-;59337:139;;59064:419;;;:::o
Swarm Source
ipfs://4d3a78dc0abd06680871aef98be23308b0095daf2827cc31bd5803a5274f554c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.