Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 20649793 | 83 days ago | IN | 0 ETH | 0.00006206 | ||||
Set Approval For... | 17645679 | 503 days ago | IN | 0 ETH | 0.00051027 | ||||
Set Approval For... | 17645654 | 503 days ago | IN | 0 ETH | 0.00087956 | ||||
Set Approval For... | 17636122 | 505 days ago | IN | 0 ETH | 0.00109809 | ||||
Safe Transfer Fr... | 16462817 | 670 days ago | IN | 0 ETH | 0.0004982 | ||||
Safe Transfer Fr... | 16462456 | 670 days ago | IN | 0 ETH | 0.00047465 | ||||
Safe Transfer Fr... | 16461570 | 670 days ago | IN | 0 ETH | 0.00046 | ||||
0x60806040 | 16084508 | 723 days ago | IN | 0 ETH | 0.08078116 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ERC1155CreatorImplementation
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; import "@manifoldxyz/libraries-solidity/contracts/access/AdminControlUpgradeable.sol"; import "./core/ERC1155CreatorCore.sol"; /** * @dev ERC1155Creator implementation */ contract ERC1155CreatorImplementation is AdminControlUpgradeable, ERC1155Upgradeable, ERC1155CreatorCore { mapping(uint256 => uint256) private _totalSupply; /** * Initializer */ function initialize(string memory _name, string memory _symbol) public initializer { __ERC1155_init(""); __Ownable_init(); name = _name; symbol = _symbol; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155Upgradeable, ERC1155CreatorCore, AdminControlUpgradeable) returns (bool) { return ERC1155CreatorCore.supportsInterface(interfaceId) || ERC1155Upgradeable.supportsInterface(interfaceId) || AdminControlUpgradeable.supportsInterface(interfaceId); } function _beforeTokenTransfer(address, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory) internal virtual override { _approveTransfer(from, to, ids, amounts); } /** * @dev See {ICreatorCore-registerExtension}. */ function registerExtension(address extension, string calldata baseURI) external override adminRequired { requireNonBlacklist(extension); _registerExtension(extension, baseURI, false); } /** * @dev See {ICreatorCore-registerExtension}. */ function registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) external override adminRequired { requireNonBlacklist(extension); _registerExtension(extension, baseURI, baseURIIdentical); } /** * @dev See {ICreatorCore-unregisterExtension}. */ function unregisterExtension(address extension) external override adminRequired { _unregisterExtension(extension); } /** * @dev See {ICreatorCore-blacklistExtension}. */ function blacklistExtension(address extension) external override adminRequired { _blacklistExtension(extension); } /** * @dev See {ICreatorCore-setBaseTokenURIExtension}. */ function setBaseTokenURIExtension(string calldata uri_) external override { requireExtension(); _setBaseTokenURIExtension(uri_, false); } /** * @dev See {ICreatorCore-setBaseTokenURIExtension}. */ function setBaseTokenURIExtension(string calldata uri_, bool identical) external override { requireExtension(); _setBaseTokenURIExtension(uri_, identical); } /** * @dev See {ICreatorCore-setTokenURIPrefixExtension}. */ function setTokenURIPrefixExtension(string calldata prefix) external override { requireExtension(); _setTokenURIPrefixExtension(prefix); } /** * @dev See {ICreatorCore-setTokenURIExtension}. */ function setTokenURIExtension(uint256 tokenId, string calldata uri_) external override { requireExtension(); _setTokenURIExtension(tokenId, uri_); } /** * @dev See {ICreatorCore-setTokenURIExtension}. */ function setTokenURIExtension(uint256[] memory tokenIds, string[] calldata uris) external override { requireExtension(); require(tokenIds.length == uris.length, "Invalid input"); for (uint i; i < tokenIds.length;) { _setTokenURIExtension(tokenIds[i], uris[i]); unchecked { ++i; } } } /** * @dev See {ICreatorCore-setBaseTokenURI}. */ function setBaseTokenURI(string calldata uri_) external override adminRequired { _setBaseTokenURI(uri_); } /** * @dev See {ICreatorCore-setTokenURIPrefix}. */ function setTokenURIPrefix(string calldata prefix) external override adminRequired { _setTokenURIPrefix(prefix); } /** * @dev See {ICreatorCore-setTokenURI}. */ function setTokenURI(uint256 tokenId, string calldata uri_) external override adminRequired { _setTokenURI(tokenId, uri_); } /** * @dev See {ICreatorCore-setTokenURI}. */ function setTokenURI(uint256[] memory tokenIds, string[] calldata uris) external override adminRequired { require(tokenIds.length == uris.length, "Invalid input"); for (uint i; i < tokenIds.length;) { _setTokenURI(tokenIds[i], uris[i]); unchecked { ++i; } } } /** * @dev See {ICreatorCore-setMintPermissions}. */ function setMintPermissions(address extension, address permissions) external override adminRequired { _setMintPermissions(extension, permissions); } /** * @dev See {IERC1155CreatorCore-mintBaseNew}. */ function mintBaseNew(address[] calldata to, uint256[] calldata amounts, string[] calldata uris) public virtual override nonReentrant adminRequired returns(uint256[] memory) { return _mintNew(address(0), to, amounts, uris); } /** * @dev See {IERC1155CreatorCore-mintBaseExisting}. */ function mintBaseExisting(address[] calldata to, uint256[] calldata tokenIds, uint256[] calldata amounts) public virtual override nonReentrant adminRequired { for (uint i; i < tokenIds.length;) { uint256 tokenId = tokenIds[i]; require(tokenId > 0 && tokenId <= _tokenCount, "Invalid token"); require(_tokensExtension[tokenId] == address(0), "Token created by extension"); unchecked { ++i; } } _mintExisting(address(0), to, tokenIds, amounts); } /** * @dev See {IERC1155CreatorCore-mintExtensionNew}. */ function mintExtensionNew(address[] calldata to, uint256[] calldata amounts, string[] calldata uris) public virtual override nonReentrant returns(uint256[] memory tokenIds) { requireExtension(); return _mintNew(msg.sender, to, amounts, uris); } /** * @dev See {IERC1155CreatorCore-mintExtensionExisting}. */ function mintExtensionExisting(address[] calldata to, uint256[] calldata tokenIds, uint256[] calldata amounts) public virtual override nonReentrant { requireExtension(); for (uint i; i < tokenIds.length;) { require(_tokensExtension[tokenIds[i]] == address(msg.sender), "Token not created by this extension"); unchecked { ++i; } } _mintExisting(msg.sender, to, tokenIds, amounts); } /** * @dev Mint new tokens */ function _mintNew(address extension, address[] memory to, uint256[] memory amounts, string[] memory uris) internal returns(uint256[] memory tokenIds) { if (to.length > 1) { // Multiple receiver. Give every receiver the same new token tokenIds = new uint256[](1); require(uris.length <= 1 && (amounts.length == 1 || to.length == amounts.length), "Invalid input"); } else { // Single receiver. Generating multiple tokens tokenIds = new uint256[](amounts.length); require(uris.length == 0 || amounts.length == uris.length, "Invalid input"); } // Assign tokenIds for (uint i; i < tokenIds.length;) { ++_tokenCount; tokenIds[i] = _tokenCount; // Track the extension that minted the token _tokensExtension[_tokenCount] = extension; unchecked { ++i; } } if (extension != address(0)) { _checkMintPermissions(to, tokenIds, amounts); } if (to.length == 1 && tokenIds.length == 1) { // Single mint _mint(to[0], tokenIds[0], amounts[0], new bytes(0)); } else if (to.length > 1) { // Multiple receivers. Receiving the same token if (amounts.length == 1) { // Everyone receiving the same amount for (uint i; i < to.length;) { _mint(to[i], tokenIds[0], amounts[0], new bytes(0)); unchecked { ++i; } } } else { // Everyone receiving different amounts for (uint i; i < to.length;) { _mint(to[i], tokenIds[0], amounts[i], new bytes(0)); unchecked { ++i; } } } } else { _mintBatch(to[0], tokenIds, amounts, new bytes(0)); } for (uint i; i < tokenIds.length;) { if (i < uris.length && bytes(uris[i]).length > 0) { _tokenURIs[tokenIds[i]] = uris[i]; } unchecked { ++i; } } } /** * @dev Mint existing tokens */ function _mintExisting(address extension, address[] memory to, uint256[] memory tokenIds, uint256[] memory amounts) internal { if (extension != address(0)) { _checkMintPermissions(to, tokenIds, amounts); } if (to.length == 1 && tokenIds.length == 1 && amounts.length == 1) { // Single mint _mint(to[0], tokenIds[0], amounts[0], new bytes(0)); } else if (to.length == 1 && tokenIds.length == amounts.length) { // Batch mint to same receiver _mintBatch(to[0], tokenIds, amounts, new bytes(0)); } else if (tokenIds.length == 1 && amounts.length == 1) { // Mint of the same token/token amounts to various receivers for (uint i; i < to.length;) { _mint(to[i], tokenIds[0], amounts[0], new bytes(0)); unchecked { ++i; } } } else if (tokenIds.length == 1 && to.length == amounts.length) { // Mint of the same token with different amounts to different receivers for (uint i; i < to.length;) { _mint(to[i], tokenIds[0], amounts[i], new bytes(0)); unchecked { ++i; } } } else if (to.length == tokenIds.length && to.length == amounts.length) { // Mint of different tokens and different amounts to different receivers for (uint i; i < to.length;) { _mint(to[i], tokenIds[i], amounts[i], new bytes(0)); unchecked { ++i; } } } else { revert("Invalid input"); } } /** * @dev See {IERC1155CreatorCore-tokenExtension}. */ function tokenExtension(uint256 tokenId) public view virtual override returns (address) { return _tokenExtension(tokenId); } /** * @dev See {IERC1155CreatorCore-burn}. */ function burn(address account, uint256[] memory tokenIds, uint256[] memory amounts) public virtual override nonReentrant { require(account == msg.sender || isApprovedForAll(account, msg.sender), "Caller is not owner nor approved"); require(tokenIds.length == amounts.length, "Invalid input"); if (tokenIds.length == 1) { _burn(account, tokenIds[0], amounts[0]); } else { _burnBatch(account, tokenIds, amounts); } _postBurn(account, tokenIds, amounts); } /** * @dev See {ICreatorCore-setRoyalties}. */ function setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) external override adminRequired { _setRoyaltiesExtension(address(0), receivers, basisPoints); } /** * @dev See {ICreatorCore-setRoyalties}. */ function setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) external override adminRequired { _setRoyalties(tokenId, receivers, basisPoints); } /** * @dev See {ICreatorCore-setRoyaltiesExtension}. */ function setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) external override adminRequired { _setRoyaltiesExtension(extension, receivers, basisPoints); } /** * @dev See {ICreatorCore-getRoyalties}. */ function getRoyalties(uint256 tokenId) external view virtual override returns (address payable[] memory, uint256[] memory) { return _getRoyalties(tokenId); } /** * @dev See {ICreatorCore-getFees}. */ function getFees(uint256 tokenId) external view virtual override returns (address payable[] memory, uint256[] memory) { return _getRoyalties(tokenId); } /** * @dev See {ICreatorCore-getFeeRecipients}. */ function getFeeRecipients(uint256 tokenId) external view virtual override returns (address payable[] memory) { return _getRoyaltyReceivers(tokenId); } /** * @dev See {ICreatorCore-getFeeBps}. */ function getFeeBps(uint256 tokenId) external view virtual override returns (uint[] memory) { return _getRoyaltyBPS(tokenId); } /** * @dev See {ICreatorCore-royaltyInfo}. */ function royaltyInfo(uint256 tokenId, uint256 value) external view virtual override returns (address, uint256) { return _getRoyaltyInfo(tokenId, value); } /** * @dev See {IERC1155-uri}. */ function uri(uint256 tokenId) public view virtual override returns (string memory) { return _tokenURI(tokenId); } /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 tokenId) external view virtual override returns (uint256) { return _totalSupply[tokenId]; } /** * @dev See {ERC1155-_mint}. */ function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual override { super._mint(account, id, amount, data); _totalSupply[id] += amount; } /** * @dev See {ERC1155-_mintBatch}. */ function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual override { super._mintBatch(to, ids, amounts, data); for (uint i; i < ids.length;) { _totalSupply[ids[i]] += amounts[i]; unchecked { ++i; } } } /** * @dev See {ERC1155-_burn}. */ function _burn(address account, uint256 id, uint256 amount) internal virtual override { super._burn(account, id, amount); _totalSupply[id] -= amount; } /** * @dev See {ERC1155-_burnBatch}. */ function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual override { super._burnBatch(account, ids, amounts); for (uint i; i < ids.length;) { _totalSupply[ids[i]] -= amounts[i]; unchecked { ++i; } } } /** * @dev See {ICreatorCore-setApproveTransfer}. */ function setApproveTransfer(address extension) external override adminRequired { _setApproveTransferBase(extension); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "../extensions/ICreatorExtensionTokenURI.sol"; import "../extensions/ICreatorExtensionRoyalties.sol"; import "./ICreatorCore.sol"; /** * @dev Core creator implementation */ abstract contract CreatorCore is ReentrancyGuard, ICreatorCore, ERC165 { using Strings for uint256; using EnumerableSet for EnumerableSet.AddressSet; using AddressUpgradeable for address; uint256 internal _tokenCount = 0; // Base approve transfers address location address internal _approveTransferBase; // Track registered extensions data EnumerableSet.AddressSet internal _extensions; EnumerableSet.AddressSet internal _blacklistedExtensions; mapping (address => address) internal _extensionPermissions; mapping (address => bool) internal _extensionApproveTransfers; // For tracking which extension a token was minted by mapping (uint256 => address) internal _tokensExtension; // The baseURI for a given extension mapping (address => string) private _extensionBaseURI; mapping (address => bool) private _extensionBaseURIIdentical; // The prefix for any tokens with a uri configured mapping (address => string) private _extensionURIPrefix; // Mapping for individual token URIs mapping (uint256 => string) internal _tokenURIs; // Royalty configurations struct RoyaltyConfig { address payable receiver; uint16 bps; } mapping (address => RoyaltyConfig[]) internal _extensionRoyalty; mapping (uint256 => RoyaltyConfig[]) internal _tokenRoyalty; bytes4 private constant _CREATOR_CORE_V1 = 0x28f10a21; /** * External interface identifiers for royalties */ /** * @dev CreatorCore * * bytes4(keccak256('getRoyalties(uint256)')) == 0xbb3bafd6 * * => 0xbb3bafd6 = 0xbb3bafd6 */ bytes4 private constant _INTERFACE_ID_ROYALTIES_CREATORCORE = 0xbb3bafd6; /** * @dev Rarible: RoyaltiesV1 * * bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb * bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f * * => 0xb9c4d9fb ^ 0x0ebd4c7f = 0xb7799584 */ bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584; /** * @dev Foundation * * bytes4(keccak256('getFees(uint256)')) == 0xd5a06d4c * * => 0xd5a06d4c = 0xd5a06d4c */ bytes4 private constant _INTERFACE_ID_ROYALTIES_FOUNDATION = 0xd5a06d4c; /** * @dev EIP-2981 * * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a * * => 0x2a55205a = 0x2a55205a */ bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(ICreatorCore).interfaceId || interfaceId == _CREATOR_CORE_V1 || super.supportsInterface(interfaceId) || interfaceId == _INTERFACE_ID_ROYALTIES_CREATORCORE || interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE || interfaceId == _INTERFACE_ID_ROYALTIES_FOUNDATION || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981; } /** * @dev Only allows registered extensions to call the specified function */ function requireExtension() internal view { require(_extensions.contains(msg.sender), "Must be registered extension"); } /** * @dev Only allows non-blacklisted extensions */ function requireNonBlacklist(address extension) internal view { require(!_blacklistedExtensions.contains(extension), "Extension blacklisted"); } /** * @dev See {ICreatorCore-getExtensions}. */ function getExtensions() external view override returns (address[] memory extensions) { extensions = new address[](_extensions.length()); for (uint i; i < _extensions.length();) { extensions[i] = _extensions.at(i); unchecked { ++i; } } return extensions; } /** * @dev Register an extension */ function _registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) internal { require(extension != address(this) && extension.isContract(), "Invalid"); emit ExtensionRegistered(extension, msg.sender); _extensionBaseURI[extension] = baseURI; _extensionBaseURIIdentical[extension] = baseURIIdentical; _extensions.add(extension); _setApproveTransferExtension(extension, true); } /** * @dev See {ICreatorCore-setApproveTransferExtension}. */ function setApproveTransferExtension(bool enabled) external override { requireExtension(); _setApproveTransferExtension(msg.sender, enabled); } /** * @dev Set whether or not tokens minted by the extension defers transfer approvals to the extension */ function _setApproveTransferExtension(address extension, bool enabled) internal virtual; /** * @dev Unregister an extension */ function _unregisterExtension(address extension) internal { emit ExtensionUnregistered(extension, msg.sender); _extensions.remove(extension); } /** * @dev Blacklist an extension */ function _blacklistExtension(address extension) internal { require(extension != address(0) && extension != address(this), "Cannot blacklist yourself"); if (_extensions.contains(extension)) { emit ExtensionUnregistered(extension, msg.sender); _extensions.remove(extension); } if (!_blacklistedExtensions.contains(extension)) { emit ExtensionBlacklisted(extension, msg.sender); _blacklistedExtensions.add(extension); } } /** * @dev Set base token uri for an extension */ function _setBaseTokenURIExtension(string calldata uri, bool identical) internal { _extensionBaseURI[msg.sender] = uri; _extensionBaseURIIdentical[msg.sender] = identical; } /** * @dev Set token uri prefix for an extension */ function _setTokenURIPrefixExtension(string calldata prefix) internal { _extensionURIPrefix[msg.sender] = prefix; } /** * @dev Set token uri for a token of an extension */ function _setTokenURIExtension(uint256 tokenId, string calldata uri) internal { require(_tokensExtension[tokenId] == msg.sender, "Invalid token"); _tokenURIs[tokenId] = uri; } /** * @dev Set base token uri for tokens with no extension */ function _setBaseTokenURI(string memory uri) internal { _extensionBaseURI[address(0)] = uri; } /** * @dev Set token uri prefix for tokens with no extension */ function _setTokenURIPrefix(string calldata prefix) internal { _extensionURIPrefix[address(0)] = prefix; } /** * @dev Set token uri for a token with no extension */ function _setTokenURI(uint256 tokenId, string calldata uri) internal { require(tokenId > 0 && tokenId <= _tokenCount && _tokensExtension[tokenId] == address(0), "Invalid token"); _tokenURIs[tokenId] = uri; } /** * @dev Retrieve a token's URI */ function _tokenURI(uint256 tokenId) internal view returns (string memory) { require(tokenId > 0 && tokenId <= _tokenCount, "Invalid token"); address extension = _tokensExtension[tokenId]; require(!_blacklistedExtensions.contains(extension), "Extension blacklisted"); if (bytes(_tokenURIs[tokenId]).length != 0) { if (bytes(_extensionURIPrefix[extension]).length != 0) { return string(abi.encodePacked(_extensionURIPrefix[extension],_tokenURIs[tokenId])); } return _tokenURIs[tokenId]; } if (ERC165Checker.supportsInterface(extension, type(ICreatorExtensionTokenURI).interfaceId)) { return ICreatorExtensionTokenURI(extension).tokenURI(address(this), tokenId); } if (!_extensionBaseURIIdentical[extension]) { return string(abi.encodePacked(_extensionBaseURI[extension], tokenId.toString())); } else { return _extensionBaseURI[extension]; } } /** * Get token extension */ function _tokenExtension(uint256 tokenId) internal view returns (address extension) { extension = _tokensExtension[tokenId]; require(extension != address(0), "No extension for token"); require(!_blacklistedExtensions.contains(extension), "Extension blacklisted"); return extension; } /** * Helper to get royalties for a token */ function _getRoyalties(uint256 tokenId) view internal returns (address payable[] memory receivers, uint256[] memory bps) { // Get token level royalties RoyaltyConfig[] memory royalties = _tokenRoyalty[tokenId]; if (royalties.length == 0) { // Get extension specific royalties address extension = _tokensExtension[tokenId]; if (extension != address(0)) { if (ERC165Checker.supportsInterface(extension, type(ICreatorExtensionRoyalties).interfaceId)) { (receivers, bps) = ICreatorExtensionRoyalties(extension).getRoyalties(address(this), tokenId); // Extension override exists, just return that if (receivers.length > 0) return (receivers, bps); } royalties = _extensionRoyalty[extension]; } } if (royalties.length == 0) { // Get the default royalty royalties = _extensionRoyalty[address(0)]; } if (royalties.length > 0) { receivers = new address payable[](royalties.length); bps = new uint256[](royalties.length); for (uint i; i < royalties.length;) { receivers[i] = royalties[i].receiver; bps[i] = royalties[i].bps; unchecked { ++i; } } } } /** * Helper to get royalty receivers for a token */ function _getRoyaltyReceivers(uint256 tokenId) view internal returns (address payable[] memory recievers) { (recievers, ) = _getRoyalties(tokenId); } /** * Helper to get royalty basis points for a token */ function _getRoyaltyBPS(uint256 tokenId) view internal returns (uint256[] memory bps) { (, bps) = _getRoyalties(tokenId); } function _getRoyaltyInfo(uint256 tokenId, uint256 value) view internal returns (address receiver, uint256 amount){ (address payable[] memory receivers, uint256[] memory bps) = _getRoyalties(tokenId); require(receivers.length <= 1, "More than 1 royalty receiver"); if (receivers.length == 0) { return (address(this), 0); } return (receivers[0], bps[0]*value/10000); } /** * Set royalties for a token */ function _setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) internal { _checkRoyalties(receivers, basisPoints); delete _tokenRoyalty[tokenId]; _setRoyalties(receivers, basisPoints, _tokenRoyalty[tokenId]); emit RoyaltiesUpdated(tokenId, receivers, basisPoints); } /** * Set royalties for all tokens of an extension */ function _setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) internal { _checkRoyalties(receivers, basisPoints); delete _extensionRoyalty[extension]; _setRoyalties(receivers, basisPoints, _extensionRoyalty[extension]); if (extension == address(0)) { emit DefaultRoyaltiesUpdated(receivers, basisPoints); } else { emit ExtensionRoyaltiesUpdated(extension, receivers, basisPoints); } } /** * Helper function to check that royalties provided are valid */ function _checkRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) private pure { require(receivers.length == basisPoints.length, "Invalid input"); uint256 totalBasisPoints; for (uint i; i < basisPoints.length;) { totalBasisPoints += basisPoints[i]; unchecked { ++i; } } require(totalBasisPoints < 10000, "Invalid total royalties"); } /** * Helper function to set royalties */ function _setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints, RoyaltyConfig[] storage royalties) private { for (uint i; i < basisPoints.length;) { royalties.push( RoyaltyConfig( { receiver: receivers[i], bps: uint16(basisPoints[i]) } ) ); unchecked { ++i; } } } /** * @dev See {ICreatorCore-getApproveTransfer}. */ function getApproveTransfer() external view override returns (address) { return _approveTransferBase; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "../extensions/ERC1155/IERC1155CreatorExtensionApproveTransfer.sol"; import "../extensions/ERC1155/IERC1155CreatorExtensionBurnable.sol"; import "../permissions/ERC1155/IERC1155CreatorMintPermissions.sol"; import "./IERC1155CreatorCore.sol"; import "./CreatorCore.sol"; /** * @dev Core ERC1155 creator implementation */ abstract contract ERC1155CreatorCore is CreatorCore, IERC1155CreatorCore { uint256 constant public VERSION = 2; using EnumerableSet for EnumerableSet.AddressSet; string public name; string public symbol; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(CreatorCore, IERC165) returns (bool) { return interfaceId == type(IERC1155CreatorCore).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {CreatorCore-_setApproveTransferExtension} */ function _setApproveTransferExtension(address extension, bool enabled) internal override { if (ERC165Checker.supportsInterface(extension, type(IERC1155CreatorExtensionApproveTransfer).interfaceId)) { _extensionApproveTransfers[extension] = enabled; emit ExtensionApproveTransferUpdated(extension, enabled); } } /** * @dev Set the base contract's approve transfer contract location */ function _setApproveTransferBase(address extension) internal { _approveTransferBase = extension; emit ApproveTransferUpdated(extension); } /** * @dev Set mint permissions for an extension */ function _setMintPermissions(address extension, address permissions) internal { require(_extensions.contains(extension), "Invalid extension"); require(permissions == address(0) || ERC165Checker.supportsInterface(permissions, type(IERC1155CreatorMintPermissions).interfaceId), "Invalid address"); if (_extensionPermissions[extension] != permissions) { _extensionPermissions[extension] = permissions; emit MintPermissionsUpdated(extension, permissions, msg.sender); } } /** * Check if an extension can mint */ function _checkMintPermissions(address[] memory to, uint256[] memory tokenIds, uint256[] memory amounts) internal { if (_extensionPermissions[msg.sender] != address(0)) { IERC1155CreatorMintPermissions(_extensionPermissions[msg.sender]).approveMint(msg.sender, to, tokenIds, amounts); } } /** * Post burn actions */ function _postBurn(address owner, uint256[] memory tokenIds, uint256[] memory amounts) internal virtual { require(tokenIds.length > 0, "Invalid input"); address extension = _tokensExtension[tokenIds[0]]; for (uint i; i < tokenIds.length;) { require(_tokensExtension[tokenIds[i]] == extension, "Mismatched token originators"); unchecked { ++i; } } // Callback to originating extension if needed if (extension != address(0)) { if (ERC165Checker.supportsInterface(extension, type(IERC1155CreatorExtensionBurnable).interfaceId)) { IERC1155CreatorExtensionBurnable(extension).onBurn(owner, tokenIds, amounts); } } } /** * Approve a transfer */ function _approveTransfer(address from, address to, uint256[] memory tokenIds, uint256[] memory amounts) internal { require(tokenIds.length > 0, "Invalid input"); address extension = _tokensExtension[tokenIds[0]]; for (uint i; i < tokenIds.length;) { require(_tokensExtension[tokenIds[i]] == extension, "Mismatched token originators"); unchecked { ++i; } } if (_extensionApproveTransfers[extension]) { require(IERC1155CreatorExtensionApproveTransfer(extension).approveTransfer(msg.sender, from, to, tokenIds, amounts), "Extension approval failure"); } else if (_approveTransferBase != address(0)) { require(IERC1155CreatorExtensionApproveTransfer(_approveTransferBase).approveTransfer(msg.sender, from, to, tokenIds, amounts), "Extension approval failure"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Core creator interface */ interface ICreatorCore is IERC165 { event ExtensionRegistered(address indexed extension, address indexed sender); event ExtensionUnregistered(address indexed extension, address indexed sender); event ExtensionBlacklisted(address indexed extension, address indexed sender); event MintPermissionsUpdated(address indexed extension, address indexed permissions, address indexed sender); event RoyaltiesUpdated(uint256 indexed tokenId, address payable[] receivers, uint256[] basisPoints); event DefaultRoyaltiesUpdated(address payable[] receivers, uint256[] basisPoints); event ApproveTransferUpdated(address extension); event ExtensionRoyaltiesUpdated(address indexed extension, address payable[] receivers, uint256[] basisPoints); event ExtensionApproveTransferUpdated(address indexed extension, bool enabled); /** * @dev gets address of all extensions */ function getExtensions() external view returns (address[] memory); /** * @dev add an extension. Can only be called by contract owner or admin. * extension address must point to a contract implementing ICreatorExtension. * Returns True if newly added, False if already added. */ function registerExtension(address extension, string calldata baseURI) external; /** * @dev add an extension. Can only be called by contract owner or admin. * extension address must point to a contract implementing ICreatorExtension. * Returns True if newly added, False if already added. */ function registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) external; /** * @dev add an extension. Can only be called by contract owner or admin. * Returns True if removed, False if already removed. */ function unregisterExtension(address extension) external; /** * @dev blacklist an extension. Can only be called by contract owner or admin. * This function will destroy all ability to reference the metadata of any tokens created * by the specified extension. It will also unregister the extension if needed. * Returns True if removed, False if already removed. */ function blacklistExtension(address extension) external; /** * @dev set the baseTokenURI of an extension. Can only be called by extension. */ function setBaseTokenURIExtension(string calldata uri) external; /** * @dev set the baseTokenURI of an extension. Can only be called by extension. * For tokens with no uri configured, tokenURI will return "uri+tokenId" */ function setBaseTokenURIExtension(string calldata uri, bool identical) external; /** * @dev set the common prefix of an extension. Can only be called by extension. * If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI" * Useful if you want to use ipfs/arweave */ function setTokenURIPrefixExtension(string calldata prefix) external; /** * @dev set the tokenURI of a token extension. Can only be called by extension that minted token. */ function setTokenURIExtension(uint256 tokenId, string calldata uri) external; /** * @dev set the tokenURI of a token extension for multiple tokens. Can only be called by extension that minted token. */ function setTokenURIExtension(uint256[] memory tokenId, string[] calldata uri) external; /** * @dev set the baseTokenURI for tokens with no extension. Can only be called by owner/admin. * For tokens with no uri configured, tokenURI will return "uri+tokenId" */ function setBaseTokenURI(string calldata uri) external; /** * @dev set the common prefix for tokens with no extension. Can only be called by owner/admin. * If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI" * Useful if you want to use ipfs/arweave */ function setTokenURIPrefix(string calldata prefix) external; /** * @dev set the tokenURI of a token with no extension. Can only be called by owner/admin. */ function setTokenURI(uint256 tokenId, string calldata uri) external; /** * @dev set the tokenURI of multiple tokens with no extension. Can only be called by owner/admin. */ function setTokenURI(uint256[] memory tokenIds, string[] calldata uris) external; /** * @dev set a permissions contract for an extension. Used to control minting. */ function setMintPermissions(address extension, address permissions) external; /** * @dev Configure so transfers of tokens created by the caller (must be extension) gets approval * from the extension before transferring */ function setApproveTransferExtension(bool enabled) external; /** * @dev get the extension of a given token */ function tokenExtension(uint256 tokenId) external view returns (address); /** * @dev Set default royalties */ function setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Set royalties of a token */ function setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Set royalties of an extension */ function setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Get royalites of a token. Returns list of receivers and basisPoints */ function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); // Royalty support for various other standards function getFeeRecipients(uint256 tokenId) external view returns (address payable[] memory); function getFeeBps(uint256 tokenId) external view returns (uint[] memory); function getFees(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256); /** * @dev Set the default approve transfer contract location. */ function setApproveTransfer(address extension) external; /** * @dev Get the default approve transfer contract location. */ function getApproveTransfer() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "./CreatorCore.sol"; /** * @dev Core ERC1155 creator interface */ interface IERC1155CreatorCore is ICreatorCore { /** * @dev mint a token with no extension. Can only be called by an admin. * * @param to - Can be a single element array (all tokens go to same address) or multi-element array (single token to many recipients) * @param amounts - Can be a single element array (all recipients get the same amount) or a multi-element array * @param uris - If no elements, all tokens use the default uri. * If any element is an empty string, the corresponding token uses the default uri. * * * Requirements: If to is a multi-element array, then uris must be empty or single element array * If to is a multi-element array, then amounts must be a single element array or a multi-element array of the same size * If to is a single element array, uris must be empty or the same length as amounts * * Examples: * mintBaseNew(['0x....1', '0x....2'], [1], []) * Mints a single new token, and gives 1 each to '0x....1' and '0x....2'. Token uses default uri. * * mintBaseNew(['0x....1', '0x....2'], [1, 2], []) * Mints a single new token, and gives 1 to '0x....1' and 2 to '0x....2'. Token uses default uri. * * mintBaseNew(['0x....1'], [1, 2], ["", "http://token2.com"]) * Mints two new tokens to '0x....1'. 1 of the first token, 2 of the second. 1st token uses default uri, second uses "http://token2.com". * * @return Returns list of tokenIds minted */ function mintBaseNew(address[] calldata to, uint256[] calldata amounts, string[] calldata uris) external returns (uint256[] memory); /** * @dev batch mint existing token with no extension. Can only be called by an admin. * * @param to - Can be a single element array (all tokens go to same address) or multi-element array (single token to many recipients) * @param tokenIds - Can be a single element array (all recipients get the same token) or a multi-element array * @param amounts - Can be a single element array (all recipients get the same amount) or a multi-element array * * Requirements: If any of the parameters are multi-element arrays, they need to be the same length as other multi-element arrays * * Examples: * mintBaseExisting(['0x....1', '0x....2'], [1], [10]) * Mints 10 of tokenId 1 to each of '0x....1' and '0x....2'. * * mintBaseExisting(['0x....1', '0x....2'], [1, 2], [10, 20]) * Mints 10 of tokenId 1 to '0x....1' and 20 of tokenId 2 to '0x....2'. * * mintBaseExisting(['0x....1'], [1, 2], [10, 20]) * Mints 10 of tokenId 1 and 20 of tokenId 2 to '0x....1'. * * mintBaseExisting(['0x....1', '0x....2'], [1], [10, 20]) * Mints 10 of tokenId 1 to '0x....1' and 20 of tokenId 1 to '0x....2'. * */ function mintBaseExisting(address[] calldata to, uint256[] calldata tokenIds, uint256[] calldata amounts) external; /** * @dev mint a token from an extension. Can only be called by a registered extension. * * @param to - Can be a single element array (all tokens go to same address) or multi-element array (single token to many recipients) * @param amounts - Can be a single element array (all recipients get the same amount) or a multi-element array * @param uris - If no elements, all tokens use the default uri. * If any element is an empty string, the corresponding token uses the default uri. * * * Requirements: If to is a multi-element array, then uris must be empty or single element array * If to is a multi-element array, then amounts must be a single element array or a multi-element array of the same size * If to is a single element array, uris must be empty or the same length as amounts * * Examples: * mintExtensionNew(['0x....1', '0x....2'], [1], []) * Mints a single new token, and gives 1 each to '0x....1' and '0x....2'. Token uses default uri. * * mintExtensionNew(['0x....1', '0x....2'], [1, 2], []) * Mints a single new token, and gives 1 to '0x....1' and 2 to '0x....2'. Token uses default uri. * * mintExtensionNew(['0x....1'], [1, 2], ["", "http://token2.com"]) * Mints two new tokens to '0x....1'. 1 of the first token, 2 of the second. 1st token uses default uri, second uses "http://token2.com". * * @return Returns list of tokenIds minted */ function mintExtensionNew(address[] calldata to, uint256[] calldata amounts, string[] calldata uris) external returns (uint256[] memory); /** * @dev batch mint existing token from extension. Can only be called by a registered extension. * * @param to - Can be a single element array (all tokens go to same address) or multi-element array (single token to many recipients) * @param tokenIds - Can be a single element array (all recipients get the same token) or a multi-element array * @param amounts - Can be a single element array (all recipients get the same amount) or a multi-element array * * Requirements: If any of the parameters are multi-element arrays, they need to be the same length as other multi-element arrays * * Examples: * mintExtensionExisting(['0x....1', '0x....2'], [1], [10]) * Mints 10 of tokenId 1 to each of '0x....1' and '0x....2'. * * mintExtensionExisting(['0x....1', '0x....2'], [1, 2], [10, 20]) * Mints 10 of tokenId 1 to '0x....1' and 20 of tokenId 2 to '0x....2'. * * mintExtensionExisting(['0x....1'], [1, 2], [10, 20]) * Mints 10 of tokenId 1 and 20 of tokenId 2 to '0x....1'. * * mintExtensionExisting(['0x....1', '0x....2'], [1], [10, 20]) * Mints 10 of tokenId 1 to '0x....1' and 20 of tokenId 1 to '0x....2'. * */ function mintExtensionExisting(address[] calldata to, uint256[] calldata tokenIds, uint256[] calldata amounts) external; /** * @dev burn tokens. Can only be called by token owner or approved address. * On burn, calls back to the registered extension's onBurn method */ function burn(address account, uint256[] calldata tokenIds, uint256[] calldata amounts) external; /** * @dev Total amount of tokens in with a given tokenId. */ function totalSupply(uint256 tokenId) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * Implement this if you want your extension to approve a transfer */ interface IERC1155CreatorExtensionApproveTransfer is IERC165 { /** * @dev Set whether or not the creator contract will check the extension for approval of token transfer */ function setApproveTransfer(address creator, bool enabled) external; /** * @dev Called by creator contract to approve a transfer */ function approveTransfer(address operator, address from, address to, uint256[] calldata tokenIds, uint256[] calldata amounts) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Your extension is required to implement this interface if it wishes * to receive the onBurn callback whenever a token the extension created is * burned */ interface IERC1155CreatorExtensionBurnable is IERC165 { /** * @dev callback handler for burn events */ function onBurn(address owner, uint256[] calldata tokenIds, uint256[] calldata amounts) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Implement this if you want your extension to have overloadable royalties */ interface ICreatorExtensionRoyalties is IERC165 { /** * Get the royalties for a given creator/tokenId */ function getRoyalties(address creator, uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Implement this if you want your extension to have overloadable URI's */ interface ICreatorExtensionTokenURI is IERC165 { /** * Get the uri for a given creator/tokenId */ function tokenURI(address creator, uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155Creator compliant extension contracts. */ interface IERC1155CreatorMintPermissions is IERC165 { /** * @dev get approval to mint */ function approveMint(address extension, address[] calldata to, uint256[] calldata tokenIds, uint256[] calldata amounts) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "./IAdminControl.sol"; abstract contract AdminControlUpgradeable is OwnableUpgradeable, IAdminControl, ERC165 { using EnumerableSet for EnumerableSet.AddressSet; // Track registered admins EnumerableSet.AddressSet private _admins; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IAdminControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Only allows approved admins to call the specified function */ modifier adminRequired() { require(owner() == msg.sender || _admins.contains(msg.sender), "AdminControl: Must be owner or admin"); _; } /** * @dev See {IAdminControl-getAdmins}. */ function getAdmins() external view override returns (address[] memory admins) { admins = new address[](_admins.length()); for (uint i = 0; i < _admins.length(); i++) { admins[i] = _admins.at(i); } return admins; } /** * @dev See {IAdminControl-approveAdmin}. */ function approveAdmin(address admin) external override onlyOwner { if (!_admins.contains(admin)) { emit AdminApproved(admin, msg.sender); _admins.add(admin); } } /** * @dev See {IAdminControl-revokeAdmin}. */ function revokeAdmin(address admin) external override onlyOwner { if (_admins.contains(admin)) { emit AdminRevoked(admin, msg.sender); _admins.remove(admin); } } /** * @dev See {IAdminControl-isAdmin}. */ function isAdmin(address admin) public override view returns (bool) { return (owner() == admin || _admins.contains(admin)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Interface for admin control */ interface IAdminControl is IERC165 { event AdminApproved(address indexed account, address indexed sender); event AdminRevoked(address indexed account, address indexed sender); /** * @dev gets address of all admins */ function getAdmins() external view returns (address[] memory); /** * @dev add an admin. Can only be called by contract owner. */ function approveAdmin(address admin) external; /** * @dev remove an admin. Can only be called by contract owner. */ function revokeAdmin(address admin) external; /** * @dev checks whether or not given address is an admin * Returns True if they are */ function isAdmin(address admin) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155Upgradeable.sol"; import "./IERC1155ReceiverUpgradeable.sol"; import "./extensions/IERC1155MetadataURIUpgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol"; import "../../utils/introspection/ERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.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 ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable { using AddressUpgradeable for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ function __ERC1155_init(string memory uri_) internal onlyInitializing { __ERC1155_init_unchained(uri_); } function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155Upgradeable).interfaceId || interfaceId == type(IERC1155MetadataURIUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); 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 token 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: caller is not token 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 { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); 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}. * * 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 _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {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 `ids` and `amounts` 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 ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155ReceiverUpgradeable.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 IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155ReceiverUpgradeable.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; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[47] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "../IERC1155Upgradeable.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 IERC1155MetadataURIUpgradeable is IERC1155Upgradeable { /** * @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 "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** * @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 (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.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 IERC1155Upgradeable is IERC165Upgradeable { /** * @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 (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @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; import "../proxy/utils/Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// 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 IERC165Upgradeable { /** * @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 // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// 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 // OpenZeppelin Contracts (last updated v4.7.2) (utils/introspection/ERC165Checker.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165Checker { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface, */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return _supportsERC165Interface(account, type(IERC165).interfaceId) && !_supportsERC165Interface(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && _supportsERC165Interface(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. * * _Available since v3.4._ */ function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in _interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!_supportsERC165Interface(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * Interface identification is specified in ERC-165. */ function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) { // prepare call bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId); // perform static call bool success; uint256 returnSize; uint256 returnValue; assembly { success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20) returnSize := returndatasize() returnValue := mload(0x00) } return success && returnSize >= 0x20 && returnValue > 0; } }
// 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 // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_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) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
{ "optimizer": { "enabled": true, "runs": 100 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"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":false,"internalType":"address","name":"extension","type":"address"}],"name":"ApproveTransferUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"DefaultRoyaltiesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ExtensionApproveTransferUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"ExtensionBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"ExtensionRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":false,"internalType":"address payable[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"ExtensionRoyaltiesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"ExtensionUnregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":true,"internalType":"address","name":"permissions","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"MintPermissionsUpdated","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address payable[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"RoyaltiesUpdated","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":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"approveAdmin","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":"address","name":"extension","type":"address"}],"name":"blacklistExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getApproveTransfer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExtensions","outputs":[{"internalType":"address[]","name":"extensions","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFees","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"to","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintBaseExisting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"mintBaseNew","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintExtensionExisting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"mintExtensionNew","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"string","name":"baseURI","type":"string"}],"name":"registerExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"bool","name":"baseURIIdentical","type":"bool"}],"name":"registerExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"}],"name":"setApproveTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setApproveTransferExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseTokenURIExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"},{"internalType":"bool","name":"identical","type":"bool"}],"name":"setBaseTokenURIExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"address","name":"permissions","type":"address"}],"name":"setMintPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address payable[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"address payable[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"setRoyaltiesExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri_","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"setTokenURIExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri_","type":"string"}],"name":"setTokenURIExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"}],"name":"setTokenURIPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"}],"name":"setTokenURIPrefixExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenExtension","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"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":"address","name":"extension","type":"address"}],"name":"unregisterExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600060cc5534801561001557600080fd5b506001606555615fff806200002b6000396000f3fe608060405234801561001057600080fd5b50600436106102cb5760003560e01c8063695c96e61161017d578063b9c4d9fb116100d9578063e92a89f611610092578063e92a89f614610659578063e985e9c51461066c578063f0cdc4991461067f578063f242432a14610692578063f2fde38b146106a5578063feeb5a9a146106b8578063ffa1ad74146106cb57600080fd5b8063b9c4d9fb146105df578063bb3bafd6146105f2578063bd85b03914610613578063ce8aee9d14610633578063d5a06d4c146105f2578063e6c884dc1461064657600080fd5b80638da5cb5b116101365780638da5cb5b1461057057806395d89b411461057857806399e0dd7c14610580578063a22cb46514610593578063aafb2d44146105a6578063ac0c8cfa146105b9578063b0fe87c9146105cc57600080fd5b8063695c96e6146105145780636d73e66914610527578063715018a61461053a57806382dcc0c81461054257806383b7db63146105555780638c6e84721461055d57600080fd5b80632eb2c2d61161022c5780633e6134b8116101e55780633e6134b81461048f5780633f0f37f6146104a25780634cd88b76146104b55780634e1273f4146104c8578063596798ad146104db57806361e5bc6b146104ee57806366d1e9d01461050157600080fd5b80632eb2c2d61461041b57806330176e131461042e5780633071a0f91461044157806331ae450b14610454578063332dd1ae146104695780633db0f8ab1461047c57600080fd5b8063162094c411610289578063162094c41461037657806320e4afe21461038957806322f374d01461039c578063239be317146103c157806324d7806c146103d45780632a55205a146103e75780632d3456701461040857600080fd5b8062fdd58e146102d057806301ffc9a7146102f657806302e7afb71461031957806306fdde031461032e5780630e89341c146103435780630ebd4c7f14610356575b600080fd5b6102e36102de36600461482c565b6106d3565b6040519081526020015b60405180910390f35b61030961030436600461486e565b61076e565b60405190151581526020016102ed565b61032c61032736600461488b565b610797565b005b6103366107e3565b6040516102ed91906148f8565b61033661035136600461490b565b610871565b61036961036436600461490b565b61087c565b6040516102ed919061495f565b61032c6103843660046149b3565b610887565b61032c610397366004614a42565b6108d7565b60cd546001600160a01b03165b6040516001600160a01b0390911681526020016102ed565b6103a96103cf36600461490b565b61092b565b6103096103e236600461488b565b610936565b6103fa6103f5366004614abb565b610965565b6040516102ed929190614add565b61032c61041636600461488b565b61097e565b61032c610429366004614c4f565b6109db565b61032c61043c366004614cfc565b610a20565b61032c61044f366004614d3d565b610a9f565b61045c610af5565b6040516102ed9190614db1565b61032c610477366004614dc4565b610ba3565b61032c61048a366004614e2f565b610bf7565b61032c61049d366004614cfc565b610d14565b61032c6104b0366004614eb2565b610d28565b61032c6104c3366004614f19565b610d7d565b6103696104d6366004614f7c565b610ec1565b61032c6104e936600461488b565b610fea565b61032c6104fc36600461503e565b611033565b61032c61050f366004614cfc565b6110b5565b61032c610522366004615099565b6110c7565b61032c61053536600461488b565b6112a0565b61032c6112f8565b61032c610550366004615132565b61130c565b61045c61131f565b61036961056b366004615099565b6113bf565b6103a961147a565b610336611489565b61032c61058e366004614cfc565b611496565b61032c6105a1366004615188565b6114e0565b61032c6105b436600461503e565b6114eb565b61032c6105c73660046151c1565b6115a5565b61032c6105da3660046151de565b6115b7565b61045c6105ed36600461490b565b611604565b61060561060036600461490b565b61160f565b6040516102ed92919061521d565b6102e361062136600461490b565b600090815260dd602052604090205490565b61032c61064136600461488b565b611624565b61032c610654366004615099565b61166d565b61032c6106673660046149b3565b6117e2565b61030961067a36600461524b565b6117f5565b61032c61068d36600461524b565b611823565b61032c6106a0366004615279565b61186d565b61032c6106b336600461488b565b6118b2565b6103696106c6366004615099565b611928565b6102e3600281565b60006001600160a01b0383166107435760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152609a602090815260408083206001600160a01b03861684529091529020545b92915050565b600061077982611a07565b80610788575061078882611a2c565b80610768575061076882611a6c565b336107a061147a565b6001600160a01b031614806107bb57506107bb606633611a91565b6107d75760405162461bcd60e51b815260040161073a906152e1565b6107e081611ab6565b50565b60db80546107f090615325565b80601f016020809104026020016040519081016040528092919081815260200182805461081c90615325565b80156108695780601f1061083e57610100808354040283529160200191610869565b820191906000526020600020905b81548152906001019060200180831161084c57829003601f168201915b505050505081565b606061076882611bc2565b606061076882611e69565b3361089061147a565b6001600160a01b031614806108ab57506108ab606633611a91565b6108c75760405162461bcd60e51b815260040161073a906152e1565b6108d2838383611e74565b505050565b336108e061147a565b6001600160a01b031614806108fb57506108fb606633611a91565b6109175760405162461bcd60e51b815260040161073a906152e1565b6109248585858585611edc565b5050505050565b600061076882611f63565b6000816001600160a01b031661094a61147a565b6001600160a01b031614806107685750610768606683611a91565b6000806109728484611fee565b915091505b9250929050565b6109866120c5565b610991606682611a91565b156107e05760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a36109d7606682612124565b5050565b6001600160a01b0385163314806109f757506109f785336117f5565b610a135760405162461bcd60e51b815260040161073a90615359565b6109248585858585612139565b33610a2961147a565b6001600160a01b03161480610a445750610a44606633611a91565b610a605760405162461bcd60e51b815260040161073a906152e1565b6109d782828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122d492505050565b33610aa861147a565b6001600160a01b03161480610ac35750610ac3606633611a91565b610adf5760405162461bcd60e51b815260040161073a906152e1565b610ae883612308565b6108d28383836000612330565b6060610b01606661241d565b6001600160401b03811115610b1857610b18614af6565b604051908082528060200260200182016040528015610b41578160200160208202803683370190505b50905060005b610b51606661241d565b811015610b9f57610b63606682612427565b828281518110610b7557610b756153a8565b6001600160a01b039092166020928302919091019091015280610b97816153d4565b915050610b47565b5090565b33610bac61147a565b6001600160a01b03161480610bc75750610bc7606633611a91565b610be35760405162461bcd60e51b815260040161073a906152e1565b610bf1600085858585612433565b50505050565b600260655403610c195760405162461bcd60e51b815260040161073a906153ed565b60026065556001600160a01b038316331480610c3a5750610c3a83336117f5565b610c865760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564604482015260640161073a565b8051825114610ca75760405162461bcd60e51b815260040161073a90615424565b8151600103610cf457610cef8383600081518110610cc757610cc76153a8565b602002602001015183600081518110610ce257610ce26153a8565b6020026020010151612520565b610cff565b610cff838383612553565b610d0a8383836125cc565b5050600160655550565b610d1c612735565b6109d78282600061278c565b33610d3161147a565b6001600160a01b03161480610d4c5750610d4c606633611a91565b610d685760405162461bcd60e51b815260040161073a906152e1565b610d7184612308565b610bf184848484612330565b600054610100900460ff1615808015610d9d5750600054600160ff909116105b80610db75750303b158015610db7575060005460ff166001145b610e1a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161073a565b6000805460ff191660011790558015610e3d576000805461ff0019166101001790555b610e55604051806020016040528060008152506127c9565b610e5d6127f9565b60db610e6984826154a6565b5060dc610e7683826154a6565b5080156108d2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b60608151835114610f265760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161073a565b600083516001600160401b03811115610f4157610f41614af6565b604051908082528060200260200182016040528015610f6a578160200160208202803683370190505b50905060005b8451811015610fe257610fb5858281518110610f8e57610f8e6153a8565b6020026020010151858381518110610fa857610fa86153a8565b60200260200101516106d3565b828281518110610fc757610fc76153a8565b6020908102919091010152610fdb816153d4565b9050610f70565b509392505050565b33610ff361147a565b6001600160a01b0316148061100e575061100e606633611a91565b61102a5760405162461bcd60e51b815260040161073a906152e1565b6107e081612828565b61103b612735565b8251811461105b5760405162461bcd60e51b815260040161073a90615424565b60005b8351811015610bf1576110ad84828151811061107c5761107c6153a8565b6020026020010151848484818110611096576110966153a8565b90506020028101906110a8919061555f565b61287c565b60010161105e565b6110bd612735565b6109d782826128b2565b6002606554036110e95760405162461bcd60e51b815260040161073a906153ed565b6002606555336110f761147a565b6001600160a01b031614806111125750611112606633611a91565b61112e5760405162461bcd60e51b815260040161073a906152e1565b60005b838110156111f257600085858381811061114d5761114d6153a8565b905060200201359050600081118015611168575060cc548111155b6111845760405162461bcd60e51b815260040161073a906155a5565b600081815260d460205260409020546001600160a01b0316156111e95760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e206372656174656420627920657874656e73696f6e000000000000604482015260640161073a565b50600101611131565b50611293600087878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506128cc92505050565b5050600160655550505050565b6112a86120c5565b6112b3606682611a91565b6107e05760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a36109d7606682612b8f565b6113006120c5565b61130a6000612ba4565b565b611314612735565b6108d283838361278c565b606061132b60ce61241d565b6001600160401b0381111561134257611342614af6565b60405190808252806020026020018201604052801561136b578160200160208202803683370190505b50905060005b61137b60ce61241d565b811015610b9f5761138d60ce82612427565b82828151811061139f5761139f6153a8565b6001600160a01b0390921660209283029190910190910152600101611371565b60606002606554036113e35760405162461bcd60e51b815260040161073a906153ed565b60026065556113f0612735565b61146a3388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525061146592508891508990506155cc565b612bf6565b6001606555979650505050505050565b6033546001600160a01b031690565b60dc80546107f090615325565b3361149f61147a565b6001600160a01b031614806114ba57506114ba606633611a91565b6114d65760405162461bcd60e51b815260040161073a906152e1565b6109d78282612f7c565b6109d7338383612fb1565b336114f461147a565b6001600160a01b0316148061150f575061150f606633611a91565b61152b5760405162461bcd60e51b815260040161073a906152e1565b8251811461154b5760405162461bcd60e51b815260040161073a90615424565b60005b8351811015610bf15761159d84828151811061156c5761156c6153a8565b6020026020010151848484818110611586576115866153a8565b9050602002810190611598919061555f565b611e74565b60010161154e565b6115ad612735565b6107e03382613091565b336115c061147a565b6001600160a01b031614806115db57506115db606633611a91565b6115f75760405162461bcd60e51b815260040161073a906152e1565b6109248585858585612433565b606061076882613109565b60608061161b8361311b565b91509150915091565b3361162d61147a565b6001600160a01b031614806116485750611648606633611a91565b6116645760405162461bcd60e51b815260040161073a906152e1565b6107e0816134cb565b60026065540361168f5760405162461bcd60e51b815260040161073a906153ed565b600260655561169c612735565b60005b83811015611742573360d460008787858181106116be576116be6153a8565b60209081029290920135835250810191909152604001600020546001600160a01b03161461173a5760405162461bcd60e51b815260206004820152602360248201527f546f6b656e206e6f742063726561746564206279207468697320657874656e7360448201526234b7b760e91b606482015260840161073a565b60010161169f565b506112933387878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506128cc92505050565b6117ea612735565b6108d283838361287c565b6001600160a01b039182166000908152609b6020908152604080832093909416825291909152205460ff1690565b3361182c61147a565b6001600160a01b031614806118475750611847606633611a91565b6118635760405162461bcd60e51b815260040161073a906152e1565b6109d7828261350c565b6001600160a01b038516331480611889575061188985336117f5565b6118a55760405162461bcd60e51b815260040161073a90615359565b6109248585858585613635565b6118ba6120c5565b6001600160a01b03811661191f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161073a565b6107e081612ba4565b606060026065540361194c5760405162461bcd60e51b815260040161073a906153ed565b60026065553361195a61147a565b6001600160a01b031614806119755750611975606633611a91565b6119915760405162461bcd60e51b815260040161073a906152e1565b61146a600088888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525061146592508891508990506155cc565b60006001600160e01b031982166301f4921160e61b148061076857506107688261375f565b60006001600160e01b03198216636cdb3d1360e11b1480611a5d57506001600160e01b031982166303a24d0760e21b145b80610768575061076882613810565b60006001600160e01b03198216632a9f3abf60e11b1480610768575061076882613810565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6001600160a01b03811615801590611ad757506001600160a01b0381163014155b611b1f5760405162461bcd60e51b815260206004820152601960248201527821b0b73737ba10313630b1b5b634b9ba103cb7bab939b2b63360391b604482015260640161073a565b611b2a60ce82611a91565b15611b725760405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a7890147990600090a3611b7060ce82612124565b505b611b7d60d082611a91565b6107e05760405133906001600160a01b038316907f05ac7bc5a606cd92a63365f9fda244499b9add0526b22d99937b6bd88181059c90600090a36109d760d082612b8f565b6060600082118015611bd6575060cc548211155b611bf25760405162461bcd60e51b815260040161073a906155a5565b600082815260d460205260409020546001600160a01b0316611c1560d082611a91565b15611c325760405162461bcd60e51b815260040161073a90615649565b600083815260d8602052604090208054611c4b90615325565b159050611d65576001600160a01b038116600090815260d7602052604090208054611c7590615325565b159050611cc6576001600160a01b038116600090815260d76020908152604080832086845260d88352928190209051611caf9392016156eb565b604051602081830303815290604052915050919050565b600083815260d8602052604090208054611cdf90615325565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0b90615325565b8015611d585780601f10611d2d57610100808354040283529160200191611d58565b820191906000526020600020905b815481529060010190602001808311611d3b57829003601f168201915b5050505050915050919050565b611d768163e9dc637560e01b613826565b15611dee5760405163e9dc637560e01b81526001600160a01b0382169063e9dc637590611da99030908790600401614add565b600060405180830381865afa158015611dc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611aaf9190810190615700565b6001600160a01b038116600090815260d6602052604090205460ff16611e40576001600160a01b038116600090815260d560205260409020611e2f84613842565b604051602001611caf929190615781565b6001600160a01b038116600090815260d5602052604090208054611cdf90615325565b50919050565b6060611aaf8261311b565b600083118015611e86575060cc548311155b8015611ea75750600083815260d460205260409020546001600160a01b0316155b611ec35760405162461bcd60e51b815260040161073a906155a5565b600083815260d860205260409020610bf18284836157a6565b611ee88484848461394a565b600085815260da60205260408120611eff916147df565b611f1e8484848460da60008b81526020019081526020016000206139ef565b847fabb46fe0761d77584bde75697647804ffd8113abd4d8d06bc664150395eccdee85858585604051611f54949392919061585f565b60405180910390a25050505050565b600081815260d460205260409020546001600160a01b031680611fc15760405162461bcd60e51b815260206004820152601660248201527527379032bc3a32b739b4b7b7103337b9103a37b5b2b760511b604482015260640161073a565b611fcc60d082611a91565b15611fe95760405162461bcd60e51b815260040161073a90615649565b919050565b600080600080611ffd8661311b565b915091506001825111156120535760405162461bcd60e51b815260206004820152601c60248201527f4d6f7265207468616e203120726f79616c747920726563656976657200000000604482015260640161073a565b815160000361206a57306000935093505050610977565b8160008151811061207d5761207d6153a8565b6020026020010151612710868360008151811061209c5761209c6153a8565b60200260200101516120ae91906158dd565b6120b8919061590a565b9350935050509250929050565b336120ce61147a565b6001600160a01b03161461130a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161073a565b6000611aaf836001600160a01b038416613aaa565b815183511461215a5760405162461bcd60e51b815260040161073a9061591e565b6001600160a01b0384166121805760405162461bcd60e51b815260040161073a90615966565b3361218f818787878787613b9d565b60005b84518110156122785760008582815181106121af576121af6153a8565b6020026020010151905060008583815181106121cd576121cd6153a8565b6020908102919091018101516000848152609a835260408082206001600160a01b038e16835290935291909120549091508181101561221e5760405162461bcd60e51b815260040161073a906159ab565b6000838152609a602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061225d9084906159f5565b9250508190555050505080612271906153d4565b9050612192565b50846001600160a01b0316866001600160a01b0316826001600160a01b0316600080516020615f8a83398151915287876040516122b6929190615a08565b60405180910390a46122cc818787878787613ba9565b505050505050565b6000805260d56020527ff5cbbbf491ecca09b3146460212af7a9a122ceb752655fe793fa94eb0eeed0a66109d782826154a6565b61231360d082611a91565b156107e05760405162461bcd60e51b815260040161073a90615649565b6001600160a01b038416301480159061235257506001600160a01b0384163b15155b6123885760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b604482015260640161073a565b60405133906001600160a01b038616907fd8cb8ba4086944eabf43c5535b7712015e4d4c714b24bf812c040ea5b7a3e42a90600090a36001600160a01b038416600090815260d5602052604090206123e18385836157a6565b506001600160a01b038416600090815260d660205260409020805460ff191682151517905561241160ce85612b8f565b50610bf1846001613091565b6000610768825490565b6000611aaf8383613d0d565b61243f8484848461394a565b6001600160a01b038516600090815260d960205260408120612460916147df565b6124918484848460d960008b6001600160a01b03166001600160a01b031681526020019081526020016000206139ef565b6001600160a01b0385166124e1577f2b6849d5976d799a5b0ca4dfd6b40a3d7afe9ea72c091fa01a958594f9a2659b848484846040516124d4949392919061585f565b60405180910390a1610924565b846001600160a01b03167f535a93d2cb000582c0ebeaa9be4890ec6a287f98eb2df00c54c300612fd78d8f85858585604051611f54949392919061585f565b61252b838383613d37565b600082815260dd602052604081208054839290612549908490615a1b565b9091555050505050565b61255e838383613e41565b60005b8251811015610bf15781818151811061257c5761257c6153a8565b602002602001015160dd600085848151811061259a5761259a6153a8565b6020026020010151815260200190815260200160002060008282546125bf9190615a1b565b9091555050600101612561565b60008251116125ed5760405162461bcd60e51b815260040161073a90615424565b600060d4600084600081518110612606576126066153a8565b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b0316905060005b83518110156126a757816001600160a01b031660d4600086848151811061265e5761265e6153a8565b6020908102919091018101518252810191909152604001600020546001600160a01b03161461269f5760405162461bcd60e51b815260040161073a90615a2e565b600101612635565b506001600160a01b03811615610bf1576126c8816303dc6f6560e51b613826565b15610bf1576040516303dc6f6560e51b81526001600160a01b03821690637b8deca0906126fd90879087908790600401615a65565b600060405180830381600087803b15801561271757600080fd5b505af115801561272b573d6000803e3d6000fd5b5050505050505050565b61274060ce33611a91565b61130a5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206265207265676973746572656420657874656e73696f6e00000000604482015260640161073a565b33600090815260d5602052604090206127a68385836157a6565b5033600090815260d660205260409020805460ff19169115159190911790555050565b600054610100900460ff166127f05760405162461bcd60e51b815260040161073a90615a9b565b6107e081613fce565b600054610100900460ff166128205760405162461bcd60e51b815260040161073a90615a9b565b61130a613ffe565b60cd80546001600160a01b0319166001600160a01b0383169081179091556040519081527f959c0e47a2fe3cf01e237ba4892e2cc3194d77cbfb33e434e40873225d6b595f9060200160405180910390a150565b600083815260d460205260409020546001600160a01b03163314611ec35760405162461bcd60e51b815260040161073a906155a5565b33600090815260d7602052604090206108d28284836157a6565b6001600160a01b038416156128e6576128e683838361402e565b825160011480156128f8575081516001145b8015612905575080516001145b156129ac576129a783600081518110612920576129206153a8565b60200260200101518360008151811061293b5761293b6153a8565b602002602001015183600081518110612956576129566153a8565b602002602001015160006001600160401b0381111561297757612977614af6565b6040519080825280601f01601f1916602001820160405280156129a1576020820181803683370190505b506140bd565b610bf1565b825160011480156129be575080518251145b15612a2c576129a7836000815181106129d9576129d96153a8565b6020026020010151838360006001600160401b038111156129fc576129fc614af6565b6040519080825280601f01601f191660200182016040528015612a26576020820181803683370190505b506140f2565b81516001148015612a3e575080516001145b15612aa85760005b8351811015612aa257612a9a848281518110612a6457612a646153a8565b602002602001015184600081518110612a7f57612a7f6153a8565b602002602001015184600081518110612956576129566153a8565b600101612a46565b50610bf1565b81516001148015612aba575080518351145b15612b1d5760005b8351811015612aa257612b15848281518110612ae057612ae06153a8565b602002602001015184600081518110612afb57612afb6153a8565b6020026020010151848481518110612956576129566153a8565b600101612ac2565b81518351148015612b2f575080518351145b15612b775760005b8351811015612aa257612b6f848281518110612b5557612b556153a8565b6020026020010151848381518110612afb57612afb6153a8565b600101612b37565b60405162461bcd60e51b815260040161073a90615424565b6000611aaf836001600160a01b03841661416c565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600184511115612c615760408051600180825281830190925290602080830190803683370190505090506001825111158015612c405750825160011480612c40575082518451145b612c5c5760405162461bcd60e51b815260040161073a90615424565b612cd3565b82516001600160401b03811115612c7a57612c7a614af6565b604051908082528060200260200182016040528015612ca3578160200160208202803683370190505b509050815160001480612cb7575081518351145b612cd35760405162461bcd60e51b815260040161073a90615424565b60005b8151811015612d4a5760cc60008154612cee906153d4565b9091555060cc548251839083908110612d0957612d096153a8565b60209081029190910181019190915260cc54600090815260d49091526040902080546001600160a01b0319166001600160a01b038816179055600101612cd6565b506001600160a01b03851615612d6557612d6584828561402e565b83516001148015612d77575080516001145b15612dcd57612dc884600081518110612d9257612d926153a8565b602002602001015182600081518110612dad57612dad6153a8565b602002602001015185600081518110612956576129566153a8565b612edc565b600184511115612ea3578251600103612e455760005b8451811015612e3f57612e37858281518110612e0157612e016153a8565b602002602001015183600081518110612e1c57612e1c6153a8565b602002602001015186600081518110612956576129566153a8565b600101612de3565b50612edc565b60005b8451811015612e3f57612e9b858281518110612e6657612e666153a8565b602002602001015183600081518110612e8157612e816153a8565b6020026020010151868481518110612956576129566153a8565b600101612e48565b612edc84600081518110612eb957612eb96153a8565b6020026020010151828560006001600160401b038111156129fc576129fc614af6565b60005b8151811015612f7357825181108015612f1257506000838281518110612f0757612f076153a8565b602002602001015151115b15612f6b57828181518110612f2957612f296153a8565b602002602001015160d86000848481518110612f4757612f476153a8565b602002602001015181526020019081526020016000209081612f6991906154a6565b505b600101612edf565b50949350505050565b6000805260d76020527f8c93e91f2d3cdfe48d7e628f6e539bf3196799b8a9f7303c20a1106ca52f335a6108d28284836157a6565b816001600160a01b0316836001600160a01b0316036130245760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161073a565b6001600160a01b038381166000818152609b6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6130a5826001620e90cb60e41b0319613826565b156109d7576001600160a01b038216600081815260d36020908152604091829020805460ff191685151590811790915591519182527f072a7592283e2c2d1d56d21517ff6013325e0f55483f4828373ff4d98b0a1a36910160405180910390a25050565b60606131148261311b565b5092915050565b606080600060da6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561319d57600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff1681830152825260019092019101613153565b50505050905080516000036132ec57600084815260d460205260409020546001600160a01b031680156132ea576131db81634e53ee3d60e11b613826565b1561326657604051634e53ee3d60e11b81526001600160a01b03821690639ca7dc7a9061320e9030908990600401614add565b600060405180830381865afa15801561322b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132539190810190615b4c565b8151919550935015613266575050915091565b6001600160a01b038116600090815260d96020908152604080832080548251818502810185019093528083529193909284015b828210156132e357600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff1681830152825260019092019101613299565b5050505091505b505b805160000361338f57600080805260d960209081527f665fecb6766038646257fb3193371280b91d4ee69f1071872c4c7b974431a4888054604080518285028101850190915281815293919290919084015b8282101561338857600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff168183015282526001909201910161333e565b5050505090505b8051156134c55780516001600160401b038111156133af576133af614af6565b6040519080825280602002602001820160405280156133d8578160200160208202803683370190505b50925080516001600160401b038111156133f4576133f4614af6565b60405190808252806020026020018201604052801561341d578160200160208202803683370190505b50915060005b81518110156134c35781818151811061343e5761343e6153a8565b60200260200101516000015184828151811061345c5761345c6153a8565b60200260200101906001600160a01b031690816001600160a01b03168152505081818151811061348e5761348e6153a8565b60200260200101516020015161ffff168382815181106134b0576134b06153a8565b6020908102919091010152600101613423565b505b50915091565b60405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a7890147990600090a36109d760ce82612124565b61351760ce83611a91565b6135575760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21032bc3a32b739b4b7b760791b604482015260640161073a565b6001600160a01b03811615806135795750613579816378ea2a9760e11b613826565b6135b75760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161073a565b6001600160a01b03828116600090815260d260205260409020548116908216146109d7576001600160a01b03828116600081815260d2602052604080822080546001600160a01b031916948616948517905551339392917f6a835c4fcf7e0d398db3762332fdaa1471814ad39f1e2d6d0b3fdabf8efee3e091a45050565b6001600160a01b03841661365b5760405162461bcd60e51b815260040161073a90615966565b336000613667856141bb565b90506000613674856141bb565b9050613684838989858589613b9d565b6000868152609a602090815260408083206001600160a01b038c168452909152902054858110156136c75760405162461bcd60e51b815260040161073a906159ab565b6000878152609a602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906137069084906159f5565b909155505060408051888152602081018890526001600160a01b03808b16928c82169291881691600080516020615faa833981519152910160405180910390a4613754848a8a8a8a8a614206565b505050505050505050565b60006001600160e01b031982166314d9799760e21b148061379057506001600160e01b031982166328f10a2160e01b145b8061379f575061379f82611a2c565b806137ba57506001600160e01b03198216635d9dd7eb60e11b145b806137d557506001600160e01b03198216632dde656160e21b145b806137f057506001600160e01b031982166335681b5360e21b145b8061076857506001600160e01b0319821663152a902d60e11b1492915050565b6001600160e01b0319166301ffc9a760e01b1490565b6000613831836142c1565b8015611aaf5750611aaf83836142f4565b6060816000036138695750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613893578061387d816153d4565b915061388c9050600a8361590a565b915061386d565b6000816001600160401b038111156138ad576138ad614af6565b6040519080825280601f01601f1916602001820160405280156138d7576020820181803683370190505b5090505b8415613942576138ec600183615a1b565b91506138f9600a86615c11565b6139049060306159f5565b60f81b818381518110613919576139196153a8565b60200101906001600160f81b031916908160001a90535061393b600a8661590a565b94506138db565b949350505050565b8281146139695760405162461bcd60e51b815260040161073a90615424565b6000805b828110156139a357838382818110613987576139876153a8565b905060200201358261399991906159f5565b915060010161396d565b5061271081106109245760405162461bcd60e51b8152602060048201526017602482015276496e76616c696420746f74616c20726f79616c7469657360481b604482015260640161073a565b60005b828110156122cc57816040518060400160405280888885818110613a1857613a186153a8565b9050602002016020810190613a2d919061488b565b6001600160a01b03168152602001868685818110613a4d57613a4d6153a8565b61ffff602091820293909301358316909352508354600181810186556000958652948390208451910180549490930151909116600160a01b026001600160b01b03199093166001600160a01b0390911617919091179055016139f2565b60008181526001830160205260408120548015613b93576000613ace600183615a1b565b8554909150600090613ae290600190615a1b565b9050818114613b47576000866000018281548110613b0257613b026153a8565b9060005260206000200154905080876000018481548110613b2557613b256153a8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613b5857613b58615c25565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610768565b6000915050610768565b6122cc8585858561437d565b6001600160a01b0384163b156122cc5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613bed9089908990889088908890600401615c3b565b6020604051808303816000875af1925050508015613c28575060408051601f3d908101601f19168201909252613c2591810190615c99565b60015b613cd457613c34615cb6565b806308c379a003613c6d5750613c48615cd2565b80613c535750613c6f565b8060405162461bcd60e51b815260040161073a91906148f8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161073a565b6001600160e01b0319811663bc197c8160e01b14613d045760405162461bcd60e51b815260040161073a90615d5b565b50505050505050565b6000826000018281548110613d2457613d246153a8565b9060005260206000200154905092915050565b6001600160a01b038316613d5d5760405162461bcd60e51b815260040161073a90615da3565b336000613d69846141bb565b90506000613d76846141bb565b9050613d9683876000858560405180602001604052806000815250613b9d565b6000858152609a602090815260408083206001600160a01b038a16845290915290205484811015613dd95760405162461bcd60e51b815260040161073a90615de6565b6000868152609a602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a9052909290881691600080516020615faa833981519152910160405180910390a4604080516020810190915260009052613d04565b6001600160a01b038316613e675760405162461bcd60e51b815260040161073a90615da3565b8051825114613e885760405162461bcd60e51b815260040161073a9061591e565b6000339050613eab81856000868660405180602001604052806000815250613b9d565b60005b8351811015613f73576000848281518110613ecb57613ecb6153a8565b602002602001015190506000848381518110613ee957613ee96153a8565b6020908102919091018101516000848152609a835260408082206001600160a01b038c168352909352919091205490915081811015613f3a5760405162461bcd60e51b815260040161073a90615de6565b6000928352609a602090815260408085206001600160a01b038b1686529091529092209103905580613f6b816153d4565b915050613eae565b5060006001600160a01b0316846001600160a01b0316826001600160a01b0316600080516020615f8a8339815191528686604051613fb2929190615a08565b60405180910390a4604080516020810190915260009052610bf1565b600054610100900460ff16613ff55760405162461bcd60e51b815260040161073a90615a9b565b6107e0816145ba565b600054610100900460ff166140255760405162461bcd60e51b815260040161073a90615a9b565b61130a33612ba4565b33600090815260d260205260409020546001600160a01b0316156108d25733600081815260d26020526040908190205490516378ea2a9760e11b81526001600160a01b039091169163f1d4552e9161408f9190879087908790600401615e2a565b600060405180830381600087803b1580156140a957600080fd5b505af1158015613d04573d6000803e3d6000fd5b6140c9848484846145c6565b600083815260dd6020526040812080548492906140e79084906159f5565b909155505050505050565b6140fe84848484614696565b60005b83518110156109245782818151811061411c5761411c6153a8565b602002602001015160dd600086848151811061413a5761413a6153a8565b60200260200101518152602001908152602001600020600082825461415f91906159f5565b9091555050600101614101565b60008181526001830160205260408120546141b357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610768565b506000610768565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106141f5576141f56153a8565b602090810291909101015292915050565b6001600160a01b0384163b156122cc5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061424a9089908990889088908890600401615e74565b6020604051808303816000875af1925050508015614285575060408051601f3d908101601f1916820190925261428291810190615c99565b60015b61429157613c34615cb6565b6001600160e01b0319811663f23a6e6160e01b14613d045760405162461bcd60e51b815260040161073a90615d5b565b60006142d4826301ffc9a760e01b6142f4565b801561076857506142ed826001600160e01b03196142f4565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015614366575060208210155b80156143725750600081115b979650505050505050565b600082511161439e5760405162461bcd60e51b815260040161073a90615424565b600060d46000846000815181106143b7576143b76153a8565b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b0316905060005b835181101561445857816001600160a01b031660d4600086848151811061440f5761440f6153a8565b6020908102919091018101518252810191909152604001600020546001600160a01b0316146144505760405162461bcd60e51b815260040161073a90615a2e565b6001016143e6565b506001600160a01b038116600090815260d3602052604090205460ff16156145125760405163e483517760e01b81526001600160a01b0382169063e4835177906144ae9033908990899089908990600401615eae565b6020604051808303816000875af11580156144cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144f19190615ef4565b61450d5760405162461bcd60e51b815260040161073a90615f11565b610924565b60cd546001600160a01b0316156109245760cd5460405163e483517760e01b81526001600160a01b039091169063e48351779061455b9033908990899089908990600401615eae565b6020604051808303816000875af115801561457a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061459e9190615ef4565b6109245760405162461bcd60e51b815260040161073a90615f11565b609c6109d782826154a6565b6001600160a01b0384166145ec5760405162461bcd60e51b815260040161073a90615f48565b3360006145f8856141bb565b90506000614605856141bb565b905061461683600089858589613b9d565b6000868152609a602090815260408083206001600160a01b038b168452909152812080548792906146489084906159f5565b909155505060408051878152602081018790526001600160a01b03808a169260009291871691600080516020615faa833981519152910160405180910390a4613d0483600089898989614206565b6001600160a01b0384166146bc5760405162461bcd60e51b815260040161073a90615f48565b81518351146146dd5760405162461bcd60e51b815260040161073a9061591e565b336146ed81600087878787613b9d565b60005b84518110156147895783818151811061470b5761470b6153a8565b6020026020010151609a6000878481518110614729576147296153a8565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461477191906159f5565b90915550819050614781816153d4565b9150506146f0565b50846001600160a01b031660006001600160a01b0316826001600160a01b0316600080516020615f8a83398151915287876040516147c8929190615a08565b60405180910390a461092481600087878787613ba9565b50805460008255906000526020600020908101906107e091905b80821115610b9f5780546001600160b01b03191681556001016147f9565b6001600160a01b03811681146107e057600080fd5b6000806040838503121561483f57600080fd5b823561484a81614817565b946020939093013593505050565b6001600160e01b0319811681146107e057600080fd5b60006020828403121561488057600080fd5b8135611aaf81614858565b60006020828403121561489d57600080fd5b8135611aaf81614817565b60005b838110156148c35781810151838201526020016148ab565b50506000910152565b600081518084526148e48160208601602086016148a8565b601f01601f19169290920160200192915050565b602081526000611aaf60208301846148cc565b60006020828403121561491d57600080fd5b5035919050565b600081518084526020808501945080840160005b8381101561495457815187529582019590820190600101614938565b509495945050505050565b602081526000611aaf6020830184614924565b60008083601f84011261498457600080fd5b5081356001600160401b0381111561499b57600080fd5b60208301915083602082850101111561097757600080fd5b6000806000604084860312156149c857600080fd5b8335925060208401356001600160401b038111156149e557600080fd5b6149f186828701614972565b9497909650939450505050565b60008083601f840112614a1057600080fd5b5081356001600160401b03811115614a2757600080fd5b6020830191508360208260051b850101111561097757600080fd5b600080600080600060608688031215614a5a57600080fd5b8535945060208601356001600160401b0380821115614a7857600080fd5b614a8489838a016149fe565b90965094506040880135915080821115614a9d57600080fd5b50614aaa888289016149fe565b969995985093965092949392505050565b60008060408385031215614ace57600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715614b3157614b31614af6565b6040525050565b60006001600160401b03821115614b5157614b51614af6565b5060051b60200190565b600082601f830112614b6c57600080fd5b81356020614b7982614b38565b604051614b868282614b0c565b83815260059390931b8501820192828101915086841115614ba657600080fd5b8286015b84811015614bc15780358352918301918301614baa565b509695505050505050565b60006001600160401b03821115614be557614be5614af6565b50601f01601f191660200190565b600082601f830112614c0457600080fd5b8135614c0f81614bcc565b604051614c1c8282614b0c565b828152856020848701011115614c3157600080fd5b82602086016020830137600092810160200192909252509392505050565b600080600080600060a08688031215614c6757600080fd5b8535614c7281614817565b94506020860135614c8281614817565b935060408601356001600160401b0380821115614c9e57600080fd5b614caa89838a01614b5b565b94506060880135915080821115614cc057600080fd5b614ccc89838a01614b5b565b93506080880135915080821115614ce257600080fd5b50614cef88828901614bf3565b9150509295509295909350565b60008060208385031215614d0f57600080fd5b82356001600160401b03811115614d2557600080fd5b614d3185828601614972565b90969095509350505050565b600080600060408486031215614d5257600080fd5b8335614d5d81614817565b925060208401356001600160401b038111156149e557600080fd5b600081518084526020808501945080840160005b838110156149545781516001600160a01b031687529582019590820190600101614d8c565b602081526000611aaf6020830184614d78565b60008060008060408587031215614dda57600080fd5b84356001600160401b0380821115614df157600080fd5b614dfd888389016149fe565b90965094506020870135915080821115614e1657600080fd5b50614e23878288016149fe565b95989497509550505050565b600080600060608486031215614e4457600080fd5b8335614e4f81614817565b925060208401356001600160401b0380821115614e6b57600080fd5b614e7787838801614b5b565b93506040860135915080821115614e8d57600080fd5b50614e9a86828701614b5b565b9150509250925092565b80151581146107e057600080fd5b60008060008060608587031215614ec857600080fd5b8435614ed381614817565b935060208501356001600160401b03811115614eee57600080fd5b614efa87828801614972565b9094509250506040850135614f0e81614ea4565b939692955090935050565b60008060408385031215614f2c57600080fd5b82356001600160401b0380821115614f4357600080fd5b614f4f86838701614bf3565b93506020850135915080821115614f6557600080fd5b50614f7285828601614bf3565b9150509250929050565b60008060408385031215614f8f57600080fd5b82356001600160401b0380821115614fa657600080fd5b818501915085601f830112614fba57600080fd5b81356020614fc782614b38565b604051614fd48282614b0c565b83815260059390931b8501820192828101915089841115614ff457600080fd5b948201945b8386101561501b57853561500c81614817565b82529482019490820190614ff9565b9650508601359250508082111561503157600080fd5b50614f7285828601614b5b565b60008060006040848603121561505357600080fd5b83356001600160401b038082111561506a57600080fd5b61507687838801614b5b565b9450602086013591508082111561508c57600080fd5b506149f1868287016149fe565b600080600080600080606087890312156150b257600080fd5b86356001600160401b03808211156150c957600080fd5b6150d58a838b016149fe565b909850965060208901359150808211156150ee57600080fd5b6150fa8a838b016149fe565b9096509450604089013591508082111561511357600080fd5b5061512089828a016149fe565b979a9699509497509295939492505050565b60008060006040848603121561514757600080fd5b83356001600160401b0381111561515d57600080fd5b61516986828701614972565b909450925050602084013561517d81614ea4565b809150509250925092565b6000806040838503121561519b57600080fd5b82356151a681614817565b915060208301356151b681614ea4565b809150509250929050565b6000602082840312156151d357600080fd5b8135611aaf81614ea4565b6000806000806000606086880312156151f657600080fd5b853561520181614817565b945060208601356001600160401b0380821115614a7857600080fd5b6040815260006152306040830185614d78565b82810360208401526152428185614924565b95945050505050565b6000806040838503121561525e57600080fd5b823561526981614817565b915060208301356151b681614817565b600080600080600060a0868803121561529157600080fd5b853561529c81614817565b945060208601356152ac81614817565b9350604086013592506060860135915060808601356001600160401b038111156152d557600080fd5b614cef88828901614bf3565b60208082526024908201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616040820152633236b4b760e11b606082015260800190565b600181811c9082168061533957607f821691505b602082108103611e6357634e487b7160e01b600052602260045260246000fd5b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016153e6576153e66153be565b5060010190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600d908201526c125b9d985b1a59081a5b9c1d5d609a1b604082015260600190565b601f8211156108d257600081815260208120601f850160051c810160208610156154725750805b601f850160051c820191505b818110156122cc5782815560010161547e565b600019600383901b1c191660019190911b1790565b81516001600160401b038111156154bf576154bf614af6565b6154d3816154cd8454615325565b8461544b565b602080601f83116001811461550257600084156154f05750858301515b6154fa8582615491565b8655506122cc565b600085815260208120601f198616915b8281101561553157888601518255948401946001909101908401615512565b508582101561554f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808335601e1984360301811261557657600080fd5b8301803591506001600160401b0382111561559057600080fd5b60200191503681900382131561097757600080fd5b6020808252600d908201526c24b73b30b634b2103a37b5b2b760991b604082015260600190565b60006155d783614b38565b6040516155e48282614b0c565b84815260208082019250600586901b85013681111561560257600080fd5b855b8181101561563d5780356001600160401b038111156156235760008081fd5b61562f36828a01614bf3565b865250938201938201615604565b50919695505050505050565b602080825260159082015274115e1d195b9cda5bdb88189b1858dadb1a5cdd1959605a1b604082015260600190565b6000815461568581615325565b6001828116801561569d57600181146156b2576156e1565b60ff19841687528215158302870194506156e1565b8560005260208060002060005b858110156156d85781548a8201529084019082016156bf565b50505082870194505b5050505092915050565b60006139426156fa8386615678565b84615678565b60006020828403121561571257600080fd5b81516001600160401b0381111561572857600080fd5b8201601f8101841361573957600080fd5b805161574481614bcc565b6040516157518282614b0c565b82815286602084860101111561576657600080fd5b6157778360208301602087016148a8565b9695505050505050565b600061578d8285615678565b835161579d8183602088016148a8565b01949350505050565b6001600160401b038311156157bd576157bd614af6565b6157d1836157cb8354615325565b8361544b565b6000601f8411600181146157ff57600085156157ed5750838201355b6157f78682615491565b845550610924565b600083815260209020601f19861690835b828110156158305786850135825560209485019460019092019101615810565b508682101561584d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040808252810184905260008560608301825b878110156158a257823561588581614817565b6001600160a01b0316825260209283019290910190600101615872565b5083810360208501528481526001600160fb1b038511156158c257600080fd5b8460051b915081866020830137016020019695505050505050565b8082028115828204841417610768576107686153be565b634e487b7160e01b600052601260045260246000fd5b600082615919576159196158f4565b500490565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b80820180821115610768576107686153be565b6040815260006152306040830185614924565b81810381811115610768576107686153be565b6020808252601c908201527f4d69736d61746368656420746f6b656e206f726967696e61746f727300000000604082015260600190565b6001600160a01b0384168152606060208201819052600090615a8990830185614924565b82810360408401526157778185614924565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082601f830112615af757600080fd5b81516020615b0482614b38565b604051615b118282614b0c565b83815260059390931b8501820192828101915086841115615b3157600080fd5b8286015b84811015614bc15780518352918301918301615b35565b60008060408385031215615b5f57600080fd5b82516001600160401b0380821115615b7657600080fd5b818501915085601f830112615b8a57600080fd5b81516020615b9782614b38565b604051615ba48282614b0c565b83815260059390931b8501820192828101915089841115615bc457600080fd5b948201945b83861015615beb578551615bdc81614817565b82529482019490820190615bc9565b91880151919650909350505080821115615c0457600080fd5b50614f7285828601615ae6565b600082615c2057615c206158f4565b500690565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0386811682528516602082015260a060408201819052600090615c6790830186614924565b8281036060840152615c798186614924565b90508281036080840152615c8d81856148cc565b98975050505050505050565b600060208284031215615cab57600080fd5b8151611aaf81614858565b600060033d1115615ccf5760046000803e5060005160e01c5b90565b600060443d1015615ce05790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615d0f57505050505090565b8285019150815181811115615d275750505050505090565b843d8701016020828501011115615d415750505050505090565b615d5060208286010187614b0c565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0385168152608060208201819052600090615e4e90830186614d78565b8281036040840152615e608186614924565b905082810360608401526143728185614924565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090614372908301846148cc565b6001600160a01b03868116825285811660208301528416604082015260a060608201819052600090615ee290830185614924565b8281036080840152615c8d8185614924565b600060208284031215615f0657600080fd5b8151611aaf81614ea4565b6020808252601a908201527f457874656e73696f6e20617070726f76616c206661696c757265000000000000604082015260600190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b60608201526080019056fe4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a264697066735822122087e894976939a6cd108252b9737d2bcdaa1b4acdc23217ecf3aa9911aa8feb8864736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102cb5760003560e01c8063695c96e61161017d578063b9c4d9fb116100d9578063e92a89f611610092578063e92a89f614610659578063e985e9c51461066c578063f0cdc4991461067f578063f242432a14610692578063f2fde38b146106a5578063feeb5a9a146106b8578063ffa1ad74146106cb57600080fd5b8063b9c4d9fb146105df578063bb3bafd6146105f2578063bd85b03914610613578063ce8aee9d14610633578063d5a06d4c146105f2578063e6c884dc1461064657600080fd5b80638da5cb5b116101365780638da5cb5b1461057057806395d89b411461057857806399e0dd7c14610580578063a22cb46514610593578063aafb2d44146105a6578063ac0c8cfa146105b9578063b0fe87c9146105cc57600080fd5b8063695c96e6146105145780636d73e66914610527578063715018a61461053a57806382dcc0c81461054257806383b7db63146105555780638c6e84721461055d57600080fd5b80632eb2c2d61161022c5780633e6134b8116101e55780633e6134b81461048f5780633f0f37f6146104a25780634cd88b76146104b55780634e1273f4146104c8578063596798ad146104db57806361e5bc6b146104ee57806366d1e9d01461050157600080fd5b80632eb2c2d61461041b57806330176e131461042e5780633071a0f91461044157806331ae450b14610454578063332dd1ae146104695780633db0f8ab1461047c57600080fd5b8063162094c411610289578063162094c41461037657806320e4afe21461038957806322f374d01461039c578063239be317146103c157806324d7806c146103d45780632a55205a146103e75780632d3456701461040857600080fd5b8062fdd58e146102d057806301ffc9a7146102f657806302e7afb71461031957806306fdde031461032e5780630e89341c146103435780630ebd4c7f14610356575b600080fd5b6102e36102de36600461482c565b6106d3565b6040519081526020015b60405180910390f35b61030961030436600461486e565b61076e565b60405190151581526020016102ed565b61032c61032736600461488b565b610797565b005b6103366107e3565b6040516102ed91906148f8565b61033661035136600461490b565b610871565b61036961036436600461490b565b61087c565b6040516102ed919061495f565b61032c6103843660046149b3565b610887565b61032c610397366004614a42565b6108d7565b60cd546001600160a01b03165b6040516001600160a01b0390911681526020016102ed565b6103a96103cf36600461490b565b61092b565b6103096103e236600461488b565b610936565b6103fa6103f5366004614abb565b610965565b6040516102ed929190614add565b61032c61041636600461488b565b61097e565b61032c610429366004614c4f565b6109db565b61032c61043c366004614cfc565b610a20565b61032c61044f366004614d3d565b610a9f565b61045c610af5565b6040516102ed9190614db1565b61032c610477366004614dc4565b610ba3565b61032c61048a366004614e2f565b610bf7565b61032c61049d366004614cfc565b610d14565b61032c6104b0366004614eb2565b610d28565b61032c6104c3366004614f19565b610d7d565b6103696104d6366004614f7c565b610ec1565b61032c6104e936600461488b565b610fea565b61032c6104fc36600461503e565b611033565b61032c61050f366004614cfc565b6110b5565b61032c610522366004615099565b6110c7565b61032c61053536600461488b565b6112a0565b61032c6112f8565b61032c610550366004615132565b61130c565b61045c61131f565b61036961056b366004615099565b6113bf565b6103a961147a565b610336611489565b61032c61058e366004614cfc565b611496565b61032c6105a1366004615188565b6114e0565b61032c6105b436600461503e565b6114eb565b61032c6105c73660046151c1565b6115a5565b61032c6105da3660046151de565b6115b7565b61045c6105ed36600461490b565b611604565b61060561060036600461490b565b61160f565b6040516102ed92919061521d565b6102e361062136600461490b565b600090815260dd602052604090205490565b61032c61064136600461488b565b611624565b61032c610654366004615099565b61166d565b61032c6106673660046149b3565b6117e2565b61030961067a36600461524b565b6117f5565b61032c61068d36600461524b565b611823565b61032c6106a0366004615279565b61186d565b61032c6106b336600461488b565b6118b2565b6103696106c6366004615099565b611928565b6102e3600281565b60006001600160a01b0383166107435760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152609a602090815260408083206001600160a01b03861684529091529020545b92915050565b600061077982611a07565b80610788575061078882611a2c565b80610768575061076882611a6c565b336107a061147a565b6001600160a01b031614806107bb57506107bb606633611a91565b6107d75760405162461bcd60e51b815260040161073a906152e1565b6107e081611ab6565b50565b60db80546107f090615325565b80601f016020809104026020016040519081016040528092919081815260200182805461081c90615325565b80156108695780601f1061083e57610100808354040283529160200191610869565b820191906000526020600020905b81548152906001019060200180831161084c57829003601f168201915b505050505081565b606061076882611bc2565b606061076882611e69565b3361089061147a565b6001600160a01b031614806108ab57506108ab606633611a91565b6108c75760405162461bcd60e51b815260040161073a906152e1565b6108d2838383611e74565b505050565b336108e061147a565b6001600160a01b031614806108fb57506108fb606633611a91565b6109175760405162461bcd60e51b815260040161073a906152e1565b6109248585858585611edc565b5050505050565b600061076882611f63565b6000816001600160a01b031661094a61147a565b6001600160a01b031614806107685750610768606683611a91565b6000806109728484611fee565b915091505b9250929050565b6109866120c5565b610991606682611a91565b156107e05760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a36109d7606682612124565b5050565b6001600160a01b0385163314806109f757506109f785336117f5565b610a135760405162461bcd60e51b815260040161073a90615359565b6109248585858585612139565b33610a2961147a565b6001600160a01b03161480610a445750610a44606633611a91565b610a605760405162461bcd60e51b815260040161073a906152e1565b6109d782828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122d492505050565b33610aa861147a565b6001600160a01b03161480610ac35750610ac3606633611a91565b610adf5760405162461bcd60e51b815260040161073a906152e1565b610ae883612308565b6108d28383836000612330565b6060610b01606661241d565b6001600160401b03811115610b1857610b18614af6565b604051908082528060200260200182016040528015610b41578160200160208202803683370190505b50905060005b610b51606661241d565b811015610b9f57610b63606682612427565b828281518110610b7557610b756153a8565b6001600160a01b039092166020928302919091019091015280610b97816153d4565b915050610b47565b5090565b33610bac61147a565b6001600160a01b03161480610bc75750610bc7606633611a91565b610be35760405162461bcd60e51b815260040161073a906152e1565b610bf1600085858585612433565b50505050565b600260655403610c195760405162461bcd60e51b815260040161073a906153ed565b60026065556001600160a01b038316331480610c3a5750610c3a83336117f5565b610c865760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564604482015260640161073a565b8051825114610ca75760405162461bcd60e51b815260040161073a90615424565b8151600103610cf457610cef8383600081518110610cc757610cc76153a8565b602002602001015183600081518110610ce257610ce26153a8565b6020026020010151612520565b610cff565b610cff838383612553565b610d0a8383836125cc565b5050600160655550565b610d1c612735565b6109d78282600061278c565b33610d3161147a565b6001600160a01b03161480610d4c5750610d4c606633611a91565b610d685760405162461bcd60e51b815260040161073a906152e1565b610d7184612308565b610bf184848484612330565b600054610100900460ff1615808015610d9d5750600054600160ff909116105b80610db75750303b158015610db7575060005460ff166001145b610e1a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161073a565b6000805460ff191660011790558015610e3d576000805461ff0019166101001790555b610e55604051806020016040528060008152506127c9565b610e5d6127f9565b60db610e6984826154a6565b5060dc610e7683826154a6565b5080156108d2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b60608151835114610f265760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161073a565b600083516001600160401b03811115610f4157610f41614af6565b604051908082528060200260200182016040528015610f6a578160200160208202803683370190505b50905060005b8451811015610fe257610fb5858281518110610f8e57610f8e6153a8565b6020026020010151858381518110610fa857610fa86153a8565b60200260200101516106d3565b828281518110610fc757610fc76153a8565b6020908102919091010152610fdb816153d4565b9050610f70565b509392505050565b33610ff361147a565b6001600160a01b0316148061100e575061100e606633611a91565b61102a5760405162461bcd60e51b815260040161073a906152e1565b6107e081612828565b61103b612735565b8251811461105b5760405162461bcd60e51b815260040161073a90615424565b60005b8351811015610bf1576110ad84828151811061107c5761107c6153a8565b6020026020010151848484818110611096576110966153a8565b90506020028101906110a8919061555f565b61287c565b60010161105e565b6110bd612735565b6109d782826128b2565b6002606554036110e95760405162461bcd60e51b815260040161073a906153ed565b6002606555336110f761147a565b6001600160a01b031614806111125750611112606633611a91565b61112e5760405162461bcd60e51b815260040161073a906152e1565b60005b838110156111f257600085858381811061114d5761114d6153a8565b905060200201359050600081118015611168575060cc548111155b6111845760405162461bcd60e51b815260040161073a906155a5565b600081815260d460205260409020546001600160a01b0316156111e95760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e206372656174656420627920657874656e73696f6e000000000000604482015260640161073a565b50600101611131565b50611293600087878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506128cc92505050565b5050600160655550505050565b6112a86120c5565b6112b3606682611a91565b6107e05760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a36109d7606682612b8f565b6113006120c5565b61130a6000612ba4565b565b611314612735565b6108d283838361278c565b606061132b60ce61241d565b6001600160401b0381111561134257611342614af6565b60405190808252806020026020018201604052801561136b578160200160208202803683370190505b50905060005b61137b60ce61241d565b811015610b9f5761138d60ce82612427565b82828151811061139f5761139f6153a8565b6001600160a01b0390921660209283029190910190910152600101611371565b60606002606554036113e35760405162461bcd60e51b815260040161073a906153ed565b60026065556113f0612735565b61146a3388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525061146592508891508990506155cc565b612bf6565b6001606555979650505050505050565b6033546001600160a01b031690565b60dc80546107f090615325565b3361149f61147a565b6001600160a01b031614806114ba57506114ba606633611a91565b6114d65760405162461bcd60e51b815260040161073a906152e1565b6109d78282612f7c565b6109d7338383612fb1565b336114f461147a565b6001600160a01b0316148061150f575061150f606633611a91565b61152b5760405162461bcd60e51b815260040161073a906152e1565b8251811461154b5760405162461bcd60e51b815260040161073a90615424565b60005b8351811015610bf15761159d84828151811061156c5761156c6153a8565b6020026020010151848484818110611586576115866153a8565b9050602002810190611598919061555f565b611e74565b60010161154e565b6115ad612735565b6107e03382613091565b336115c061147a565b6001600160a01b031614806115db57506115db606633611a91565b6115f75760405162461bcd60e51b815260040161073a906152e1565b6109248585858585612433565b606061076882613109565b60608061161b8361311b565b91509150915091565b3361162d61147a565b6001600160a01b031614806116485750611648606633611a91565b6116645760405162461bcd60e51b815260040161073a906152e1565b6107e0816134cb565b60026065540361168f5760405162461bcd60e51b815260040161073a906153ed565b600260655561169c612735565b60005b83811015611742573360d460008787858181106116be576116be6153a8565b60209081029290920135835250810191909152604001600020546001600160a01b03161461173a5760405162461bcd60e51b815260206004820152602360248201527f546f6b656e206e6f742063726561746564206279207468697320657874656e7360448201526234b7b760e91b606482015260840161073a565b60010161169f565b506112933387878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506128cc92505050565b6117ea612735565b6108d283838361287c565b6001600160a01b039182166000908152609b6020908152604080832093909416825291909152205460ff1690565b3361182c61147a565b6001600160a01b031614806118475750611847606633611a91565b6118635760405162461bcd60e51b815260040161073a906152e1565b6109d7828261350c565b6001600160a01b038516331480611889575061188985336117f5565b6118a55760405162461bcd60e51b815260040161073a90615359565b6109248585858585613635565b6118ba6120c5565b6001600160a01b03811661191f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161073a565b6107e081612ba4565b606060026065540361194c5760405162461bcd60e51b815260040161073a906153ed565b60026065553361195a61147a565b6001600160a01b031614806119755750611975606633611a91565b6119915760405162461bcd60e51b815260040161073a906152e1565b61146a600088888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525061146592508891508990506155cc565b60006001600160e01b031982166301f4921160e61b148061076857506107688261375f565b60006001600160e01b03198216636cdb3d1360e11b1480611a5d57506001600160e01b031982166303a24d0760e21b145b80610768575061076882613810565b60006001600160e01b03198216632a9f3abf60e11b1480610768575061076882613810565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6001600160a01b03811615801590611ad757506001600160a01b0381163014155b611b1f5760405162461bcd60e51b815260206004820152601960248201527821b0b73737ba10313630b1b5b634b9ba103cb7bab939b2b63360391b604482015260640161073a565b611b2a60ce82611a91565b15611b725760405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a7890147990600090a3611b7060ce82612124565b505b611b7d60d082611a91565b6107e05760405133906001600160a01b038316907f05ac7bc5a606cd92a63365f9fda244499b9add0526b22d99937b6bd88181059c90600090a36109d760d082612b8f565b6060600082118015611bd6575060cc548211155b611bf25760405162461bcd60e51b815260040161073a906155a5565b600082815260d460205260409020546001600160a01b0316611c1560d082611a91565b15611c325760405162461bcd60e51b815260040161073a90615649565b600083815260d8602052604090208054611c4b90615325565b159050611d65576001600160a01b038116600090815260d7602052604090208054611c7590615325565b159050611cc6576001600160a01b038116600090815260d76020908152604080832086845260d88352928190209051611caf9392016156eb565b604051602081830303815290604052915050919050565b600083815260d8602052604090208054611cdf90615325565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0b90615325565b8015611d585780601f10611d2d57610100808354040283529160200191611d58565b820191906000526020600020905b815481529060010190602001808311611d3b57829003601f168201915b5050505050915050919050565b611d768163e9dc637560e01b613826565b15611dee5760405163e9dc637560e01b81526001600160a01b0382169063e9dc637590611da99030908790600401614add565b600060405180830381865afa158015611dc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611aaf9190810190615700565b6001600160a01b038116600090815260d6602052604090205460ff16611e40576001600160a01b038116600090815260d560205260409020611e2f84613842565b604051602001611caf929190615781565b6001600160a01b038116600090815260d5602052604090208054611cdf90615325565b50919050565b6060611aaf8261311b565b600083118015611e86575060cc548311155b8015611ea75750600083815260d460205260409020546001600160a01b0316155b611ec35760405162461bcd60e51b815260040161073a906155a5565b600083815260d860205260409020610bf18284836157a6565b611ee88484848461394a565b600085815260da60205260408120611eff916147df565b611f1e8484848460da60008b81526020019081526020016000206139ef565b847fabb46fe0761d77584bde75697647804ffd8113abd4d8d06bc664150395eccdee85858585604051611f54949392919061585f565b60405180910390a25050505050565b600081815260d460205260409020546001600160a01b031680611fc15760405162461bcd60e51b815260206004820152601660248201527527379032bc3a32b739b4b7b7103337b9103a37b5b2b760511b604482015260640161073a565b611fcc60d082611a91565b15611fe95760405162461bcd60e51b815260040161073a90615649565b919050565b600080600080611ffd8661311b565b915091506001825111156120535760405162461bcd60e51b815260206004820152601c60248201527f4d6f7265207468616e203120726f79616c747920726563656976657200000000604482015260640161073a565b815160000361206a57306000935093505050610977565b8160008151811061207d5761207d6153a8565b6020026020010151612710868360008151811061209c5761209c6153a8565b60200260200101516120ae91906158dd565b6120b8919061590a565b9350935050509250929050565b336120ce61147a565b6001600160a01b03161461130a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161073a565b6000611aaf836001600160a01b038416613aaa565b815183511461215a5760405162461bcd60e51b815260040161073a9061591e565b6001600160a01b0384166121805760405162461bcd60e51b815260040161073a90615966565b3361218f818787878787613b9d565b60005b84518110156122785760008582815181106121af576121af6153a8565b6020026020010151905060008583815181106121cd576121cd6153a8565b6020908102919091018101516000848152609a835260408082206001600160a01b038e16835290935291909120549091508181101561221e5760405162461bcd60e51b815260040161073a906159ab565b6000838152609a602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061225d9084906159f5565b9250508190555050505080612271906153d4565b9050612192565b50846001600160a01b0316866001600160a01b0316826001600160a01b0316600080516020615f8a83398151915287876040516122b6929190615a08565b60405180910390a46122cc818787878787613ba9565b505050505050565b6000805260d56020527ff5cbbbf491ecca09b3146460212af7a9a122ceb752655fe793fa94eb0eeed0a66109d782826154a6565b61231360d082611a91565b156107e05760405162461bcd60e51b815260040161073a90615649565b6001600160a01b038416301480159061235257506001600160a01b0384163b15155b6123885760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b604482015260640161073a565b60405133906001600160a01b038616907fd8cb8ba4086944eabf43c5535b7712015e4d4c714b24bf812c040ea5b7a3e42a90600090a36001600160a01b038416600090815260d5602052604090206123e18385836157a6565b506001600160a01b038416600090815260d660205260409020805460ff191682151517905561241160ce85612b8f565b50610bf1846001613091565b6000610768825490565b6000611aaf8383613d0d565b61243f8484848461394a565b6001600160a01b038516600090815260d960205260408120612460916147df565b6124918484848460d960008b6001600160a01b03166001600160a01b031681526020019081526020016000206139ef565b6001600160a01b0385166124e1577f2b6849d5976d799a5b0ca4dfd6b40a3d7afe9ea72c091fa01a958594f9a2659b848484846040516124d4949392919061585f565b60405180910390a1610924565b846001600160a01b03167f535a93d2cb000582c0ebeaa9be4890ec6a287f98eb2df00c54c300612fd78d8f85858585604051611f54949392919061585f565b61252b838383613d37565b600082815260dd602052604081208054839290612549908490615a1b565b9091555050505050565b61255e838383613e41565b60005b8251811015610bf15781818151811061257c5761257c6153a8565b602002602001015160dd600085848151811061259a5761259a6153a8565b6020026020010151815260200190815260200160002060008282546125bf9190615a1b565b9091555050600101612561565b60008251116125ed5760405162461bcd60e51b815260040161073a90615424565b600060d4600084600081518110612606576126066153a8565b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b0316905060005b83518110156126a757816001600160a01b031660d4600086848151811061265e5761265e6153a8565b6020908102919091018101518252810191909152604001600020546001600160a01b03161461269f5760405162461bcd60e51b815260040161073a90615a2e565b600101612635565b506001600160a01b03811615610bf1576126c8816303dc6f6560e51b613826565b15610bf1576040516303dc6f6560e51b81526001600160a01b03821690637b8deca0906126fd90879087908790600401615a65565b600060405180830381600087803b15801561271757600080fd5b505af115801561272b573d6000803e3d6000fd5b5050505050505050565b61274060ce33611a91565b61130a5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206265207265676973746572656420657874656e73696f6e00000000604482015260640161073a565b33600090815260d5602052604090206127a68385836157a6565b5033600090815260d660205260409020805460ff19169115159190911790555050565b600054610100900460ff166127f05760405162461bcd60e51b815260040161073a90615a9b565b6107e081613fce565b600054610100900460ff166128205760405162461bcd60e51b815260040161073a90615a9b565b61130a613ffe565b60cd80546001600160a01b0319166001600160a01b0383169081179091556040519081527f959c0e47a2fe3cf01e237ba4892e2cc3194d77cbfb33e434e40873225d6b595f9060200160405180910390a150565b600083815260d460205260409020546001600160a01b03163314611ec35760405162461bcd60e51b815260040161073a906155a5565b33600090815260d7602052604090206108d28284836157a6565b6001600160a01b038416156128e6576128e683838361402e565b825160011480156128f8575081516001145b8015612905575080516001145b156129ac576129a783600081518110612920576129206153a8565b60200260200101518360008151811061293b5761293b6153a8565b602002602001015183600081518110612956576129566153a8565b602002602001015160006001600160401b0381111561297757612977614af6565b6040519080825280601f01601f1916602001820160405280156129a1576020820181803683370190505b506140bd565b610bf1565b825160011480156129be575080518251145b15612a2c576129a7836000815181106129d9576129d96153a8565b6020026020010151838360006001600160401b038111156129fc576129fc614af6565b6040519080825280601f01601f191660200182016040528015612a26576020820181803683370190505b506140f2565b81516001148015612a3e575080516001145b15612aa85760005b8351811015612aa257612a9a848281518110612a6457612a646153a8565b602002602001015184600081518110612a7f57612a7f6153a8565b602002602001015184600081518110612956576129566153a8565b600101612a46565b50610bf1565b81516001148015612aba575080518351145b15612b1d5760005b8351811015612aa257612b15848281518110612ae057612ae06153a8565b602002602001015184600081518110612afb57612afb6153a8565b6020026020010151848481518110612956576129566153a8565b600101612ac2565b81518351148015612b2f575080518351145b15612b775760005b8351811015612aa257612b6f848281518110612b5557612b556153a8565b6020026020010151848381518110612afb57612afb6153a8565b600101612b37565b60405162461bcd60e51b815260040161073a90615424565b6000611aaf836001600160a01b03841661416c565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600184511115612c615760408051600180825281830190925290602080830190803683370190505090506001825111158015612c405750825160011480612c40575082518451145b612c5c5760405162461bcd60e51b815260040161073a90615424565b612cd3565b82516001600160401b03811115612c7a57612c7a614af6565b604051908082528060200260200182016040528015612ca3578160200160208202803683370190505b509050815160001480612cb7575081518351145b612cd35760405162461bcd60e51b815260040161073a90615424565b60005b8151811015612d4a5760cc60008154612cee906153d4565b9091555060cc548251839083908110612d0957612d096153a8565b60209081029190910181019190915260cc54600090815260d49091526040902080546001600160a01b0319166001600160a01b038816179055600101612cd6565b506001600160a01b03851615612d6557612d6584828561402e565b83516001148015612d77575080516001145b15612dcd57612dc884600081518110612d9257612d926153a8565b602002602001015182600081518110612dad57612dad6153a8565b602002602001015185600081518110612956576129566153a8565b612edc565b600184511115612ea3578251600103612e455760005b8451811015612e3f57612e37858281518110612e0157612e016153a8565b602002602001015183600081518110612e1c57612e1c6153a8565b602002602001015186600081518110612956576129566153a8565b600101612de3565b50612edc565b60005b8451811015612e3f57612e9b858281518110612e6657612e666153a8565b602002602001015183600081518110612e8157612e816153a8565b6020026020010151868481518110612956576129566153a8565b600101612e48565b612edc84600081518110612eb957612eb96153a8565b6020026020010151828560006001600160401b038111156129fc576129fc614af6565b60005b8151811015612f7357825181108015612f1257506000838281518110612f0757612f076153a8565b602002602001015151115b15612f6b57828181518110612f2957612f296153a8565b602002602001015160d86000848481518110612f4757612f476153a8565b602002602001015181526020019081526020016000209081612f6991906154a6565b505b600101612edf565b50949350505050565b6000805260d76020527f8c93e91f2d3cdfe48d7e628f6e539bf3196799b8a9f7303c20a1106ca52f335a6108d28284836157a6565b816001600160a01b0316836001600160a01b0316036130245760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161073a565b6001600160a01b038381166000818152609b6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6130a5826001620e90cb60e41b0319613826565b156109d7576001600160a01b038216600081815260d36020908152604091829020805460ff191685151590811790915591519182527f072a7592283e2c2d1d56d21517ff6013325e0f55483f4828373ff4d98b0a1a36910160405180910390a25050565b60606131148261311b565b5092915050565b606080600060da6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561319d57600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff1681830152825260019092019101613153565b50505050905080516000036132ec57600084815260d460205260409020546001600160a01b031680156132ea576131db81634e53ee3d60e11b613826565b1561326657604051634e53ee3d60e11b81526001600160a01b03821690639ca7dc7a9061320e9030908990600401614add565b600060405180830381865afa15801561322b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132539190810190615b4c565b8151919550935015613266575050915091565b6001600160a01b038116600090815260d96020908152604080832080548251818502810185019093528083529193909284015b828210156132e357600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff1681830152825260019092019101613299565b5050505091505b505b805160000361338f57600080805260d960209081527f665fecb6766038646257fb3193371280b91d4ee69f1071872c4c7b974431a4888054604080518285028101850190915281815293919290919084015b8282101561338857600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff168183015282526001909201910161333e565b5050505090505b8051156134c55780516001600160401b038111156133af576133af614af6565b6040519080825280602002602001820160405280156133d8578160200160208202803683370190505b50925080516001600160401b038111156133f4576133f4614af6565b60405190808252806020026020018201604052801561341d578160200160208202803683370190505b50915060005b81518110156134c35781818151811061343e5761343e6153a8565b60200260200101516000015184828151811061345c5761345c6153a8565b60200260200101906001600160a01b031690816001600160a01b03168152505081818151811061348e5761348e6153a8565b60200260200101516020015161ffff168382815181106134b0576134b06153a8565b6020908102919091010152600101613423565b505b50915091565b60405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a7890147990600090a36109d760ce82612124565b61351760ce83611a91565b6135575760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21032bc3a32b739b4b7b760791b604482015260640161073a565b6001600160a01b03811615806135795750613579816378ea2a9760e11b613826565b6135b75760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161073a565b6001600160a01b03828116600090815260d260205260409020548116908216146109d7576001600160a01b03828116600081815260d2602052604080822080546001600160a01b031916948616948517905551339392917f6a835c4fcf7e0d398db3762332fdaa1471814ad39f1e2d6d0b3fdabf8efee3e091a45050565b6001600160a01b03841661365b5760405162461bcd60e51b815260040161073a90615966565b336000613667856141bb565b90506000613674856141bb565b9050613684838989858589613b9d565b6000868152609a602090815260408083206001600160a01b038c168452909152902054858110156136c75760405162461bcd60e51b815260040161073a906159ab565b6000878152609a602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906137069084906159f5565b909155505060408051888152602081018890526001600160a01b03808b16928c82169291881691600080516020615faa833981519152910160405180910390a4613754848a8a8a8a8a614206565b505050505050505050565b60006001600160e01b031982166314d9799760e21b148061379057506001600160e01b031982166328f10a2160e01b145b8061379f575061379f82611a2c565b806137ba57506001600160e01b03198216635d9dd7eb60e11b145b806137d557506001600160e01b03198216632dde656160e21b145b806137f057506001600160e01b031982166335681b5360e21b145b8061076857506001600160e01b0319821663152a902d60e11b1492915050565b6001600160e01b0319166301ffc9a760e01b1490565b6000613831836142c1565b8015611aaf5750611aaf83836142f4565b6060816000036138695750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613893578061387d816153d4565b915061388c9050600a8361590a565b915061386d565b6000816001600160401b038111156138ad576138ad614af6565b6040519080825280601f01601f1916602001820160405280156138d7576020820181803683370190505b5090505b8415613942576138ec600183615a1b565b91506138f9600a86615c11565b6139049060306159f5565b60f81b818381518110613919576139196153a8565b60200101906001600160f81b031916908160001a90535061393b600a8661590a565b94506138db565b949350505050565b8281146139695760405162461bcd60e51b815260040161073a90615424565b6000805b828110156139a357838382818110613987576139876153a8565b905060200201358261399991906159f5565b915060010161396d565b5061271081106109245760405162461bcd60e51b8152602060048201526017602482015276496e76616c696420746f74616c20726f79616c7469657360481b604482015260640161073a565b60005b828110156122cc57816040518060400160405280888885818110613a1857613a186153a8565b9050602002016020810190613a2d919061488b565b6001600160a01b03168152602001868685818110613a4d57613a4d6153a8565b61ffff602091820293909301358316909352508354600181810186556000958652948390208451910180549490930151909116600160a01b026001600160b01b03199093166001600160a01b0390911617919091179055016139f2565b60008181526001830160205260408120548015613b93576000613ace600183615a1b565b8554909150600090613ae290600190615a1b565b9050818114613b47576000866000018281548110613b0257613b026153a8565b9060005260206000200154905080876000018481548110613b2557613b256153a8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613b5857613b58615c25565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610768565b6000915050610768565b6122cc8585858561437d565b6001600160a01b0384163b156122cc5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613bed9089908990889088908890600401615c3b565b6020604051808303816000875af1925050508015613c28575060408051601f3d908101601f19168201909252613c2591810190615c99565b60015b613cd457613c34615cb6565b806308c379a003613c6d5750613c48615cd2565b80613c535750613c6f565b8060405162461bcd60e51b815260040161073a91906148f8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161073a565b6001600160e01b0319811663bc197c8160e01b14613d045760405162461bcd60e51b815260040161073a90615d5b565b50505050505050565b6000826000018281548110613d2457613d246153a8565b9060005260206000200154905092915050565b6001600160a01b038316613d5d5760405162461bcd60e51b815260040161073a90615da3565b336000613d69846141bb565b90506000613d76846141bb565b9050613d9683876000858560405180602001604052806000815250613b9d565b6000858152609a602090815260408083206001600160a01b038a16845290915290205484811015613dd95760405162461bcd60e51b815260040161073a90615de6565b6000868152609a602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a9052909290881691600080516020615faa833981519152910160405180910390a4604080516020810190915260009052613d04565b6001600160a01b038316613e675760405162461bcd60e51b815260040161073a90615da3565b8051825114613e885760405162461bcd60e51b815260040161073a9061591e565b6000339050613eab81856000868660405180602001604052806000815250613b9d565b60005b8351811015613f73576000848281518110613ecb57613ecb6153a8565b602002602001015190506000848381518110613ee957613ee96153a8565b6020908102919091018101516000848152609a835260408082206001600160a01b038c168352909352919091205490915081811015613f3a5760405162461bcd60e51b815260040161073a90615de6565b6000928352609a602090815260408085206001600160a01b038b1686529091529092209103905580613f6b816153d4565b915050613eae565b5060006001600160a01b0316846001600160a01b0316826001600160a01b0316600080516020615f8a8339815191528686604051613fb2929190615a08565b60405180910390a4604080516020810190915260009052610bf1565b600054610100900460ff16613ff55760405162461bcd60e51b815260040161073a90615a9b565b6107e0816145ba565b600054610100900460ff166140255760405162461bcd60e51b815260040161073a90615a9b565b61130a33612ba4565b33600090815260d260205260409020546001600160a01b0316156108d25733600081815260d26020526040908190205490516378ea2a9760e11b81526001600160a01b039091169163f1d4552e9161408f9190879087908790600401615e2a565b600060405180830381600087803b1580156140a957600080fd5b505af1158015613d04573d6000803e3d6000fd5b6140c9848484846145c6565b600083815260dd6020526040812080548492906140e79084906159f5565b909155505050505050565b6140fe84848484614696565b60005b83518110156109245782818151811061411c5761411c6153a8565b602002602001015160dd600086848151811061413a5761413a6153a8565b60200260200101518152602001908152602001600020600082825461415f91906159f5565b9091555050600101614101565b60008181526001830160205260408120546141b357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610768565b506000610768565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106141f5576141f56153a8565b602090810291909101015292915050565b6001600160a01b0384163b156122cc5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061424a9089908990889088908890600401615e74565b6020604051808303816000875af1925050508015614285575060408051601f3d908101601f1916820190925261428291810190615c99565b60015b61429157613c34615cb6565b6001600160e01b0319811663f23a6e6160e01b14613d045760405162461bcd60e51b815260040161073a90615d5b565b60006142d4826301ffc9a760e01b6142f4565b801561076857506142ed826001600160e01b03196142f4565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015614366575060208210155b80156143725750600081115b979650505050505050565b600082511161439e5760405162461bcd60e51b815260040161073a90615424565b600060d46000846000815181106143b7576143b76153a8565b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b0316905060005b835181101561445857816001600160a01b031660d4600086848151811061440f5761440f6153a8565b6020908102919091018101518252810191909152604001600020546001600160a01b0316146144505760405162461bcd60e51b815260040161073a90615a2e565b6001016143e6565b506001600160a01b038116600090815260d3602052604090205460ff16156145125760405163e483517760e01b81526001600160a01b0382169063e4835177906144ae9033908990899089908990600401615eae565b6020604051808303816000875af11580156144cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144f19190615ef4565b61450d5760405162461bcd60e51b815260040161073a90615f11565b610924565b60cd546001600160a01b0316156109245760cd5460405163e483517760e01b81526001600160a01b039091169063e48351779061455b9033908990899089908990600401615eae565b6020604051808303816000875af115801561457a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061459e9190615ef4565b6109245760405162461bcd60e51b815260040161073a90615f11565b609c6109d782826154a6565b6001600160a01b0384166145ec5760405162461bcd60e51b815260040161073a90615f48565b3360006145f8856141bb565b90506000614605856141bb565b905061461683600089858589613b9d565b6000868152609a602090815260408083206001600160a01b038b168452909152812080548792906146489084906159f5565b909155505060408051878152602081018790526001600160a01b03808a169260009291871691600080516020615faa833981519152910160405180910390a4613d0483600089898989614206565b6001600160a01b0384166146bc5760405162461bcd60e51b815260040161073a90615f48565b81518351146146dd5760405162461bcd60e51b815260040161073a9061591e565b336146ed81600087878787613b9d565b60005b84518110156147895783818151811061470b5761470b6153a8565b6020026020010151609a6000878481518110614729576147296153a8565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461477191906159f5565b90915550819050614781816153d4565b9150506146f0565b50846001600160a01b031660006001600160a01b0316826001600160a01b0316600080516020615f8a83398151915287876040516147c8929190615a08565b60405180910390a461092481600087878787613ba9565b50805460008255906000526020600020908101906107e091905b80821115610b9f5780546001600160b01b03191681556001016147f9565b6001600160a01b03811681146107e057600080fd5b6000806040838503121561483f57600080fd5b823561484a81614817565b946020939093013593505050565b6001600160e01b0319811681146107e057600080fd5b60006020828403121561488057600080fd5b8135611aaf81614858565b60006020828403121561489d57600080fd5b8135611aaf81614817565b60005b838110156148c35781810151838201526020016148ab565b50506000910152565b600081518084526148e48160208601602086016148a8565b601f01601f19169290920160200192915050565b602081526000611aaf60208301846148cc565b60006020828403121561491d57600080fd5b5035919050565b600081518084526020808501945080840160005b8381101561495457815187529582019590820190600101614938565b509495945050505050565b602081526000611aaf6020830184614924565b60008083601f84011261498457600080fd5b5081356001600160401b0381111561499b57600080fd5b60208301915083602082850101111561097757600080fd5b6000806000604084860312156149c857600080fd5b8335925060208401356001600160401b038111156149e557600080fd5b6149f186828701614972565b9497909650939450505050565b60008083601f840112614a1057600080fd5b5081356001600160401b03811115614a2757600080fd5b6020830191508360208260051b850101111561097757600080fd5b600080600080600060608688031215614a5a57600080fd5b8535945060208601356001600160401b0380821115614a7857600080fd5b614a8489838a016149fe565b90965094506040880135915080821115614a9d57600080fd5b50614aaa888289016149fe565b969995985093965092949392505050565b60008060408385031215614ace57600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715614b3157614b31614af6565b6040525050565b60006001600160401b03821115614b5157614b51614af6565b5060051b60200190565b600082601f830112614b6c57600080fd5b81356020614b7982614b38565b604051614b868282614b0c565b83815260059390931b8501820192828101915086841115614ba657600080fd5b8286015b84811015614bc15780358352918301918301614baa565b509695505050505050565b60006001600160401b03821115614be557614be5614af6565b50601f01601f191660200190565b600082601f830112614c0457600080fd5b8135614c0f81614bcc565b604051614c1c8282614b0c565b828152856020848701011115614c3157600080fd5b82602086016020830137600092810160200192909252509392505050565b600080600080600060a08688031215614c6757600080fd5b8535614c7281614817565b94506020860135614c8281614817565b935060408601356001600160401b0380821115614c9e57600080fd5b614caa89838a01614b5b565b94506060880135915080821115614cc057600080fd5b614ccc89838a01614b5b565b93506080880135915080821115614ce257600080fd5b50614cef88828901614bf3565b9150509295509295909350565b60008060208385031215614d0f57600080fd5b82356001600160401b03811115614d2557600080fd5b614d3185828601614972565b90969095509350505050565b600080600060408486031215614d5257600080fd5b8335614d5d81614817565b925060208401356001600160401b038111156149e557600080fd5b600081518084526020808501945080840160005b838110156149545781516001600160a01b031687529582019590820190600101614d8c565b602081526000611aaf6020830184614d78565b60008060008060408587031215614dda57600080fd5b84356001600160401b0380821115614df157600080fd5b614dfd888389016149fe565b90965094506020870135915080821115614e1657600080fd5b50614e23878288016149fe565b95989497509550505050565b600080600060608486031215614e4457600080fd5b8335614e4f81614817565b925060208401356001600160401b0380821115614e6b57600080fd5b614e7787838801614b5b565b93506040860135915080821115614e8d57600080fd5b50614e9a86828701614b5b565b9150509250925092565b80151581146107e057600080fd5b60008060008060608587031215614ec857600080fd5b8435614ed381614817565b935060208501356001600160401b03811115614eee57600080fd5b614efa87828801614972565b9094509250506040850135614f0e81614ea4565b939692955090935050565b60008060408385031215614f2c57600080fd5b82356001600160401b0380821115614f4357600080fd5b614f4f86838701614bf3565b93506020850135915080821115614f6557600080fd5b50614f7285828601614bf3565b9150509250929050565b60008060408385031215614f8f57600080fd5b82356001600160401b0380821115614fa657600080fd5b818501915085601f830112614fba57600080fd5b81356020614fc782614b38565b604051614fd48282614b0c565b83815260059390931b8501820192828101915089841115614ff457600080fd5b948201945b8386101561501b57853561500c81614817565b82529482019490820190614ff9565b9650508601359250508082111561503157600080fd5b50614f7285828601614b5b565b60008060006040848603121561505357600080fd5b83356001600160401b038082111561506a57600080fd5b61507687838801614b5b565b9450602086013591508082111561508c57600080fd5b506149f1868287016149fe565b600080600080600080606087890312156150b257600080fd5b86356001600160401b03808211156150c957600080fd5b6150d58a838b016149fe565b909850965060208901359150808211156150ee57600080fd5b6150fa8a838b016149fe565b9096509450604089013591508082111561511357600080fd5b5061512089828a016149fe565b979a9699509497509295939492505050565b60008060006040848603121561514757600080fd5b83356001600160401b0381111561515d57600080fd5b61516986828701614972565b909450925050602084013561517d81614ea4565b809150509250925092565b6000806040838503121561519b57600080fd5b82356151a681614817565b915060208301356151b681614ea4565b809150509250929050565b6000602082840312156151d357600080fd5b8135611aaf81614ea4565b6000806000806000606086880312156151f657600080fd5b853561520181614817565b945060208601356001600160401b0380821115614a7857600080fd5b6040815260006152306040830185614d78565b82810360208401526152428185614924565b95945050505050565b6000806040838503121561525e57600080fd5b823561526981614817565b915060208301356151b681614817565b600080600080600060a0868803121561529157600080fd5b853561529c81614817565b945060208601356152ac81614817565b9350604086013592506060860135915060808601356001600160401b038111156152d557600080fd5b614cef88828901614bf3565b60208082526024908201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616040820152633236b4b760e11b606082015260800190565b600181811c9082168061533957607f821691505b602082108103611e6357634e487b7160e01b600052602260045260246000fd5b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016153e6576153e66153be565b5060010190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600d908201526c125b9d985b1a59081a5b9c1d5d609a1b604082015260600190565b601f8211156108d257600081815260208120601f850160051c810160208610156154725750805b601f850160051c820191505b818110156122cc5782815560010161547e565b600019600383901b1c191660019190911b1790565b81516001600160401b038111156154bf576154bf614af6565b6154d3816154cd8454615325565b8461544b565b602080601f83116001811461550257600084156154f05750858301515b6154fa8582615491565b8655506122cc565b600085815260208120601f198616915b8281101561553157888601518255948401946001909101908401615512565b508582101561554f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808335601e1984360301811261557657600080fd5b8301803591506001600160401b0382111561559057600080fd5b60200191503681900382131561097757600080fd5b6020808252600d908201526c24b73b30b634b2103a37b5b2b760991b604082015260600190565b60006155d783614b38565b6040516155e48282614b0c565b84815260208082019250600586901b85013681111561560257600080fd5b855b8181101561563d5780356001600160401b038111156156235760008081fd5b61562f36828a01614bf3565b865250938201938201615604565b50919695505050505050565b602080825260159082015274115e1d195b9cda5bdb88189b1858dadb1a5cdd1959605a1b604082015260600190565b6000815461568581615325565b6001828116801561569d57600181146156b2576156e1565b60ff19841687528215158302870194506156e1565b8560005260208060002060005b858110156156d85781548a8201529084019082016156bf565b50505082870194505b5050505092915050565b60006139426156fa8386615678565b84615678565b60006020828403121561571257600080fd5b81516001600160401b0381111561572857600080fd5b8201601f8101841361573957600080fd5b805161574481614bcc565b6040516157518282614b0c565b82815286602084860101111561576657600080fd5b6157778360208301602087016148a8565b9695505050505050565b600061578d8285615678565b835161579d8183602088016148a8565b01949350505050565b6001600160401b038311156157bd576157bd614af6565b6157d1836157cb8354615325565b8361544b565b6000601f8411600181146157ff57600085156157ed5750838201355b6157f78682615491565b845550610924565b600083815260209020601f19861690835b828110156158305786850135825560209485019460019092019101615810565b508682101561584d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040808252810184905260008560608301825b878110156158a257823561588581614817565b6001600160a01b0316825260209283019290910190600101615872565b5083810360208501528481526001600160fb1b038511156158c257600080fd5b8460051b915081866020830137016020019695505050505050565b8082028115828204841417610768576107686153be565b634e487b7160e01b600052601260045260246000fd5b600082615919576159196158f4565b500490565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b80820180821115610768576107686153be565b6040815260006152306040830185614924565b81810381811115610768576107686153be565b6020808252601c908201527f4d69736d61746368656420746f6b656e206f726967696e61746f727300000000604082015260600190565b6001600160a01b0384168152606060208201819052600090615a8990830185614924565b82810360408401526157778185614924565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082601f830112615af757600080fd5b81516020615b0482614b38565b604051615b118282614b0c565b83815260059390931b8501820192828101915086841115615b3157600080fd5b8286015b84811015614bc15780518352918301918301615b35565b60008060408385031215615b5f57600080fd5b82516001600160401b0380821115615b7657600080fd5b818501915085601f830112615b8a57600080fd5b81516020615b9782614b38565b604051615ba48282614b0c565b83815260059390931b8501820192828101915089841115615bc457600080fd5b948201945b83861015615beb578551615bdc81614817565b82529482019490820190615bc9565b91880151919650909350505080821115615c0457600080fd5b50614f7285828601615ae6565b600082615c2057615c206158f4565b500690565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0386811682528516602082015260a060408201819052600090615c6790830186614924565b8281036060840152615c798186614924565b90508281036080840152615c8d81856148cc565b98975050505050505050565b600060208284031215615cab57600080fd5b8151611aaf81614858565b600060033d1115615ccf5760046000803e5060005160e01c5b90565b600060443d1015615ce05790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615d0f57505050505090565b8285019150815181811115615d275750505050505090565b843d8701016020828501011115615d415750505050505090565b615d5060208286010187614b0c565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0385168152608060208201819052600090615e4e90830186614d78565b8281036040840152615e608186614924565b905082810360608401526143728185614924565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090614372908301846148cc565b6001600160a01b03868116825285811660208301528416604082015260a060608201819052600090615ee290830185614924565b8281036080840152615c8d8185614924565b600060208284031215615f0657600080fd5b8151611aaf81614ea4565b6020808252601a908201527f457874656e73696f6e20617070726f76616c206661696c757265000000000000604082015260600190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b60608201526080019056fe4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a264697066735822122087e894976939a6cd108252b9737d2bcdaa1b4acdc23217ecf3aa9911aa8feb8864736f6c63430008110033
Deployed Bytecode Sourcemap
343:14800:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2593:227:4;;;;;;:::i;:::-;;:::i;:::-;;;616:25:28;;;604:2;589:18;2593:227:4;;;;;;;;804:340:18;;;;;;:::i;:::-;;:::i;:::-;;;1203:14:28;;1196:22;1178:41;;1166:2;1151:18;804:340:18;1038:187:28;2224:126:18;;;;;;:::i;:::-;;:::i;:::-;;658:18:20;;;:::i;:::-;;;;;;;:::i;13396:125:18:-;;;;;;:::i;:::-;;:::i;12967:138::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4194:136::-;;;;;;:::i;:::-;;:::i;11702:204::-;;;;;;:::i;:::-;;:::i;13648:115:19:-;13736:20;;-1:-1:-1;;;;;13736:20:19;13648:115;;;-1:-1:-1;;;;;5380:32:28;;;5362:51;;5350:2;5335:18;13648:115:19;5216:203:28;10638:136:18;;;;;;:::i;:::-;;:::i;2025:137:0:-;;;;;;:::i;:::-;;:::i;13175:166:18:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1757:205:0:-;;;;;;:::i;:::-;;:::i;4473:427:4:-;;;;;;:::i;:::-;;:::i;3812:118:18:-;;;;;;:::i;:::-;;:::i;1432:205::-;;;;;;:::i;:::-;;:::i;1156:261:0:-;;;:::i;:::-;;;;;;;:::i;11436:199:18:-;;;;;;:::i;:::-;;:::i;10840:529::-;;;;;;:::i;:::-;;:::i;2429:157::-;;;;;;:::i;:::-;;:::i;1709:239::-;;;;;;:::i;:::-;;:::i;545:192::-;;;;;;:::i;:::-;;:::i;2977:508:4:-;;;;;;:::i;:::-;;:::i;15011:130:18:-;;;;;;:::i;:::-;;:::i;3399:343::-;;;;;;:::i;:::-;;:::i;2923:158::-;;;;;;:::i;:::-;;:::i;5327:520::-;;;;;;:::i;:::-;;:::i;1485:205:0:-;;;;;;:::i;:::-;;:::i;2071:101:2:-;;;:::i;2665:177:18:-;;;;;;:::i;:::-;;:::i;4253:316:19:-;;;:::i;5925:264:18:-;;;;;;:::i;:::-;;:::i;1441:85:2:-;;;:::i;682:20:20:-;;;:::i;4002:126:18:-;;;;;;:::i;:::-;;:::i;3553:153:4:-;;;;;;:::i;:::-;;:::i;4396:311:18:-;;;;;;:::i;:::-;;:::i;5162:163:19:-;;;;;;:::i;:::-;;:::i;11982:226:18:-;;;;;;:::i;:::-;;:::i;12741:162::-;;;;;;:::i;:::-;;:::i;12275:169::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;13602:132::-;;;;;;:::i;:::-;13680:7;13706:21;;;:12;:21;;;;;;;13602:132;2023:128;;;;;;:::i;:::-;;:::i;6272:441::-;;;;;;:::i;:::-;;:::i;3156:168::-;;;;;;:::i;:::-;;:::i;3773:166:4:-;;;;;;:::i;:::-;;:::i;4780:160:18:-;;;;;;:::i;:::-;;:::i;4006:395:4:-;;;;;;:::i;:::-;;:::i;2321:198:2:-;;;;;;:::i;:::-;;:::i;5013:236:18:-;;;;;;:::i;:::-;;:::i;562:35:20:-;;596:1;562:35;;2593:227:4;2679:7;-1:-1:-1;;;;;2706:21:4;;2698:76;;;;-1:-1:-1;;;2698:76:4;;22084:2:28;2698:76:4;;;22066:21:28;22123:2;22103:18;;;22096:30;22162:34;22142:18;;;22135:62;-1:-1:-1;;;22213:18:28;;;22206:40;22263:19;;2698:76:4;;;;;;;;;-1:-1:-1;2791:13:4;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;2791:22:4;;;;;;;;;;2593:227;;;;;:::o;804:340:18:-;954:4;977:49;1014:11;977:36;:49::i;:::-;:102;;;;1030:49;1067:11;1030:36;:49::i;:::-;977:160;;;;1083:54;1125:11;1083:41;:54::i;2224:126::-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;2313:30:18::1;2333:9;2313:19;:30::i;:::-;2224:126:::0;:::o;658:18:20:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13396:125:18:-;13464:13;13496:18;13506:7;13496:9;:18::i;12967:138::-;13043:13;13075:23;13090:7;13075:14;:23::i;4194:136::-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;4296:27:18::1;4309:7;4318:4;;4296:12;:27::i;:::-;4194:136:::0;;;:::o;11702:204::-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;11853:46:18::1;11867:7;11876:9;;11887:11;;11853:13;:46::i;:::-;11702:204:::0;;;;;:::o;10638:136::-;10717:7;10743:24;10759:7;10743:15;:24::i;2025:137:0:-;2087:4;2122:5;-1:-1:-1;;;;;2111:16:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2111:16:0;;:43;;;-1:-1:-1;2131:23:0;:7;2148:5;2131:16;:23::i;13175:166:18:-;13268:7;13277;13303:31;13319:7;13328:5;13303:15;:31::i;:::-;13296:38;;;;13175:166;;;;;;:::o;1757:205:0:-;1334:13:2;:11;:13::i;:::-;1835:23:0::1;:7;1852:5:::0;1835:16:::1;:23::i;:::-;1831:125;;;1879:31;::::0;1899:10:::1;::::0;-1:-1:-1;;;;;1879:31:0;::::1;::::0;::::1;::::0;;;::::1;1924:21;:7;1939:5:::0;1924:14:::1;:21::i;:::-;;1757:205:::0;:::o;4473:427:4:-;-1:-1:-1;;;;;4698:20:4;;929:10:9;4698:20:4;;:60;;-1:-1:-1;4722:36:4;4739:4;929:10:9;3773:166:4;:::i;4722:36::-;4677:154;;;;-1:-1:-1;;;4677:154:4;;;;;;;:::i;:::-;4841:52;4864:4;4870:2;4874:3;4879:7;4888:4;4841:22;:52::i;3812:118:18:-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;3901:22:18::1;3918:4;;3901:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;3901:16:18::1;::::0;-1:-1:-1;;;3901:22:18:i:1;1432:205::-:0;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;1545:30:18::1;1565:9;1545:19;:30::i;:::-;1585:45;1604:9;1615:7;;1624:5;1585:18;:45::i;1156:261:0:-:0;1209:23;1267:16;:7;:14;:16::i;:::-;-1:-1:-1;;;;;1253:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1253:31:0;;1244:40;;1299:6;1294:94;1315:16;:7;:14;:16::i;:::-;1311:1;:20;1294:94;;;1364:13;:7;1375:1;1364:10;:13::i;:::-;1352:6;1359:1;1352:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1352:25:0;;;:9;;;;;;;;;;;:25;1333:3;;;;:::i;:::-;;;;1294:94;;;;1156:261;:::o;11436:199:18:-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;11570:58:18::1;11601:1;11605:9;;11616:11;;11570:22;:58::i;:::-;11436:199:::0;;;;:::o;10840:529::-;1744:1:12;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:12;;;;;;;:::i;:::-;1744:1;2455:7;:18;-1:-1:-1;;;;;10979:21:18;::::1;10990:10;10979:21;::::0;:62:::1;;;11004:37;11021:7;11030:10;11004:16;:37::i;:::-;10971:107;;;::::0;-1:-1:-1;;;10971:107:18;;24465:2:28;10971:107:18::1;::::0;::::1;24447:21:28::0;;;24484:18;;;24477:30;24543:34;24523:18;;;24516:62;24595:18;;10971:107:18::1;24263:356:28::0;10971:107:18::1;11115:7;:14;11096:8;:15;:33;11088:59;;;;-1:-1:-1::0;;;11088:59:18::1;;;;;;;:::i;:::-;11161:8;:15;11180:1;11161:20:::0;11157:159:::1;;11197:39;11203:7;11212:8;11221:1;11212:11;;;;;;;;:::i;:::-;;;;;;;11225:7;11233:1;11225:10;;;;;;;;:::i;:::-;;;;;;;11197:5;:39::i;:::-;11157:159;;;11267:38;11278:7;11287:8;11297:7;11267:10;:38::i;:::-;11325:37;11335:7;11344:8;11354:7;11325:9;:37::i;:::-;-1:-1:-1::0;;1701:1:12;2628:7;:22;-1:-1:-1;10840:529:18:o;2429:157::-;2513:18;:16;:18::i;:::-;2541:38;2567:4;;2573:5;2541:25;:38::i;1709:239::-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;1845:30:18::1;1865:9;1845:19;:30::i;:::-;1885:56;1904:9;1915:7;;1924:16;1885:18;:56::i;545:192::-:0;3111:19:3;3134:13;;;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:3;;3212:1;3197:12;;;;:16;3179:34;3178:108;;;-1:-1:-1;3258:4:3;1476:19:8;:23;;;3219:66:3;;-1:-1:-1;3268:12:3;;;;;:17;3219:66;3157:201;;;;-1:-1:-1;;;3157:201:3;;25168:2:28;3157:201:3;;;25150:21:28;25207:2;25187:18;;;25180:30;25246:34;25226:18;;;25219:62;-1:-1:-1;;;25297:18:28;;;25290:44;25351:19;;3157:201:3;24966:410:28;3157:201:3;3368:12;:16;;-1:-1:-1;;3368:16:3;3383:1;3368:16;;;3394:65;;;;3428:13;:20;;-1:-1:-1;;3428:20:3;;;;;3394:65;638:18:18::1;;;;;;;;;;;;::::0;:14:::1;:18::i;:::-;666:16;:14;:16::i;:::-;692:4;:12;699:5:::0;692:4;:12:::1;:::i;:::-;-1:-1:-1::0;714:6:18::1;:16;723:7:::0;714:6;:16:::1;:::i;:::-;;3483:14:3::0;3479:99;;;3529:5;3513:21;;-1:-1:-1;;3513:21:3;;;3553:14;;-1:-1:-1;27737:36:28;;3553:14:3;;27725:2:28;27710:18;3553:14:3;;;;;;;3101:483;545:192:18;;:::o;2977:508:4:-;3128:16;3187:3;:10;3168:8;:15;:29;3160:83;;;;-1:-1:-1;;;3160:83:4;;27986:2:28;3160:83:4;;;27968:21:28;28025:2;28005:18;;;27998:30;28064:34;28044:18;;;28037:62;-1:-1:-1;;;28115:18:28;;;28108:39;28164:19;;3160:83:4;27784:405:28;3160:83:4;3254:30;3301:8;:15;-1:-1:-1;;;;;3287:30:4;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3287:30:4;;3254:63;;3333:9;3328:120;3352:8;:15;3348:1;:19;3328:120;;;3407:30;3417:8;3426:1;3417:11;;;;;;;;:::i;:::-;;;;;;;3430:3;3434:1;3430:6;;;;;;;;:::i;:::-;;;;;;;3407:9;:30::i;:::-;3388:13;3402:1;3388:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;3369:3;;;:::i;:::-;;;3328:120;;;-1:-1:-1;3465:13:4;2977:508;-1:-1:-1;;;2977:508:4:o;15011:130:18:-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;15100:34:18::1;15124:9;15100:23;:34::i;3399:343::-:0;3508:18;:16;:18::i;:::-;3544:15;;:30;;3536:56;;;;-1:-1:-1;;;3536:56:18;;;;;;;:::i;:::-;3607:6;3602:134;3619:8;:15;3615:1;:19;3602:134;;;3651:43;3673:8;3682:1;3673:11;;;;;;;;:::i;:::-;;;;;;;3686:4;;3691:1;3686:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;3651:21;:43::i;:::-;3720:3;;3602:134;;2923:158;3011:18;:16;:18::i;:::-;3039:35;3067:6;;3039:27;:35::i;5327:520::-;1744:1:12;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:12;;;;;;;:::i;:::-;1744:1;2455:7;:18;987:10:0::1;976:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;976:21:0::1;;:53;;;-1:-1:-1::0;1001:28:0::1;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1::0;;;968:102:0::1;;;;;;;:::i;:::-;5499:6:18::2;5494:289;5507:19:::0;;::::2;5494:289;;;5543:15;5561:8;;5570:1;5561:11;;;;;;;:::i;:::-;;;;;;;5543:29;;5604:1;5594:7;:11;:37;;;;;5620:11;;5609:7;:22;;5594:37;5586:63;;;;-1:-1:-1::0;;;5586:63:18::2;;;;;;;:::i;:::-;5708:1;5671:25:::0;;;:16:::2;:25;::::0;;;;;-1:-1:-1;;;;;5671:25:18::2;:39:::0;5663:78:::2;;;::::0;-1:-1:-1;;;5663:78:18;;29265:2:28;5663:78:18::2;::::0;::::2;29247:21:28::0;29304:2;29284:18;;;29277:30;29343:28;29323:18;;;29316:56;29389:18;;5663:78:18::2;29063:350:28::0;5663:78:18::2;-1:-1:-1::0;5767:3:18::2;;5494:289;;;;5792:48;5814:1;5818:2;;5792:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;5792:48:18::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;;-1:-1:-1;5822:8:18;;-1:-1:-1;5822:8:18;;;;5792:48;::::2;::::0;5822:8;;5792:48;5822:8;5792:48;::::2;;::::0;::::2;::::0;;;;-1:-1:-1;;5792:48:18::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;;-1:-1:-1;5832:7:18;;-1:-1:-1;5832:7:18;;;;5792:48;::::2;::::0;5832:7;;5792:48;5832:7;5792:48;::::2;;::::0;::::2;::::0;;;;-1:-1:-1;5792:13:18::2;::::0;-1:-1:-1;;;5792:48:18:i:2;:::-;-1:-1:-1::0;;1701:1:12;2628:7;:22;-1:-1:-1;;;;5327:520:18:o;1485:205:0:-;1334:13:2;:11;:13::i;:::-;1565:23:0::1;:7;1582:5:::0;1565:16:::1;:23::i;:::-;1560:124;;1609:32;::::0;1630:10:::1;::::0;-1:-1:-1;;;;;1609:32:0;::::1;::::0;::::1;::::0;;;::::1;1655:18;:7;1667:5:::0;1655:11:::1;:18::i;2071:101:2:-:0;1334:13;:11;:13::i;:::-;2135:30:::1;2162:1;2135:18;:30::i;:::-;2071:101::o:0;2665:177:18:-;2765:18;:16;:18::i;:::-;2793:42;2819:4;;2825:9;2793:25;:42::i;4253:316:19:-;4310:27;4376:20;:11;:18;:20::i;:::-;-1:-1:-1;;;;;4362:35:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4362:35:19;;4349:48;;4412:6;4407:129;4424:20;:11;:18;:20::i;:::-;4420:1;:24;4407:129;;;4477:17;:11;4492:1;4477:14;:17::i;:::-;4461:10;4472:1;4461:13;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4461:33:19;;;:13;;;;;;;;;;;:33;4520:3;;4407:129;;5925:264:18;6071:25;1744:1:12;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:12;;;;;;;:::i;:::-;1744:1;2455:7;:18;6108::18::1;:16;:18::i;:::-;6143:39;6152:10;6164:2;;6143:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;6143:39:18::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;6168:7:18;;-1:-1:-1;6168:7:18;;;;6143:39;::::1;::::0;6168:7;;6143:39;6168:7;6143:39;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;6143:39:18::1;::::0;-1:-1:-1;6177:4:18;;-1:-1:-1;6177:4:18;;-1:-1:-1;6143:39:18::1;:::i;:::-;:8;:39::i;:::-;1701:1:12::0;2628:7;:22;6136:46:18;5925:264;-1:-1:-1;;;;;;;5925:264:18:o;1441:85:2:-;1513:6;;-1:-1:-1;;;;;1513:6:2;;1441:85::o;682:20:20:-;;;;;;;:::i;4002:126:18:-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;4095:26:18::1;4114:6;;4095:18;:26::i;3553:153:4:-:0;3647:52;929:10:9;3680:8:4;3690;3647:18;:52::i;4396:311:18:-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;4518:15:18;;:30;::::1;4510:56;;;;-1:-1:-1::0;;;4510:56:18::1;;;;;;;:::i;:::-;4581:6;4576:125;4593:8;:15;4589:1;:19;4576:125;;;4625:34;4638:8;4647:1;4638:11;;;;;;;;:::i;:::-;;;;;;;4651:4;;4656:1;4651:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4625:12;:34::i;:::-;4685:3;;4576:125;;5162:163:19::0;5241:18;:16;:18::i;:::-;5269:49;5298:10;5310:7;5269:28;:49::i;11982:226:18:-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;12144:57:18::1;12167:9;12178;;12189:11;;12144:22;:57::i;12741:162::-:0;12824:24;12867:29;12888:7;12867:20;:29::i;12275:169::-;12354:24;12380:16;12415:22;12429:7;12415:13;:22::i;:::-;12408:29;;;;12275:169;;;:::o;2023:128::-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;2113:31:18::1;2134:9;2113:20;:31::i;6272:441::-:0;1744:1:12;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:12;;;;;;;:::i;:::-;1744:1;2455:7;:18;6430::18::1;:16;:18::i;:::-;6463:6;6458:191;6471:19:::0;;::::1;6458:191;;;6556:10;6515:16;:29;6532:8:::0;;6541:1;6532:11;;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;6515:29:::0;;-1:-1:-1;6515:29:18;::::1;::::0;;;;;;-1:-1:-1;6515:29:18;;-1:-1:-1;;;;;6515:29:18::1;:52;6507:100;;;::::0;-1:-1:-1;;;6507:100:18;;30568:2:28;6507:100:18::1;::::0;::::1;30550:21:28::0;30607:2;30587:18;;;30580:30;30646:34;30626:18;;;30619:62;-1:-1:-1;;;30697:18:28;;;30690:33;30740:19;;6507:100:18::1;30366:399:28::0;6507:100:18::1;6633:3;;6458:191;;;;6658:48;6672:10;6684:2;;6658:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;6658:48:18::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;6688:8:18;;-1:-1:-1;6688:8:18;;;;6658:48;::::1;::::0;6688:8;;6658:48;6688:8;6658:48;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;6658:48:18::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;6698:7:18;;-1:-1:-1;6698:7:18;;;;6658:48;::::1;::::0;6698:7;;6658:48;6698:7;6658:48;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;6658:13:18::1;::::0;-1:-1:-1;;;6658:48:18:i:1;3156:168::-:0;3253:18;:16;:18::i;:::-;3281:36;3303:7;3312:4;;3281:21;:36::i;3773:166:4:-;-1:-1:-1;;;;;3895:27:4;;;3872:4;3895:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3773:166::o;4780:160:18:-;987:10:0;976:7;:5;:7::i;:::-;-1:-1:-1;;;;;976:21:0;;:53;;;-1:-1:-1;1001:28:0;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1;;;968:102:0;;;;;;;:::i;:::-;4890:43:18::1;4910:9;4921:11;4890:19;:43::i;4006:395:4:-:0;-1:-1:-1;;;;;4206:20:4;;929:10:9;4206:20:4;;:60;;-1:-1:-1;4230:36:4;4247:4;929:10:9;3773:166:4;:::i;4230:36::-;4185:154;;;;-1:-1:-1;;;4185:154:4;;;;;;;:::i;:::-;4349:45;4367:4;4373:2;4377;4381:6;4389:4;4349:17;:45::i;2321:198:2:-;1334:13;:11;:13::i;:::-;-1:-1:-1;;;;;2409:22:2;::::1;2401:73;;;::::0;-1:-1:-1;;;2401:73:2;;30972:2:28;2401:73:2::1;::::0;::::1;30954:21:28::0;31011:2;30991:18;;;30984:30;31050:34;31030:18;;;31023:62;-1:-1:-1;;;31101:18:28;;;31094:36;31147:19;;2401:73:2::1;30770:402:28::0;2401:73:2::1;2484:28;2503:8;2484:18;:28::i;5013:236:18:-:0;5168:16;1744:1:12;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:12;;;;;;;:::i;:::-;1744:1;2455:7;:18;987:10:0::1;976:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;976:21:0::1;;:53;;;-1:-1:-1::0;1001:28:0::1;:7;1018:10;1001:16;:28::i;:::-;968:102;;;;-1:-1:-1::0;;;968:102:0::1;;;;;;;:::i;:::-;5203:39:18::2;5220:1;5224:2;;5203:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;5203:39:18::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;;-1:-1:-1;5228:7:18;;-1:-1:-1;5228:7:18;;;;5203:39;::::2;::::0;5228:7;;5203:39;5228:7;5203:39;::::2;;::::0;::::2;::::0;;;;-1:-1:-1;5203:39:18::2;::::0;-1:-1:-1;5237:4:18;;-1:-1:-1;5237:4:18;;-1:-1:-1;5203:39:18::2;:::i;770:229:20:-:0;877:4;-1:-1:-1;;;;;;900:52:20;;-1:-1:-1;;;900:52:20;;:92;;;956:36;980:11;956:23;:36::i;1600:349:4:-;1724:4;-1:-1:-1;;;;;;1759:52:4;;-1:-1:-1;;;1759:52:4;;:131;;-1:-1:-1;;;;;;;1827:63:4;;-1:-1:-1;;;1827:63:4;1759:131;:183;;;;1906:36;1930:11;1906:23;:36::i;610:230:0:-;712:4;-1:-1:-1;;;;;;735:46:0;;-1:-1:-1;;;735:46:0;;:98;;;797:36;821:11;797:23;:36::i;8583:165:17:-;-1:-1:-1;;;;;8716:23:17;;8663:4;4250:19;;;:12;;;:19;;;;;;:24;;8686:55;8679:62;8583:165;-1:-1:-1;;;8583:165:17:o;5818:501:19:-;-1:-1:-1;;;;;5892:23:19;;;;;;:53;;-1:-1:-1;;;;;;5919:26:19;;5940:4;5919:26;;5892:53;5884:91;;;;-1:-1:-1;;;5884:91:19;;31379:2:28;5884:91:19;;;31361:21:28;31418:2;31398:18;;;31391:30;-1:-1:-1;;;31437:18:28;;;31430:55;31502:18;;5884:91:19;31177:349:28;5884:91:19;5988:31;:11;6009:9;5988:20;:31::i;:::-;5984:151;;;6039:44;;6072:10;;-1:-1:-1;;;;;6039:44:19;;;;;;;;6096:29;:11;6115:9;6096:18;:29::i;:::-;;5984:151;6148:42;:22;6180:9;6148:31;:42::i;:::-;6143:170;;6210:43;;6242:10;;-1:-1:-1;;;;;6210:43:19;;;;;;;;6266:37;:22;6293:9;6266:26;:37::i;7805:1016::-;7864:13;7907:1;7897:7;:11;:37;;;;;7923:11;;7912:7;:22;;7897:37;7889:63;;;;-1:-1:-1;;;7889:63:19;;;;;;;:::i;:::-;7963:17;7983:25;;;:16;:25;;;;;;-1:-1:-1;;;;;7983:25:19;8027:42;:22;7983:25;8027:31;:42::i;:::-;8026:43;8018:77;;;;-1:-1:-1;;;8018:77:19;;;;;;;:::i;:::-;8116:19;;;;:10;:19;;;;;8110:33;;;;;:::i;:::-;:38;;-1:-1:-1;8106:279:19;;-1:-1:-1;;;;;8174:30:19;;;;;;:19;:30;;;;;8168:44;;;;;:::i;:::-;:49;;-1:-1:-1;8164:171:19;;-1:-1:-1;;;;;8268:30:19;;;;;;:19;:30;;;;;;;;8299:19;;;:10;:19;;;;;;8251:68;;;;8268:30;8251:68;;:::i;:::-;;;;;;;;;;;;;8237:83;;;7805:1016;;;:::o;8164:171::-;8355:19;;;;:10;:19;;;;;8348:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7805:1016;;;:::o;8106:279::-;8399:87;8431:9;-1:-1:-1;;;8399:31:19;:87::i;:::-;8395:194;;;8509:69;;-1:-1:-1;;;8509:69:19;;-1:-1:-1;;;;;8509:45:19;;;;;:69;;8563:4;;8570:7;;8509:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8509:69:19;;;;;;;;;;;;:::i;8395:194::-;-1:-1:-1;;;;;8604:37:19;;;;;;:26;:37;;;;;;;;8599:216;;-1:-1:-1;;;;;8688:28:19;;;;;;:17;:28;;;;;8718:18;:7;:16;:18::i;:::-;8671:66;;;;;;;;;:::i;8599:216::-;-1:-1:-1;;;;;8776:28:19;;;;;;:17;:28;;;;;8769:35;;;;;:::i;8599:216::-;7879:942;7805:1016;;;:::o;10959:135::-;11023:20;11065:22;11079:7;11065:13;:22::i;7521:227::-;7618:1;7608:7;:11;:37;;;;;7634:11;;7623:7;:22;;7608:37;:80;;;;-1:-1:-1;7686:1:19;7649:25;;;:16;:25;;;;;;-1:-1:-1;;;;;7649:25:19;:39;7608:80;7600:106;;;;-1:-1:-1;;;7600:106:19;;;;;;;:::i;:::-;7716:19;;;;:10;:19;;;;;:25;7738:3;;7716:19;:25;:::i;11586:348::-;11714:39;11730:9;;11741:11;;11714:15;:39::i;:::-;11770:22;;;;:13;:22;;;;;11763:29;;;:::i;:::-;11802:61;11816:9;;11827:11;;11840:13;:22;11854:7;11840:22;;;;;;;;;;;11802:13;:61::i;:::-;11895:7;11878:49;11904:9;;11915:11;;11878:49;;;;;;;;;:::i;:::-;;;;;;;;11586:348;;;;;:::o;8870:321::-;8935:17;8976:25;;;:16;:25;;;;;;-1:-1:-1;;;;;8976:25:19;;9012:58;;;;-1:-1:-1;;;9012:58:19;;36485:2:28;9012:58:19;;;36467:21:28;36524:2;36504:18;;;36497:30;-1:-1:-1;;;36543:18:28;;;36536:52;36605:18;;9012:58:19;36283:346:28;9012:58:19;9089:42;:22;9121:9;9089:31;:42::i;:::-;9088:43;9080:77;;;;-1:-1:-1;;;9080:77:19;;;;;;;:::i;:::-;8870:321;;;:::o;11100:431::-;11180:16;11198:14;11224:34;11260:20;11284:22;11298:7;11284:13;:22::i;:::-;11223:83;;;;11344:1;11324:9;:16;:21;;11316:62;;;;-1:-1:-1;;;11316:62:19;;36836:2:28;11316:62:19;;;36818:21:28;36875:2;36855:18;;;36848:30;36914;36894:18;;;36887:58;36962:18;;11316:62:19;36634:352:28;11316:62:19;11401:9;:16;11421:1;11401:21;11397:77;;11454:4;11461:1;11438:25;;;;;;;;11397:77;11491:9;11501:1;11491:12;;;;;;;;:::i;:::-;;;;;;;11518:5;11512;11505:3;11509:1;11505:6;;;;;;;;:::i;:::-;;;;;;;:12;;;;:::i;:::-;:18;;;;:::i;:::-;11483:41;;;;;;11100:431;;;;;:::o;1599:130:2:-;929:10:9;1662:7:2;:5;:7::i;:::-;-1:-1:-1;;;;;1662:23:2;;1654:68;;;;-1:-1:-1;;;1654:68:2;;37623:2:28;1654:68:2;;;37605:21:28;;;37642:18;;;37635:30;37701:34;37681:18;;;37674:62;37753:18;;1654:68:2;37421:356:28;8346:156:17;8419:4;8442:53;8450:3;-1:-1:-1;;;;;8470:23:17;;8442:7;:53::i;6643:1115:4:-;6863:7;:14;6849:3;:10;:28;6841:81;;;;-1:-1:-1;;;6841:81:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;6940:16:4;;6932:66;;;;-1:-1:-1;;;6932:66:4;;;;;;;:::i;:::-;929:10:9;7051:60:4;929:10:9;7082:4:4;7088:2;7092:3;7097:7;7106:4;7051:20;:60::i;:::-;7127:9;7122:411;7146:3;:10;7142:1;:14;7122:411;;;7177:10;7190:3;7194:1;7190:6;;;;;;;;:::i;:::-;;;;;;;7177:19;;7210:14;7227:7;7235:1;7227:10;;;;;;;;:::i;:::-;;;;;;;;;;;;7252:19;7274:13;;;:9;:13;;;;;;-1:-1:-1;;;;;7274:19:4;;;;;;;;;;;;7227:10;;-1:-1:-1;7315:21:4;;;;7307:76;;;;-1:-1:-1;;;7307:76:4;;;;;;;:::i;:::-;7425:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;7425:19:4;;;;;;;;;;7447:20;;;7425:42;;7495:17;;;;;;;:27;;7447:20;;7425:13;7495:27;;7447:20;;7495:27;:::i;:::-;;;;;;;;7163:370;;;7158:3;;;;:::i;:::-;;;7122:411;;;;7578:2;-1:-1:-1;;;;;7548:47:4;7572:4;-1:-1:-1;;;;;7548:47:4;7562:8;-1:-1:-1;;;;;7548:47:4;-1:-1:-1;;;;;;;;;;;7582:3:4;7587:7;7548:47;;;;;;;:::i;:::-;;;;;;;;7676:75;7712:8;7722:4;7728:2;7732:3;7737:7;7746:4;7676:35;:75::i;:::-;6831:927;6643:1115;;;;;:::o;7134:106:19:-;7198:29;;;:17;:29;;;:35;7230:3;7198:29;:35;:::i;4026:156::-;4107:42;:22;4139:9;4107:31;:42::i;:::-;4106:43;4098:77;;;;-1:-1:-1;;;4098:77:19;;;;;;;:::i;4625:455::-;-1:-1:-1;;;;;4747:26:19;;4768:4;4747:26;;;;:52;;-1:-1:-1;;;;;;4777:20:19;;1476:19:8;:23;;4777:22:19;4739:72;;;;-1:-1:-1;;;4739:72:19;;39810:2:28;4739:72:19;;;39792:21:28;39849:1;39829:18;;;39822:29;-1:-1:-1;;;39867:18:28;;;39860:37;39914:18;;4739:72:19;39608:330:28;4739:72:19;4826:42;;4857:10;;-1:-1:-1;;;;;4826:42:19;;;;;;;;-1:-1:-1;;;;;4878:28:19;;;;;;:17;:28;;;;;:38;4909:7;;4878:28;:38;:::i;:::-;-1:-1:-1;;;;;;4926:37:19;;;;;;:26;:37;;;;;:56;;-1:-1:-1;;4926:56:19;;;;;;;4992:26;:11;4926:37;4992:15;:26::i;:::-;;5028:45;5057:9;5068:4;5028:28;:45::i;8829:115:17:-;8892:7;8918:19;8926:3;4444:18;;4362:107;9286:156;9360:7;9410:22;9414:3;9426:5;9410:3;:22::i;12008:519:19:-;12148:39;12164:9;;12175:11;;12148:15;:39::i;:::-;-1:-1:-1;;;;;12204:28:19;;;;;;:17;:28;;;;;12197:35;;;:::i;:::-;12242:67;12256:9;;12267:11;;12280:17;:28;12298:9;-1:-1:-1;;;;;12280:28:19;-1:-1:-1;;;;;12280:28:19;;;;;;;;;;;;12242:13;:67::i;:::-;-1:-1:-1;;;;;12323:23:19;;12319:202;;12367:47;12391:9;;12402:11;;12367:47;;;;;;;;;:::i;:::-;;;;;;;;12319:202;;;12476:9;-1:-1:-1;;;;;12450:60:19;;12487:9;;12498:11;;12450:60;;;;;;;;;:::i;14411:171:18:-;14507:32;14519:7;14528:2;14532:6;14507:11;:32::i;:::-;14549:16;;;;:12;:16;;;;;:26;;14569:6;;14549:16;:26;;14569:6;;14549:26;:::i;:::-;;;;-1:-1:-1;;;;;14411:171:18:o;14642:296::-;14763:39;14780:7;14789:3;14794:7;14763:16;:39::i;:::-;14817:6;14812:120;14829:3;:10;14825:1;:14;14812:120;;;14880:7;14888:1;14880:10;;;;;;;;:::i;:::-;;;;;;;14856:12;:20;14869:3;14873:1;14869:6;;;;;;;;:::i;:::-;;;;;;;14856:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;;14916:3:18;;14812:120;;2711:731:20;2851:1;2833:8;:15;:19;2825:45;;;;-1:-1:-1;;;2825:45:20;;;;;;;:::i;:::-;2880:17;2900:16;:29;2917:8;2926:1;2917:11;;;;;;;;:::i;:::-;;;;;;;2900:29;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2900:29:20;2880:49;;2944:6;2939:174;2956:8;:15;2952:1;:19;2939:174;;;3029:9;-1:-1:-1;;;;;2996:42:20;:16;:29;3013:8;3022:1;3013:11;;;;;;;;:::i;:::-;;;;;;;;;;;;2996:29;;;;;;;;;;-1:-1:-1;2996:29:20;;-1:-1:-1;;;;;2996:29:20;:42;2988:83;;;;-1:-1:-1;;;2988:83:20;;;;;;;:::i;:::-;3097:3;;2939:174;;;-1:-1:-1;;;;;;3181:23:20;;;3177:259;;3223:94;3255:9;-1:-1:-1;;;3223:31:20;:94::i;:::-;3219:207;;;3336:76;;-1:-1:-1;;;3336:76:20;;-1:-1:-1;;;;;3336:50:20;;;;;:76;;3387:5;;3394:8;;3404:7;;3336:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2815:627;2711:731;;;:::o;3821:132:19:-;3881:32;:11;3902:10;3881:20;:32::i;:::-;3873:73;;;;-1:-1:-1;;;3873:73:19;;41202:2:28;3873:73:19;;;41184:21:28;41241:2;41221:18;;;41214:30;41280;41260:18;;;41253:58;41328:18;;3873:73:19;41000:352:28;6389:193:19;6498:10;6480:29;;;;:17;:29;;;;;:35;6512:3;;6480:29;:35;:::i;:::-;-1:-1:-1;6552:10:19;6525:38;;;;:26;:38;;;;;:50;;-1:-1:-1;;6525:50:19;;;;;;;;;;-1:-1:-1;;6389:193:19:o;1300:117:4:-;4910:13:3;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:3;;;;;;;:::i;:::-;1380:30:4::1;1405:4;1380:24;:30::i;1003:95:2:-:0;4910:13:3;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:3;;;;;;;:::i;:::-;1065:26:2::1;:24;:26::i;1527:158:20:-:0;1598:20;:32;;-1:-1:-1;;;;;;1598:32:20;-1:-1:-1;;;;;1598:32:20;;;;;;;;1645:33;;5362:51:28;;;1645:33:20;;5350:2:28;5335:18;1645:33:20;;;;;;;1527:158;:::o;6857:195:19:-;6953:25;;;;:16;:25;;;;;;-1:-1:-1;;;;;6953:25:19;6982:10;6953:39;6945:65;;;;-1:-1:-1;;;6945:65:19;;;;;;;:::i;6654:127::-;6754:10;6734:31;;;;:19;:31;;;;;:40;6768:6;;6734:31;:40;:::i;8948:1614:18:-;-1:-1:-1;;;;;9087:23:18;;;9083:98;;9126:44;9148:2;9152:8;9162:7;9126:21;:44::i;:::-;9195:2;:9;9208:1;9195:14;:38;;;;;9213:8;:15;9232:1;9213:20;9195:38;:61;;;;;9237:7;:14;9255:1;9237:19;9195:61;9191:1365;;;9300:51;9306:2;9309:1;9306:5;;;;;;;;:::i;:::-;;;;;;;9313:8;9322:1;9313:11;;;;;;;;:::i;:::-;;;;;;;9326:7;9334:1;9326:10;;;;;;;;:::i;:::-;;;;;;;9348:1;-1:-1:-1;;;;;9338:12:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9338:12:18;;9300:5;:51::i;:::-;9191:1365;;;9384:2;:9;9397:1;9384:14;:51;;;;;9421:7;:14;9402:8;:15;:33;9384:51;9380:1176;;;9494:50;9505:2;9508:1;9505:5;;;;;;;;:::i;:::-;;;;;;;9512:8;9522:7;9541:1;-1:-1:-1;;;;;9531:12:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9531:12:18;;9494:10;:50::i;9380:1176::-;9565:8;:15;9584:1;9565:20;:43;;;;;9589:7;:14;9607:1;9589:19;9565:43;9561:995;;;9702:6;9697:148;9714:2;:9;9710:1;:13;9697:148;;;9744:51;9750:2;9753:1;9750:5;;;;;;;;:::i;:::-;;;;;;;9757:8;9766:1;9757:11;;;;;;;;:::i;:::-;;;;;;;9770:7;9778:1;9770:10;;;;;;;;:::i;9744:51::-;9825:3;;9697:148;;;;9561:995;;;9865:8;:15;9884:1;9865:20;:51;;;;;9902:7;:14;9889:2;:9;:27;9865:51;9861:695;;;10021:6;10016:148;10033:2;:9;10029:1;:13;10016:148;;;10063:51;10069:2;10072:1;10069:5;;;;;;;;:::i;:::-;;;;;;;10076:8;10085:1;10076:11;;;;;;;;:::i;:::-;;;;;;;10089:7;10097:1;10089:10;;;;;;;;:::i;10063:51::-;10144:3;;10016:148;;9861:695;10197:8;:15;10184:2;:9;:28;:59;;;;;10229:7;:14;10216:2;:9;:27;10184:59;10180:376;;;10349:6;10344:148;10361:2;:9;10357:1;:13;10344:148;;;10391:51;10397:2;10400:1;10397:5;;;;;;;;:::i;:::-;;;;;;;10404:8;10413:1;10404:11;;;;;;;;:::i;10391:51::-;10472:3;;10344:148;;10180:376;10522:23;;-1:-1:-1;;;10522:23:18;;;;;;;:::i;8028:150:17:-;8098:4;8121:50;8126:3;-1:-1:-1;;;;;8146:23:17;;8121:4;:50::i;2673:187:2:-;2765:6;;;-1:-1:-1;;;;;2781:17:2;;;-1:-1:-1;;;;;;2781:17:2;;;;;;;2813:40;;2765:6;;;2781:17;2765:6;;2813:40;;2746:16;;2813:40;2736:124;2673:187;:::o;6763:2130:18:-;6886:25;6939:1;6927:2;:9;:13;6923:477;;;7041:16;;;7055:1;7041:16;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7041:16:18;7030:27;;7094:1;7079:4;:11;:16;;:72;;;;;7100:7;:14;7118:1;7100:19;:50;;;;7136:7;:14;7123:2;:9;:27;7100:50;7071:98;;;;-1:-1:-1;;;7071:98:18;;;;;;;:::i;:::-;6923:477;;;7285:7;:14;-1:-1:-1;;;;;7271:29:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7271:29:18;;7260:40;;7322:4;:11;7337:1;7322:16;:49;;;;7360:4;:11;7342:7;:14;:29;7322:49;7314:75;;;;-1:-1:-1;;;7314:75:18;;;;;;;:::i;:::-;7442:6;7437:255;7454:8;:15;7450:1;:19;7437:255;;;7488:11;;7486:13;;;;;:::i;:::-;;;;-1:-1:-1;7527:11:18;;7513;;:8;;7522:1;;7513:11;;;;;;:::i;:::-;;;;;;;;;;;:25;;;;7626:11;;7609:29;;;;:16;:29;;;;;;:41;;-1:-1:-1;;;;;;7609:41:18;-1:-1:-1;;;;;7609:41:18;;;;;-1:-1:-1;7676:3:18;7437:255;;;-1:-1:-1;;;;;;7706:23:18;;;7702:98;;7745:44;7767:2;7771:8;7781:7;7745:21;:44::i;:::-;7814:2;:9;7827:1;7814:14;:38;;;;;7832:8;:15;7851:1;7832:20;7814:38;7810:861;;;7893:51;7899:2;7902:1;7899:5;;;;;;;;:::i;:::-;;;;;;;7906:8;7915:1;7906:11;;;;;;;;:::i;:::-;;;;;;;7919:7;7927:1;7919:10;;;;;;;;:::i;7893:51::-;7810:861;;;7977:1;7965:2;:9;:13;7961:710;;;8059:7;:14;8077:1;8059:19;8055:525;;8157:6;8152:160;8169:2;:9;8165:1;:13;8152:160;;;8203:51;8209:2;8212:1;8209:5;;;;;;;;:::i;:::-;;;;;;;8216:8;8225:1;8216:11;;;;;;;;:::i;:::-;;;;;;;8229:7;8237:1;8229:10;;;;;;;;:::i;8203:51::-;8288:3;;8152:160;;;;7961:710;;8055:525;8411:6;8406:160;8423:2;:9;8419:1;:13;8406:160;;;8457:51;8463:2;8466:1;8463:5;;;;;;;;:::i;:::-;;;;;;;8470:8;8479:1;8470:11;;;;;;;;:::i;:::-;;;;;;;8483:7;8491:1;8483:10;;;;;;;;:::i;8457:51::-;8542:3;;8406:160;;7961:710;8610:50;8621:2;8624:1;8621:5;;;;;;;;:::i;:::-;;;;;;;8628:8;8638:7;8657:1;-1:-1:-1;;;;;8647:12:18;;;;;;;:::i;8610:50::-;8686:6;8681:206;8698:8;:15;8694:1;:19;8681:206;;;8738:4;:11;8734:1;:15;:44;;;;;8777:1;8759:4;8764:1;8759:7;;;;;;;;:::i;:::-;;;;;;;8753:21;:25;8734:44;8730:116;;;8824:4;8829:1;8824:7;;;;;;;;:::i;:::-;;;;;;;8798:10;:23;8809:8;8818:1;8809:11;;;;;;;;:::i;:::-;;;;;;;8798:23;;;;;;;;;;;:33;;;;;;:::i;:::-;;8730:116;8871:3;;8681:206;;;;6763:2130;;;;;;:::o;7324:118:19:-;7395:31;;;:19;:31;;;:40;7429:6;;7395:31;:40;:::i;13320:323:4:-;13470:8;-1:-1:-1;;;;;13461:17:4;:5;-1:-1:-1;;;;;13461:17:4;;13453:71;;;;-1:-1:-1;;;13453:71:4;;41971:2:28;13453:71:4;;;41953:21:28;42010:2;41990:18;;;41983:30;42049:34;42029:18;;;42022:62;-1:-1:-1;;;42100:18:28;;;42093:39;42149:19;;13453:71:4;41769:405:28;13453:71:4;-1:-1:-1;;;;;13534:25:4;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;13534:46:4;;;;;;;;;;13595:41;;1178::28;;;13595::4;;1151:18:28;13595:41:4;;;;;;;13320:323;;;:::o;1080:354:20:-;1183:101;1215:9;-1:-1:-1;;;;;;1183:31:20;:101::i;:::-;1179:249;;;-1:-1:-1;;;;;1300:37:20;;;;;;:26;:37;;;;;;;;;:47;;-1:-1:-1;;1300:47:20;;;;;;;;;;1366:51;;1178:41:28;;;1366:51:20;;1151:18:28;1366:51:20;;;;;;;1080:354;;:::o;10722:161:19:-;10792:34;10854:22;10868:7;10854:13;:22::i;:::-;-1:-1:-1;10838:38:19;10722:161;-1:-1:-1;;10722:161:19:o;9256:1393::-;9319:34;9355:20;9425:32;9460:13;:22;9474:7;9460:22;;;;;;;;;;;9425:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9425:57:19;;;;-1:-1:-1;;;9425:57:19;;;;;;;;;;;;;;;;;;;;;;;;;9496:9;:16;9516:1;9496:21;9492:643;;9581:17;9601:25;;;:16;:25;;;;;;-1:-1:-1;;;;;9601:25:19;9644:23;;9640:485;;9691:88;9723:9;-1:-1:-1;;;9691:31:19;:88::i;:::-;9687:366;;;9822:74;;-1:-1:-1;;;9822:74:19;;-1:-1:-1;;;;;9822:50:19;;;;;:74;;9881:4;;9888:7;;9822:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9822:74:19;;;;;;;;;;;;:::i;:::-;9989:16;;9803:93;;-1:-1:-1;9803:93:19;-1:-1:-1;9989:20:19;9985:49;;10011:23;;9256:1393;;;:::o;9985:49::-;-1:-1:-1;;;;;10082:28:19;;;;;;:17;:28;;;;;;;;10070:40;;;;;;;;;;;;;;;;;;;10082:28;;10070:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10070:40:19;;;;-1:-1:-1;;;10070:40:19;;;;;;;;;;;;;;;;;;;;;;;;;9640:485;9519:616;9492:643;10148:9;:16;10168:1;10148:21;10144:132;;10236:29;;;;:17;:29;;;;;10224:41;;10236:29;10224:41;;;;;;;;;;;;;;;;10236:29;;10224:41;;10236:29;10224:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10224:41:19;;;;-1:-1:-1;;;10224:41:19;;;;;;;;;;;;;;;;;;;;;;;;;10144:132;10298:16;;:20;10294:349;;10368:9;:16;-1:-1:-1;;;;;10346:39:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10346:39:19;;10334:51;;10419:9;:16;-1:-1:-1;;;;;10405:31:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10405:31:19;;10399:37;;10455:6;10450:183;10467:9;:16;10463:1;:20;10450:183;;;10519:9;10529:1;10519:12;;;;;;;;:::i;:::-;;;;;;;:21;;;10504:9;10514:1;10504:12;;;;;;;;:::i;:::-;;;;;;:36;-1:-1:-1;;;;;10504:36:19;;;-1:-1:-1;;;;;10504:36:19;;;;;10567:9;10577:1;10567:12;;;;;;;;:::i;:::-;;;;;;;:16;;;10558:25;;:3;10562:1;10558:6;;;;;;;;:::i;:::-;;;;;;;;;;:25;10613:3;;10450:183;;;;10294:349;9377:1272;9256:1393;;;:::o;5598:163::-;5671:44;;5704:10;;-1:-1:-1;;;;;5671:44:19;;;;;;;;5725:29;:11;5744:9;5725:18;:29::i;1757:527:20:-;1853:31;:11;1874:9;1853:20;:31::i;:::-;1845:61;;;;-1:-1:-1;;;1845:61:20;;44391:2:28;1845:61:20;;;44373:21:28;44430:2;44410:18;;;44403:30;-1:-1:-1;;;44449:18:28;;;44442:47;44506:18;;1845:61:20;44189:341:28;1845:61:20;-1:-1:-1;;;;;1924:25:20;;;;:123;;;1953:94;1985:11;-1:-1:-1;;;1953:31:20;:94::i;:::-;1916:151;;;;-1:-1:-1;;;1916:151:20;;44737:2:28;1916:151:20;;;44719:21:28;44776:2;44756:18;;;44749:30;-1:-1:-1;;;44795:18:28;;;44788:45;44850:18;;1916:151:20;44535:339:28;1916:151:20;-1:-1:-1;;;;;2081:32:20;;;;;;;:21;:32;;;;;;;;:47;;;;2077:201;;-1:-1:-1;;;;;2144:32:20;;;;;;;:21;:32;;;;;;:46;;-1:-1:-1;;;;;;2144:46:20;;;;;;;;;2209:58;2256:10;;2144:46;:32;2209:58;;;1757:527;;:::o;5350:947:4:-;-1:-1:-1;;;;;5531:16:4;;5523:66;;;;-1:-1:-1;;;5523:66:4;;;;;;;:::i;:::-;929:10:9;5600:16:4;5664:21;5682:2;5664:17;:21::i;:::-;5641:44;;5695:24;5722:25;5740:6;5722:17;:25::i;:::-;5695:52;;5758:60;5779:8;5789:4;5795:2;5799:3;5804:7;5813:4;5758:20;:60::i;:::-;5829:19;5851:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5851:19:4;;;;;;;;;;5888:21;;;;5880:76;;;;-1:-1:-1;;;5880:76:4;;;;;;;:::i;:::-;5990:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5990:19:4;;;;;;;;;;6012:20;;;5990:42;;6052:17;;;;;;;:27;;6012:20;;5990:13;6052:27;;6012:20;;6052:27;:::i;:::-;;;;-1:-1:-1;;6095:46:4;;;45053:25:28;;;45109:2;45094:18;;45087:34;;;-1:-1:-1;;;;;6095:46:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6095:46:4;45026:18:28;6095:46:4;;;;;;;6222:68;6253:8;6263:4;6269:2;6273;6277:6;6285:4;6222:30;:68::i;:::-;5513:784;;;;5350:947;;;;;:::o;3239:483:19:-;3341:4;-1:-1:-1;;;;;;3364:45:19;;-1:-1:-1;;;3364:45:19;;:80;;-1:-1:-1;;;;;;;3413:31:19;;-1:-1:-1;;;3413:31:19;3364:80;:120;;;;3448:36;3472:11;3448:23;:36::i;:::-;3364:186;;;-1:-1:-1;;;;;;;3500:50:19;;-1:-1:-1;;;3500:50:19;3364:186;:236;;;-1:-1:-1;;;;;;;3554:46:19;;-1:-1:-1;;;3554:46:19;3364:236;:301;;;-1:-1:-1;;;;;;;3616:49:19;;-1:-1:-1;;;3616:49:19;3364:301;:351;;;-1:-1:-1;;;;;;;3669:46:19;;-1:-1:-1;;;3669:46:19;3357:358;3239:483;-1:-1:-1;;3239:483:19:o;1060:166:10:-;-1:-1:-1;;;;;;1168:51:10;-1:-1:-1;;;1168:51:10;;1060:166::o;1333:274:15:-;1420:4;1527:23;1542:7;1527:14;:23::i;:::-;:73;;;;;1554:46;1579:7;1588:11;1554:24;:46::i;392:703:13:-;448:13;665:5;674:1;665:10;661:51;;-1:-1:-1;;691:10:13;;;;;;;;;;;;-1:-1:-1;;;691:10:13;;;;;392:703::o;661:51::-;736:5;721:12;775:75;782:9;;775:75;;807:8;;;;:::i;:::-;;-1:-1:-1;829:10:13;;-1:-1:-1;837:2:13;829:10;;:::i;:::-;;;775:75;;;859:19;891:6;-1:-1:-1;;;;;881:17:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:17:13;;859:39;;908:150;915:10;;908:150;;941:11;951:1;941:11;;:::i;:::-;;-1:-1:-1;1009:10:13;1017:2;1009:5;:10;:::i;:::-;996:24;;:2;:24;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;966:56:13;;;;;;;;-1:-1:-1;1036:11:13;1045:2;1036:11;;:::i;:::-;;;908:150;;;1081:6;392:703;-1:-1:-1;;;;392:703:13:o;12615:430:19:-;12741:38;;;12733:64;;;;-1:-1:-1;;;12733:64:19;;;;;;;:::i;:::-;12807:24;12846:6;12841:128;12854:22;;;12841:128;;;12913:11;;12925:1;12913:14;;;;;;;:::i;:::-;;;;;;;12893:34;;;;;:::i;:::-;;-1:-1:-1;12953:3:19;;12841:128;;;;13005:5;12986:16;:24;12978:60;;;;-1:-1:-1;;;12978:60:19;;45451:2:28;12978:60:19;;;45433:21:28;45490:2;45470:18;;;45463:30;-1:-1:-1;;;45509:18:28;;;45502:53;45572:18;;12978:60:19;45249:347:28;13107:468:19;13258:6;13253:316;13266:22;;;13253:316;;;13305:9;13337:176;;;;;;;;13408:9;;13418:1;13408:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13337:176:19;;;;;13458:11;;13470:1;13458:14;;;;;;;:::i;:::-;13337:176;13458:14;;;;;;;;;13337:176;;;;;-1:-1:-1;13305:222:19;;;;;;;;-1:-1:-1;13305:222:19;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13305:222:19;-1:-1:-1;;;;;;13305:222:19;;;-1:-1:-1;;;;;13305:222:19;;;;;;;;;;13553:3;13253:316;;2685:1388:17;2751:4;2888:19;;;:12;;;:19;;;;;;2922:15;;2918:1149;;3291:21;3315:14;3328:1;3315:10;:14;:::i;:::-;3363:18;;3291:38;;-1:-1:-1;3343:17:17;;3363:22;;3384:1;;3363:22;:::i;:::-;3343:42;;3417:13;3404:9;:26;3400:398;;3450:17;3470:3;:11;;3482:9;3470:22;;;;;;;;:::i;:::-;;;;;;;;;3450:42;;3621:9;3592:3;:11;;3604:13;3592:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;3704:23;;;:12;;;:23;;;;;:36;;;3400:398;3876:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3968:3;:12;;:19;3981:5;3968:19;;;;;;;;;;;3961:26;;;4009:4;4002:11;;;;;;;2918:1149;4051:5;4044:12;;;;;1150:210:18;1313:40;1330:4;1336:2;1340:3;1345:7;1313:16;:40::i;16698:814:4:-;-1:-1:-1;;;;;16930:13:4;;1476:19:8;:23;16926:580:4;;16965:90;;-1:-1:-1;;;16965:90:4;;-1:-1:-1;;;;;16965:54:4;;;;;:90;;17020:8;;17030:4;;17036:3;;17041:7;;17050:4;;16965:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16965:90:4;;;;;;;;-1:-1:-1;;16965:90:4;;;;;;;;;;;;:::i;:::-;;;16961:535;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;17372:6;17365:14;;-1:-1:-1;;;17365:14:4;;;;;;;;:::i;16961:535::-;;;17419:62;;-1:-1:-1;;;17419:62:4;;48141:2:28;17419:62:4;;;48123:21:28;48180:2;48160:18;;;48153:30;48219:34;48199:18;;;48192:62;-1:-1:-1;;;48270:18:28;;;48263:50;48330:19;;17419:62:4;47939:416:28;16961:535:4;-1:-1:-1;;;;;;17134:71:4;;-1:-1:-1;;;17134:71:4;17130:168;;17229:50;;-1:-1:-1;;;17229:50:4;;;;;;;:::i;17130:168::-;17056:256;16698:814;;;;;;:::o;4811:118:17:-;4878:7;4904:3;:11;;4916:5;4904:18;;;;;;;;:::i;:::-;;;;;;;;;4897:25;;4811:118;;;;:::o;11216:786:4:-;-1:-1:-1;;;;;11338:18:4;;11330:66;;;;-1:-1:-1;;;11330:66:4;;;;;;;:::i;:::-;929:10:9;11407:16:4;11471:21;11489:2;11471:17;:21::i;:::-;11448:44;;11502:24;11529:25;11547:6;11529:17;:25::i;:::-;11502:52;;11565:66;11586:8;11596:4;11610:1;11614:3;11619:7;11565:66;;;;;;;;;;;;:20;:66::i;:::-;11642:19;11664:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;11664:19:4;;;;;;;;;;11701:21;;;;11693:70;;;;-1:-1:-1;;;11693:70:4;;;;;;;:::i;:::-;11797:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;11797:19:4;;;;;;;;;;;;11819:20;;;11797:42;;11865:54;;45053:25:28;;;45094:18;;;45087:34;;;11797:19:4;;11865:54;;;;-1:-1:-1;;;;;;;;;;;11865:54:4;45026:18:28;11865:54:4;;;;;;;11930:65;;;;;;;;;11974:1;11930:65;;;6643:1115;12241:943;-1:-1:-1;;;;;12388:18:4;;12380:66;;;;-1:-1:-1;;;12380:66:4;;;;;;;:::i;:::-;12478:7;:14;12464:3;:10;:28;12456:81;;;;-1:-1:-1;;;12456:81:4;;;;;;;:::i;:::-;12548:16;929:10:9;12548:31:4;;12590:66;12611:8;12621:4;12635:1;12639:3;12644:7;12590:66;;;;;;;;;;;;:20;:66::i;:::-;12672:9;12667:364;12691:3;:10;12687:1;:14;12667:364;;;12722:10;12735:3;12739:1;12735:6;;;;;;;;:::i;:::-;;;;;;;12722:19;;12755:14;12772:7;12780:1;12772:10;;;;;;;;:::i;:::-;;;;;;;;;;;;12797:19;12819:13;;;:9;:13;;;;;;-1:-1:-1;;;;;12819:19:4;;;;;;;;;;;;12772:10;;-1:-1:-1;12860:21:4;;;;12852:70;;;;-1:-1:-1;;;12852:70:4;;;;;;;:::i;:::-;12964:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;12964:19:4;;;;;;;;;;12986:20;;12964:42;;12703:3;;;;:::i;:::-;;;;12667:364;;;;13084:1;-1:-1:-1;;;;;13046:55:4;13070:4;-1:-1:-1;;;;;13046:55:4;13060:8;-1:-1:-1;;;;;13046:55:4;-1:-1:-1;;;;;;;;;;;13088:3:4;13093:7;13046:55;;;;;;;:::i;:::-;;;;;;;;13112:65;;;;;;;;;13156:1;13112:65;;;6643:1115;1423:110;4910:13:3;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:3;;;;;;;:::i;:::-;1513:13:4::1;1521:4;1513:7;:13::i;1104:111:2:-:0;4910:13:3;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:3;;;;;;;:::i;:::-;1176:32:2::1;929:10:9::0;1176:18:2::1;:32::i;2344:320:20:-:0;2494:10;2517:1;2472:33;;;:21;:33;;;;;;-1:-1:-1;;;;;2472:33:20;:47;2468:190;;2588:10;2566:33;;;;:21;:33;;;;;;;;2535:112;;-1:-1:-1;;;2535:112:20;;-1:-1:-1;;;;;2566:33:20;;;;2535:77;;:112;;2588:10;2625:2;;2629:8;;2639:7;;2535:112;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13789:196:18;13904:38;13916:7;13925:2;13929:6;13937:4;13904:11;:38::i;:::-;13952:16;;;;:12;:16;;;;;:26;;13972:6;;13952:16;:26;;13972:6;;13952:26;:::i;:::-;;;;-1:-1:-1;;;;;;13789:196:18:o;14045:311::-;14180:40;14197:2;14201:3;14206:7;14215:4;14180:16;:40::i;:::-;14235:6;14230:120;14247:3;:10;14243:1;:14;14230:120;;;14298:7;14306:1;14298:10;;;;;;;;:::i;:::-;;;;;;;14274:12;:20;14287:3;14291:1;14287:6;;;;;;;;:::i;:::-;;;;;;;14274:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;;14334:3:18;;14230:120;;2113:404:17;2176:4;4250:19;;;:12;;;:19;;;;;;2192:319;;-1:-1:-1;2234:23:17;;;;;;;;:11;:23;;;;;;;;;;;;;2414:18;;2392:19;;;:12;;;:19;;;;;;:40;;;;2446:11;;2192:319;-1:-1:-1;2495:5:17;2488:12;;17518:193:4;17637:16;;;17651:1;17637:16;;;;;;;;;17584;;17612:22;;17637:16;;;;;;;;;;;;-1:-1:-1;17637:16:4;17612:41;;17674:7;17663:5;17669:1;17663:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;17699:5;17518:193;-1:-1:-1;;17518:193:4:o;15945:747::-;-1:-1:-1;;;;;16152:13:4;;1476:19:8;:23;16148:538:4;;16187:83;;-1:-1:-1;;;16187:83:4;;-1:-1:-1;;;;;16187:49:4;;;;;:83;;16237:8;;16247:4;;16253:2;;16257:6;;16265:4;;16187:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16187:83:4;;;;;;;;-1:-1:-1;;16187:83:4;;;;;;;;;;;;:::i;:::-;;;16183:493;;;;:::i;:::-;-1:-1:-1;;;;;;16319:66:4;;-1:-1:-1;;;16319:66:4;16315:163;;16409:50;;-1:-1:-1;;;16409:50:4;;;;;;;:::i;704:411:15:-;768:4;975:60;1000:7;-1:-1:-1;;;975:24:15;:60::i;:::-;:133;;;;-1:-1:-1;1052:56:15;1077:7;-1:-1:-1;;;;;;1052:24:15;:56::i;:::-;1051:57;956:152;704:411;-1:-1:-1;;704:411:15:o;4223:638::-;4385:71;;;-1:-1:-1;;;;;;51079:33:28;;4385:71:15;;;;51061:52:28;;;;4385:71:15;;;;;;;;;;51034:18:28;;;;4385:71:15;;;;;;;;;-1:-1:-1;;;;;4385:71:15;-1:-1:-1;;;4385:71:15;;;4664:20;;4316:4;;4385:71;4316:4;;;;;;4385:71;4316:4;;4664:20;4629:7;4622:5;4611:86;4600:97;;4724:16;4710:30;;4774:4;4768:11;4753:26;;4806:7;:29;;;;;4831:4;4817:10;:18;;4806:29;:48;;;;;4853:1;4839:11;:15;4806:48;4799:55;4223:638;-1:-1:-1;;;;;;;4223:638:15:o;3490:869:20:-;3640:1;3622:8;:15;:19;3614:45;;;;-1:-1:-1;;;3614:45:20;;;;;;;:::i;:::-;3669:17;3689:16;:29;3706:8;3715:1;3706:11;;;;;;;;:::i;:::-;;;;;;;3689:29;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3689:29:20;3669:49;;3733:6;3728:174;3745:8;:15;3741:1;:19;3728:174;;;3818:9;-1:-1:-1;;;;;3785:42:20;:16;:29;3802:8;3811:1;3802:11;;;;;;;;:::i;:::-;;;;;;;;;;;;3785:29;;;;;;;;;;-1:-1:-1;3785:29:20;;-1:-1:-1;;;;;3785:29:20;:42;3777:83;;;;-1:-1:-1;;;3777:83:20;;;;;;;:::i;:::-;3886:3;;3728:174;;;-1:-1:-1;;;;;;3915:37:20;;;;;;:26;:37;;;;;;;;3911:442;;;3976:107;;-1:-1:-1;;;3976:107:20;;-1:-1:-1;;;;;3976:66:20;;;;;:107;;4043:10;;4055:4;;4061:2;;4065:8;;4075:7;;3976:107;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3968:146;;;;-1:-1:-1;;;3968:146:20;;;;;;;:::i;:::-;3911:442;;;4135:20;;-1:-1:-1;;;;;4135:20:20;:34;4131:222;;4233:20;;4193:118;;-1:-1:-1;;;4193:118:20;;-1:-1:-1;;;;;4233:20:20;;;;4193:77;;:118;;4271:10;;4283:4;;4289:2;;4293:8;;4303:7;;4193:118;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4185:157;;;;-1:-1:-1;;;4185:157:20;;;;;;;:::i;8581:86:4:-;8647:4;:13;8654:6;8647:4;:13;:::i;9040:709::-;-1:-1:-1;;;;;9187:16:4;;9179:62;;;;-1:-1:-1;;;9179:62:4;;;;;;;:::i;:::-;929:10:9;9252:16:4;9316:21;9334:2;9316:17;:21::i;:::-;9293:44;;9347:24;9374:25;9392:6;9374:17;:25::i;:::-;9347:52;;9410:66;9431:8;9449:1;9453:2;9457:3;9462:7;9471:4;9410:20;:66::i;:::-;9487:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;9487:17:4;;;;;;;;;:27;;9508:6;;9487:13;:27;;9508:6;;9487:27;:::i;:::-;;;;-1:-1:-1;;9529:52:4;;;45053:25:28;;;45109:2;45094:18;;45087:34;;;-1:-1:-1;;;;;9529:52:4;;;;9562:1;;9529:52;;;;-1:-1:-1;;;;;;;;;;;9529:52:4;45026:18:28;9529:52:4;;;;;;;9668:74;9699:8;9717:1;9721:2;9725;9729:6;9737:4;9668:30;:74::i;10139:791::-;-1:-1:-1;;;;;10311:16:4;;10303:62;;;;-1:-1:-1;;;10303:62:4;;;;;;;:::i;:::-;10397:7;:14;10383:3;:10;:28;10375:81;;;;-1:-1:-1;;;10375:81:4;;;;;;;:::i;:::-;929:10:9;10509:66:4;929:10:9;10467:16:4;10552:2;10556:3;10561:7;10570:4;10509:20;:66::i;:::-;10591:9;10586:101;10610:3;:10;10606:1;:14;10586:101;;;10666:7;10674:1;10666:10;;;;;;;;:::i;:::-;;;;;;;10641:9;:17;10651:3;10655:1;10651:6;;;;;;;;:::i;:::-;;;;;;;10641:17;;;;;;;;;;;:21;10659:2;-1:-1:-1;;;;;10641:21:4;-1:-1:-1;;;;;10641:21:4;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;10622:3:4;;-1:-1:-1;10622:3:4;;;:::i;:::-;;;;10586:101;;;;10738:2;-1:-1:-1;;;;;10702:53:4;10734:1;-1:-1:-1;;;;;10702:53:4;10716:8;-1:-1:-1;;;;;10702:53:4;-1:-1:-1;;;;;;;;;;;10742:3:4;10747:7;10702:53;;;;;;;:::i;:::-;;;;;;;;10842:81;10878:8;10896:1;10900:2;10904:3;10909:7;10918:4;10842:35;:81::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:28;-1:-1:-1;;;;;89:31:28;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:28:o;652:131::-;-1:-1:-1;;;;;;726:32:28;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;1230:247::-;1289:6;1342:2;1330:9;1321:7;1317:23;1313:32;1310:52;;;1358:1;1355;1348:12;1310:52;1397:9;1384:23;1416:31;1441:5;1416:31;:::i;1482:250::-;1567:1;1577:113;1591:6;1588:1;1585:13;1577:113;;;1667:11;;;1661:18;1648:11;;;1641:39;1613:2;1606:10;1577:113;;;-1:-1:-1;;1724:1:28;1706:16;;1699:27;1482:250::o;1737:271::-;1779:3;1817:5;1811:12;1844:6;1839:3;1832:19;1860:76;1929:6;1922:4;1917:3;1913:14;1906:4;1899:5;1895:16;1860:76;:::i;:::-;1990:2;1969:15;-1:-1:-1;;1965:29:28;1956:39;;;;1997:4;1952:50;;1737:271;-1:-1:-1;;1737:271:28:o;2013:220::-;2162:2;2151:9;2144:21;2125:4;2182:45;2223:2;2212:9;2208:18;2200:6;2182:45;:::i;2238:180::-;2297:6;2350:2;2338:9;2329:7;2325:23;2321:32;2318:52;;;2366:1;2363;2356:12;2318:52;-1:-1:-1;2389:23:28;;2238:180;-1:-1:-1;2238:180:28:o;2423:435::-;2476:3;2514:5;2508:12;2541:6;2536:3;2529:19;2567:4;2596:2;2591:3;2587:12;2580:19;;2633:2;2626:5;2622:14;2654:1;2664:169;2678:6;2675:1;2672:13;2664:169;;;2739:13;;2727:26;;2773:12;;;;2808:15;;;;2700:1;2693:9;2664:169;;;-1:-1:-1;2849:3:28;;2423:435;-1:-1:-1;;;;;2423:435:28:o;2863:261::-;3042:2;3031:9;3024:21;3005:4;3062:56;3114:2;3103:9;3099:18;3091:6;3062:56;:::i;3129:348::-;3181:8;3191:6;3245:3;3238:4;3230:6;3226:17;3222:27;3212:55;;3263:1;3260;3253:12;3212:55;-1:-1:-1;3286:20:28;;-1:-1:-1;;;;;3318:30:28;;3315:50;;;3361:1;3358;3351:12;3315:50;3398:4;3390:6;3386:17;3374:29;;3450:3;3443:4;3434:6;3426;3422:19;3418:30;3415:39;3412:59;;;3467:1;3464;3457:12;3482:479;3562:6;3570;3578;3631:2;3619:9;3610:7;3606:23;3602:32;3599:52;;;3647:1;3644;3637:12;3599:52;3683:9;3670:23;3660:33;;3744:2;3733:9;3729:18;3716:32;-1:-1:-1;;;;;3763:6:28;3760:30;3757:50;;;3803:1;3800;3793:12;3757:50;3842:59;3893:7;3884:6;3873:9;3869:22;3842:59;:::i;:::-;3482:479;;3920:8;;-1:-1:-1;3816:85:28;;-1:-1:-1;;;;3482:479:28:o;3966:375::-;4037:8;4047:6;4101:3;4094:4;4086:6;4082:17;4078:27;4068:55;;4119:1;4116;4109:12;4068:55;-1:-1:-1;4142:20:28;;-1:-1:-1;;;;;4174:30:28;;4171:50;;;4217:1;4214;4207:12;4171:50;4254:4;4246:6;4242:17;4230:29;;4314:3;4307:4;4297:6;4294:1;4290:14;4282:6;4278:27;4274:38;4271:47;4268:67;;;4331:1;4328;4321:12;4346:865;4485:6;4493;4501;4509;4517;4570:2;4558:9;4549:7;4545:23;4541:32;4538:52;;;4586:1;4583;4576:12;4538:52;4622:9;4609:23;4599:33;;4683:2;4672:9;4668:18;4655:32;-1:-1:-1;;;;;4747:2:28;4739:6;4736:14;4733:34;;;4763:1;4760;4753:12;4733:34;4802:78;4872:7;4863:6;4852:9;4848:22;4802:78;:::i;:::-;4899:8;;-1:-1:-1;4776:104:28;-1:-1:-1;4987:2:28;4972:18;;4959:32;;-1:-1:-1;5003:16:28;;;5000:36;;;5032:1;5029;5022:12;5000:36;;5071:80;5143:7;5132:8;5121:9;5117:24;5071:80;:::i;:::-;4346:865;;;;-1:-1:-1;4346:865:28;;-1:-1:-1;5170:8:28;;5045:106;4346:865;-1:-1:-1;;;4346:865:28:o;5424:248::-;5492:6;5500;5553:2;5541:9;5532:7;5528:23;5524:32;5521:52;;;5569:1;5566;5559:12;5521:52;-1:-1:-1;;5592:23:28;;;5662:2;5647:18;;;5634:32;;-1:-1:-1;5424:248:28:o;5677:274::-;-1:-1:-1;;;;;5869:32:28;;;;5851:51;;5933:2;5918:18;;5911:34;5839:2;5824:18;;5677:274::o;5956:127::-;6017:10;6012:3;6008:20;6005:1;5998:31;6048:4;6045:1;6038:15;6072:4;6069:1;6062:15;6088:249;6198:2;6179:13;;-1:-1:-1;;6175:27:28;6163:40;;-1:-1:-1;;;;;6218:34:28;;6254:22;;;6215:62;6212:88;;;6280:18;;:::i;:::-;6316:2;6309:22;-1:-1:-1;;6088:249:28:o;6342:183::-;6402:4;-1:-1:-1;;;;;6427:6:28;6424:30;6421:56;;;6457:18;;:::i;:::-;-1:-1:-1;6502:1:28;6498:14;6514:4;6494:25;;6342:183::o;6530:724::-;6584:5;6637:3;6630:4;6622:6;6618:17;6614:27;6604:55;;6655:1;6652;6645:12;6604:55;6691:6;6678:20;6717:4;6740:43;6780:2;6740:43;:::i;:::-;6812:2;6806:9;6824:31;6852:2;6844:6;6824:31;:::i;:::-;6890:18;;;6982:1;6978:10;;;;6966:23;;6962:32;;;6924:15;;;;-1:-1:-1;7006:15:28;;;7003:35;;;7034:1;7031;7024:12;7003:35;7070:2;7062:6;7058:15;7082:142;7098:6;7093:3;7090:15;7082:142;;;7164:17;;7152:30;;7202:12;;;;7115;;7082:142;;;-1:-1:-1;7242:6:28;6530:724;-1:-1:-1;;;;;;6530:724:28:o;7259:186::-;7307:4;-1:-1:-1;;;;;7332:6:28;7329:30;7326:56;;;7362:18;;:::i;:::-;-1:-1:-1;7428:2:28;7407:15;-1:-1:-1;;7403:29:28;7434:4;7399:40;;7259:186::o;7450:508::-;7492:5;7545:3;7538:4;7530:6;7526:17;7522:27;7512:55;;7563:1;7560;7553:12;7512:55;7599:6;7586:20;7625:31;7653:2;7625:31;:::i;:::-;7685:2;7679:9;7697:31;7725:2;7717:6;7697:31;:::i;:::-;7752:2;7744:6;7737:18;7798:3;7791:4;7786:2;7778:6;7774:15;7770:26;7767:35;7764:55;;;7815:1;7812;7805:12;7764:55;7879:2;7872:4;7864:6;7860:17;7853:4;7845:6;7841:17;7828:54;7926:1;7902:15;;;7919:4;7898:26;7891:37;;;;-1:-1:-1;7906:6:28;7450:508;-1:-1:-1;;;7450:508:28:o;7963:1071::-;8117:6;8125;8133;8141;8149;8202:3;8190:9;8181:7;8177:23;8173:33;8170:53;;;8219:1;8216;8209:12;8170:53;8258:9;8245:23;8277:31;8302:5;8277:31;:::i;:::-;8327:5;-1:-1:-1;8384:2:28;8369:18;;8356:32;8397:33;8356:32;8397:33;:::i;:::-;8449:7;-1:-1:-1;8507:2:28;8492:18;;8479:32;-1:-1:-1;;;;;8560:14:28;;;8557:34;;;8587:1;8584;8577:12;8557:34;8610:61;8663:7;8654:6;8643:9;8639:22;8610:61;:::i;:::-;8600:71;;8724:2;8713:9;8709:18;8696:32;8680:48;;8753:2;8743:8;8740:16;8737:36;;;8769:1;8766;8759:12;8737:36;8792:63;8847:7;8836:8;8825:9;8821:24;8792:63;:::i;:::-;8782:73;;8908:3;8897:9;8893:19;8880:33;8864:49;;8938:2;8928:8;8925:16;8922:36;;;8954:1;8951;8944:12;8922:36;;8977:51;9020:7;9009:8;8998:9;8994:24;8977:51;:::i;:::-;8967:61;;;7963:1071;;;;;;;;:::o;9039:411::-;9110:6;9118;9171:2;9159:9;9150:7;9146:23;9142:32;9139:52;;;9187:1;9184;9177:12;9139:52;9227:9;9214:23;-1:-1:-1;;;;;9252:6:28;9249:30;9246:50;;;9292:1;9289;9282:12;9246:50;9331:59;9382:7;9373:6;9362:9;9358:22;9331:59;:::i;:::-;9409:8;;9305:85;;-1:-1:-1;9039:411:28;-1:-1:-1;;;;9039:411:28:o;9455:546::-;9535:6;9543;9551;9604:2;9592:9;9583:7;9579:23;9575:32;9572:52;;;9620:1;9617;9610:12;9572:52;9659:9;9646:23;9678:31;9703:5;9678:31;:::i;:::-;9728:5;-1:-1:-1;9784:2:28;9769:18;;9756:32;-1:-1:-1;;;;;9800:30:28;;9797:50;;;9843:1;9840;9833:12;10006:461;10059:3;10097:5;10091:12;10124:6;10119:3;10112:19;10150:4;10179:2;10174:3;10170:12;10163:19;;10216:2;10209:5;10205:14;10237:1;10247:195;10261:6;10258:1;10255:13;10247:195;;;10326:13;;-1:-1:-1;;;;;10322:39:28;10310:52;;10382:12;;;;10417:15;;;;10358:1;10276:9;10247:195;;10472:261;10651:2;10640:9;10633:21;10614:4;10671:56;10723:2;10712:9;10708:18;10700:6;10671:56;:::i;10738:797::-;10868:6;10876;10884;10892;10945:2;10933:9;10924:7;10920:23;10916:32;10913:52;;;10961:1;10958;10951:12;10913:52;11001:9;10988:23;-1:-1:-1;;;;;11071:2:28;11063:6;11060:14;11057:34;;;11087:1;11084;11077:12;11057:34;11126:78;11196:7;11187:6;11176:9;11172:22;11126:78;:::i;:::-;11223:8;;-1:-1:-1;11100:104:28;-1:-1:-1;11311:2:28;11296:18;;11283:32;;-1:-1:-1;11327:16:28;;;11324:36;;;11356:1;11353;11346:12;11324:36;;11395:80;11467:7;11456:8;11445:9;11441:24;11395:80;:::i;:::-;10738:797;;;;-1:-1:-1;11494:8:28;-1:-1:-1;;;;10738:797:28:o;11540:730::-;11667:6;11675;11683;11736:2;11724:9;11715:7;11711:23;11707:32;11704:52;;;11752:1;11749;11742:12;11704:52;11791:9;11778:23;11810:31;11835:5;11810:31;:::i;:::-;11860:5;-1:-1:-1;11916:2:28;11901:18;;11888:32;-1:-1:-1;;;;;11969:14:28;;;11966:34;;;11996:1;11993;11986:12;11966:34;12019:61;12072:7;12063:6;12052:9;12048:22;12019:61;:::i;:::-;12009:71;;12133:2;12122:9;12118:18;12105:32;12089:48;;12162:2;12152:8;12149:16;12146:36;;;12178:1;12175;12168:12;12146:36;;12201:63;12256:7;12245:8;12234:9;12230:24;12201:63;:::i;:::-;12191:73;;;11540:730;;;;;:::o;12275:118::-;12361:5;12354:13;12347:21;12340:5;12337:32;12327:60;;12383:1;12380;12373:12;12398:681;12484:6;12492;12500;12508;12561:2;12549:9;12540:7;12536:23;12532:32;12529:52;;;12577:1;12574;12567:12;12529:52;12616:9;12603:23;12635:31;12660:5;12635:31;:::i;:::-;12685:5;-1:-1:-1;12741:2:28;12726:18;;12713:32;-1:-1:-1;;;;;12757:30:28;;12754:50;;;12800:1;12797;12790:12;12754:50;12839:59;12890:7;12881:6;12870:9;12866:22;12839:59;:::i;:::-;12917:8;;-1:-1:-1;12813:85:28;-1:-1:-1;;13004:2:28;12989:18;;12976:32;13017:30;12976:32;13017:30;:::i;:::-;12398:681;;;;-1:-1:-1;12398:681:28;;-1:-1:-1;;12398:681:28:o;13084:541::-;13172:6;13180;13233:2;13221:9;13212:7;13208:23;13204:32;13201:52;;;13249:1;13246;13239:12;13201:52;13289:9;13276:23;-1:-1:-1;;;;;13359:2:28;13351:6;13348:14;13345:34;;;13375:1;13372;13365:12;13345:34;13398:49;13439:7;13430:6;13419:9;13415:22;13398:49;:::i;:::-;13388:59;;13500:2;13489:9;13485:18;13472:32;13456:48;;13529:2;13519:8;13516:16;13513:36;;;13545:1;13542;13535:12;13513:36;;13568:51;13611:7;13600:8;13589:9;13585:24;13568:51;:::i;:::-;13558:61;;;13084:541;;;;;:::o;13630:1277::-;13748:6;13756;13809:2;13797:9;13788:7;13784:23;13780:32;13777:52;;;13825:1;13822;13815:12;13777:52;13865:9;13852:23;-1:-1:-1;;;;;13935:2:28;13927:6;13924:14;13921:34;;;13951:1;13948;13941:12;13921:34;13989:6;13978:9;13974:22;13964:32;;14034:7;14027:4;14023:2;14019:13;14015:27;14005:55;;14056:1;14053;14046:12;14005:55;14092:2;14079:16;14114:4;14137:43;14177:2;14137:43;:::i;:::-;14209:2;14203:9;14221:31;14249:2;14241:6;14221:31;:::i;:::-;14287:18;;;14375:1;14371:10;;;;14363:19;;14359:28;;;14321:15;;;;-1:-1:-1;14399:19:28;;;14396:39;;;14431:1;14428;14421:12;14396:39;14455:11;;;;14475:217;14491:6;14486:3;14483:15;14475:217;;;14571:3;14558:17;14588:31;14613:5;14588:31;:::i;:::-;14632:18;;14508:12;;;;14670;;;;14475:217;;;14711:6;-1:-1:-1;;14755:18:28;;14742:32;;-1:-1:-1;;14786:16:28;;;14783:36;;;14815:1;14812;14805:12;14783:36;;14838:63;14893:7;14882:8;14871:9;14867:24;14838:63;:::i;14912:704::-;15044:6;15052;15060;15113:2;15101:9;15092:7;15088:23;15084:32;15081:52;;;15129:1;15126;15119:12;15081:52;15169:9;15156:23;-1:-1:-1;;;;;15239:2:28;15231:6;15228:14;15225:34;;;15255:1;15252;15245:12;15225:34;15278:61;15331:7;15322:6;15311:9;15307:22;15278:61;:::i;:::-;15268:71;;15392:2;15381:9;15377:18;15364:32;15348:48;;15421:2;15411:8;15408:16;15405:36;;;15437:1;15434;15427:12;15405:36;;15476:80;15548:7;15537:8;15526:9;15522:24;15476:80;:::i;15621:1112::-;15779:6;15787;15795;15803;15811;15819;15872:2;15860:9;15851:7;15847:23;15843:32;15840:52;;;15888:1;15885;15878:12;15840:52;15928:9;15915:23;-1:-1:-1;;;;;15998:2:28;15990:6;15987:14;15984:34;;;16014:1;16011;16004:12;15984:34;16053:78;16123:7;16114:6;16103:9;16099:22;16053:78;:::i;:::-;16150:8;;-1:-1:-1;16027:104:28;-1:-1:-1;16238:2:28;16223:18;;16210:32;;-1:-1:-1;16254:16:28;;;16251:36;;;16283:1;16280;16273:12;16251:36;16322:80;16394:7;16383:8;16372:9;16368:24;16322:80;:::i;:::-;16421:8;;-1:-1:-1;16296:106:28;-1:-1:-1;16509:2:28;16494:18;;16481:32;;-1:-1:-1;16525:16:28;;;16522:36;;;16554:1;16551;16544:12;16522:36;;16593:80;16665:7;16654:8;16643:9;16639:24;16593:80;:::i;:::-;15621:1112;;;;-1:-1:-1;15621:1112:28;;-1:-1:-1;15621:1112:28;;16692:8;;15621:1112;-1:-1:-1;;;15621:1112:28:o;16738:540::-;16815:6;16823;16831;16884:2;16872:9;16863:7;16859:23;16855:32;16852:52;;;16900:1;16897;16890:12;16852:52;16940:9;16927:23;-1:-1:-1;;;;;16965:6:28;16962:30;16959:50;;;17005:1;17002;16995:12;16959:50;17044:59;17095:7;17086:6;17075:9;17071:22;17044:59;:::i;:::-;17122:8;;-1:-1:-1;17018:85:28;-1:-1:-1;;17207:2:28;17192:18;;17179:32;17220:28;17179:32;17220:28;:::i;:::-;17267:5;17257:15;;;16738:540;;;;;:::o;18412:382::-;18477:6;18485;18538:2;18526:9;18517:7;18513:23;18509:32;18506:52;;;18554:1;18551;18544:12;18506:52;18593:9;18580:23;18612:31;18637:5;18612:31;:::i;:::-;18662:5;-1:-1:-1;18719:2:28;18704:18;;18691:32;18732:30;18691:32;18732:30;:::i;:::-;18781:7;18771:17;;;18412:382;;;;;:::o;18799:241::-;18855:6;18908:2;18896:9;18887:7;18883:23;18879:32;18876:52;;;18924:1;18921;18914:12;18876:52;18963:9;18950:23;18982:28;19004:5;18982:28;:::i;19045:932::-;19184:6;19192;19200;19208;19216;19269:2;19257:9;19248:7;19244:23;19240:32;19237:52;;;19285:1;19282;19275:12;19237:52;19324:9;19311:23;19343:31;19368:5;19343:31;:::i;:::-;19393:5;-1:-1:-1;19449:2:28;19434:18;;19421:32;-1:-1:-1;;;;;19502:14:28;;;19499:34;;;19529:1;19526;19519:12;20264:481;20537:2;20526:9;20519:21;20500:4;20563:56;20615:2;20604:9;20600:18;20592:6;20563:56;:::i;:::-;20667:9;20659:6;20655:22;20650:2;20639:9;20635:18;20628:50;20695:44;20732:6;20724;20695:44;:::i;:::-;20687:52;20264:481;-1:-1:-1;;;;;20264:481:28:o;20750:388::-;20818:6;20826;20879:2;20867:9;20858:7;20854:23;20850:32;20847:52;;;20895:1;20892;20885:12;20847:52;20934:9;20921:23;20953:31;20978:5;20953:31;:::i;:::-;21003:5;-1:-1:-1;21060:2:28;21045:18;;21032:32;21073:33;21032:32;21073:33;:::i;21143:734::-;21247:6;21255;21263;21271;21279;21332:3;21320:9;21311:7;21307:23;21303:33;21300:53;;;21349:1;21346;21339:12;21300:53;21388:9;21375:23;21407:31;21432:5;21407:31;:::i;:::-;21457:5;-1:-1:-1;21514:2:28;21499:18;;21486:32;21527:33;21486:32;21527:33;:::i;:::-;21579:7;-1:-1:-1;21633:2:28;21618:18;;21605:32;;-1:-1:-1;21684:2:28;21669:18;;21656:32;;-1:-1:-1;21739:3:28;21724:19;;21711:33;-1:-1:-1;;;;;21756:30:28;;21753:50;;;21799:1;21796;21789:12;21753:50;21822:49;21863:7;21854:6;21843:9;21839:22;21822:49;:::i;22293:400::-;22495:2;22477:21;;;22534:2;22514:18;;;22507:30;22573:34;22568:2;22553:18;;22546:62;-1:-1:-1;;;22639:2:28;22624:18;;22617:34;22683:3;22668:19;;22293:400::o;22698:380::-;22777:1;22773:12;;;;22820;;;22841:61;;22895:4;22887:6;22883:17;22873:27;;22841:61;22948:2;22940:6;22937:14;22917:18;22914:38;22911:161;;22994:10;22989:3;22985:20;22982:1;22975:31;23029:4;23026:1;23019:15;23057:4;23054:1;23047:15;23083:411;23285:2;23267:21;;;23324:2;23304:18;;;23297:30;23363:34;23358:2;23343:18;;23336:62;-1:-1:-1;;;23429:2:28;23414:18;;23407:45;23484:3;23469:19;;23083:411::o;23499:127::-;23560:10;23555:3;23551:20;23548:1;23541:31;23591:4;23588:1;23581:15;23615:4;23612:1;23605:15;23631:127;23692:10;23687:3;23683:20;23680:1;23673:31;23723:4;23720:1;23713:15;23747:4;23744:1;23737:15;23763:135;23802:3;23823:17;;;23820:43;;23843:18;;:::i;:::-;-1:-1:-1;23890:1:28;23879:13;;23763:135::o;23903:355::-;24105:2;24087:21;;;24144:2;24124:18;;;24117:30;24183:33;24178:2;24163:18;;24156:61;24249:2;24234:18;;23903:355::o;24624:337::-;24826:2;24808:21;;;24865:2;24845:18;;;24838:30;-1:-1:-1;;;24899:2:28;24884:18;;24877:43;24952:2;24937:18;;24624:337::o;25507:545::-;25609:2;25604:3;25601:11;25598:448;;;25645:1;25670:5;25666:2;25659:17;25715:4;25711:2;25701:19;25785:2;25773:10;25769:19;25766:1;25762:27;25756:4;25752:38;25821:4;25809:10;25806:20;25803:47;;;-1:-1:-1;25844:4:28;25803:47;25899:2;25894:3;25890:12;25887:1;25883:20;25877:4;25873:31;25863:41;;25954:82;25972:2;25965:5;25962:13;25954:82;;;26017:17;;;25998:1;25987:13;25954:82;;26057:166;-1:-1:-1;;26185:1:28;26181:11;;;26177:24;26173:29;26163:40;26209:1;26205:11;;;;26160:57;;26057:166::o;26228:1352::-;26354:3;26348:10;-1:-1:-1;;;;;26373:6:28;26370:30;26367:56;;;26403:18;;:::i;:::-;26432:97;26522:6;26482:38;26514:4;26508:11;26482:38;:::i;:::-;26476:4;26432:97;:::i;:::-;26584:4;;26648:2;26637:14;;26665:1;26660:663;;;;27367:1;27384:6;27381:89;;;-1:-1:-1;27436:19:28;;;27430:26;27381:89;27496:67;27556:6;27549:5;27496:67;:::i;:::-;27490:4;27483:81;;26630:944;;26660:663;25454:1;25447:14;;;25491:4;25478:18;;-1:-1:-1;;26696:20:28;;;26814:236;26828:7;26825:1;26822:14;26814:236;;;26917:19;;;26911:26;26896:42;;27009:27;;;;26977:1;26965:14;;;;26844:19;;26814:236;;;26818:3;27078:6;27069:7;27066:19;27063:201;;;27139:19;;;27133:26;-1:-1:-1;;27222:1:28;27218:14;;;27234:3;27214:24;27210:37;27206:42;27191:58;27176:74;;27063:201;-1:-1:-1;;;;;27310:1:28;27294:14;;;27290:22;27277:36;;-1:-1:-1;26228:1352:28:o;28194:522::-;28272:4;28278:6;28338:11;28325:25;28432:2;28428:7;28417:8;28401:14;28397:29;28393:43;28373:18;28369:68;28359:96;;28451:1;28448;28441:12;28359:96;28478:33;;28530:20;;;-1:-1:-1;;;;;;28562:30:28;;28559:50;;;28605:1;28602;28595:12;28559:50;28638:4;28626:17;;-1:-1:-1;28669:14:28;28665:27;;;28655:38;;28652:58;;;28706:1;28703;28696:12;28721:337;28923:2;28905:21;;;28962:2;28942:18;;;28935:30;-1:-1:-1;;;28996:2:28;28981:18;;28974:43;29049:2;29034:18;;28721:337::o;29418:943::-;29556:9;29590:47;29630:6;29590:47;:::i;:::-;29666:2;29660:9;29678:31;29706:2;29698:6;29678:31;:::i;:::-;29744:22;;;29785:4;29805:15;;;;-1:-1:-1;29858:1:28;29854:14;;;29843:26;;29892:14;29881:26;;29878:46;;;29920:1;29917;29910:12;29878:46;29944:5;29958:369;29974:6;29969:3;29966:15;29958:369;;;30060:3;30047:17;-1:-1:-1;;;;;30083:11:28;30080:35;30077:125;;;30156:1;30185:2;30181;30174:14;30077:125;30227:57;30269:14;30255:11;30248:5;30244:23;30227:57;:::i;:::-;30215:70;;-1:-1:-1;30305:12:28;;;;29991;;29958:369;;;-1:-1:-1;30349:6:28;;29418:943;-1:-1:-1;;;;;;29418:943:28:o;31531:345::-;31733:2;31715:21;;;31772:2;31752:18;;;31745:30;-1:-1:-1;;;31806:2:28;31791:18;;31784:51;31867:2;31852:18;;31531:345::o;31881:722::-;31931:3;31972:5;31966:12;32001:36;32027:9;32001:36;:::i;:::-;32056:1;32073:18;;;32100:133;;;;32247:1;32242:355;;;;32066:531;;32100:133;-1:-1:-1;;32133:24:28;;32121:37;;32206:14;;32199:22;32187:35;;32178:45;;;-1:-1:-1;32100:133:28;;32242:355;32273:5;32270:1;32263:16;32302:4;32347:2;32344:1;32334:16;32372:1;32386:165;32400:6;32397:1;32394:13;32386:165;;;32478:14;;32465:11;;;32458:35;32521:16;;;;32415:10;;32386:165;;;32390:3;;;32580:6;32575:3;32571:16;32564:23;;32066:531;;;;;31881:722;;;;:::o;32608:277::-;32781:3;32806:73;32840:38;32874:3;32866:6;32840:38;:::i;:::-;32832:6;32806:73;:::i;32890:703::-;32970:6;33023:2;33011:9;33002:7;32998:23;32994:32;32991:52;;;33039:1;33036;33029:12;32991:52;33072:9;33066:16;-1:-1:-1;;;;;33097:6:28;33094:30;33091:50;;;33137:1;33134;33127:12;33091:50;33160:22;;33213:4;33205:13;;33201:27;-1:-1:-1;33191:55:28;;33242:1;33239;33232:12;33191:55;33271:2;33265:9;33293:31;33321:2;33293:31;:::i;:::-;33353:2;33347:9;33365:31;33393:2;33385:6;33365:31;:::i;:::-;33420:2;33412:6;33405:18;33460:7;33455:2;33450;33446;33442:11;33438:20;33435:33;33432:53;;;33481:1;33478;33471:12;33432:53;33494:68;33559:2;33554;33546:6;33542:15;33537:2;33533;33529:11;33494:68;:::i;:::-;33581:6;32890:703;-1:-1:-1;;;;;;32890:703:28:o;33598:389::-;33774:3;33802:38;33836:3;33828:6;33802:38;:::i;:::-;33869:6;33863:13;33885:65;33943:6;33939:2;33932:4;33924:6;33920:17;33885:65;:::i;:::-;33966:15;;33598:389;-1:-1:-1;;;;33598:389:28:o;33992:1206::-;-1:-1:-1;;;;;34111:3:28;34108:27;34105:53;;;34138:18;;:::i;:::-;34167:94;34257:3;34217:38;34249:4;34243:11;34217:38;:::i;:::-;34211:4;34167:94;:::i;:::-;34287:1;34312:2;34307:3;34304:11;34329:1;34324:616;;;;34984:1;35001:3;34998:93;;;-1:-1:-1;35057:19:28;;;35044:33;34998:93;35117:64;35177:3;35170:5;35117:64;:::i;:::-;35111:4;35104:78;;34297:895;;34324:616;25454:1;25447:14;;;25491:4;25478:18;;-1:-1:-1;;34360:17:28;;;34461:9;34483:229;34497:7;34494:1;34491:14;34483:229;;;34586:19;;;34573:33;34558:49;;34693:4;34678:20;;;;34646:1;34634:14;;;;34513:12;34483:229;;;34487:3;34740;34731:7;34728:16;34725:159;;;34864:1;34860:6;34854:3;34848;34845:1;34841:11;34837:21;34833:34;34829:39;34816:9;34811:3;34807:19;34794:33;34790:79;34782:6;34775:95;34725:159;;;34927:1;34921:3;34918:1;34914:11;34910:19;34904:4;34897:33;34297:895;;33992:1206;;;:::o;35203:1075::-;35507:2;35519:21;;;35492:18;;35575:22;;;35459:4;35654:6;35628:2;35613:18;;35459:4;35688:304;35702:6;35699:1;35696:13;35688:304;;;35777:6;35764:20;35797:31;35822:5;35797:31;:::i;:::-;-1:-1:-1;;;;;35853:31:28;35841:44;;35908:4;35967:15;;;;35932:12;;;;35881:1;35717:9;35688:304;;;-1:-1:-1;36030:19:28;;;36023:4;36008:20;;36001:49;36059:19;;;-1:-1:-1;;;;;36090:31:28;;36087:51;;;36134:1;36131;36124:12;36087:51;36168:6;36165:1;36161:14;36147:28;;36221:6;36213;36206:4;36201:3;36197:14;36184:44;36249:16;36267:4;36245:27;;35203:1075;-1:-1:-1;;;;;;35203:1075:28:o;36991:168::-;37064:9;;;37095;;37112:15;;;37106:22;;37092:37;37082:71;;37133:18;;:::i;37164:127::-;37225:10;37220:3;37216:20;37213:1;37206:31;37256:4;37253:1;37246:15;37280:4;37277:1;37270:15;37296:120;37336:1;37362;37352:35;;37367:18;;:::i;:::-;-1:-1:-1;37401:9:28;;37296:120::o;37782:404::-;37984:2;37966:21;;;38023:2;38003:18;;;37996:30;38062:34;38057:2;38042:18;;38035:62;-1:-1:-1;;;38128:2:28;38113:18;;38106:38;38176:3;38161:19;;37782:404::o;38191:401::-;38393:2;38375:21;;;38432:2;38412:18;;;38405:30;38471:34;38466:2;38451:18;;38444:62;-1:-1:-1;;;38537:2:28;38522:18;;38515:35;38582:3;38567:19;;38191:401::o;38597:406::-;38799:2;38781:21;;;38838:2;38818:18;;;38811:30;38877:34;38872:2;38857:18;;38850:62;-1:-1:-1;;;38943:2:28;38928:18;;38921:40;38993:3;38978:19;;38597:406::o;39008:125::-;39073:9;;;39094:10;;;39091:36;;;39107:18;;:::i;39138:465::-;39395:2;39384:9;39377:21;39358:4;39421:56;39473:2;39462:9;39458:18;39450:6;39421:56;:::i;39943:128::-;40010:9;;;40031:11;;;40028:37;;;40045:18;;:::i;40076:352::-;40278:2;40260:21;;;40317:2;40297:18;;;40290:30;40356;40351:2;40336:18;;40329:58;40419:2;40404:18;;40076:352::o;40433:562::-;-1:-1:-1;;;;;40718:32:28;;40700:51;;40787:2;40782;40767:18;;40760:30;;;-1:-1:-1;;40813:56:28;;40850:18;;40842:6;40813:56;:::i;:::-;40917:9;40909:6;40905:22;40900:2;40889:9;40885:18;40878:50;40945:44;40982:6;40974;40945:44;:::i;41357:407::-;41559:2;41541:21;;;41598:2;41578:18;;;41571:30;41637:34;41632:2;41617:18;;41610:62;-1:-1:-1;;;41703:2:28;41688:18;;41681:41;41754:3;41739:19;;41357:407::o;42179:721::-;42244:5;42297:3;42290:4;42282:6;42278:17;42274:27;42264:55;;42315:1;42312;42305:12;42264:55;42344:6;42338:13;42370:4;42393:43;42433:2;42393:43;:::i;:::-;42465:2;42459:9;42477:31;42505:2;42497:6;42477:31;:::i;:::-;42543:18;;;42635:1;42631:10;;;;42619:23;;42615:32;;;42577:15;;;;-1:-1:-1;42659:15:28;;;42656:35;;;42687:1;42684;42677:12;42656:35;42723:2;42715:6;42711:15;42735:135;42751:6;42746:3;42743:15;42735:135;;;42817:10;;42805:23;;42848:12;;;;42768;;42735:135;;42905:1279;43042:6;43050;43103:2;43091:9;43082:7;43078:23;43074:32;43071:52;;;43119:1;43116;43109:12;43071:52;43152:9;43146:16;-1:-1:-1;;;;;43222:2:28;43214:6;43211:14;43208:34;;;43238:1;43235;43228:12;43208:34;43276:6;43265:9;43261:22;43251:32;;43321:7;43314:4;43310:2;43306:13;43302:27;43292:55;;43343:1;43340;43333:12;43292:55;43372:2;43366:9;43394:4;43417:43;43457:2;43417:43;:::i;:::-;43489:2;43483:9;43501:31;43529:2;43521:6;43501:31;:::i;:::-;43567:18;;;43655:1;43651:10;;;;43643:19;;43639:28;;;43601:15;;;;-1:-1:-1;43679:19:28;;;43676:39;;;43711:1;43708;43701:12;43676:39;43735:11;;;;43755:210;43771:6;43766:3;43763:15;43755:210;;;43844:3;43838:10;43861:31;43886:5;43861:31;:::i;:::-;43905:18;;43788:12;;;;43943;;;;43755:210;;;44021:18;;;44015:25;43984:6;;-1:-1:-1;44015:25:28;;-1:-1:-1;;;44052:16:28;;;44049:36;;;44081:1;44078;44071:12;44049:36;;44104:74;44170:7;44159:8;44148:9;44144:24;44104:74;:::i;45132:112::-;45164:1;45190;45180:35;;45195:18;;:::i;:::-;-1:-1:-1;45229:9:28;;45132:112::o;45861:127::-;45922:10;45917:3;45913:20;45910:1;45903:31;45953:4;45950:1;45943:15;45977:4;45974:1;45967:15;45993:827;-1:-1:-1;;;;;46390:15:28;;;46372:34;;46442:15;;46437:2;46422:18;;46415:43;46352:3;46489:2;46474:18;;46467:31;;;46315:4;;46521:57;;46558:19;;46550:6;46521:57;:::i;:::-;46626:9;46618:6;46614:22;46609:2;46598:9;46594:18;46587:50;46660:44;46697:6;46689;46660:44;:::i;:::-;46646:58;;46753:9;46745:6;46741:22;46735:3;46724:9;46720:19;46713:51;46781:33;46807:6;46799;46781:33;:::i;:::-;46773:41;45993:827;-1:-1:-1;;;;;;;;45993:827:28:o;46825:249::-;46894:6;46947:2;46935:9;46926:7;46922:23;46918:32;46915:52;;;46963:1;46960;46953:12;46915:52;46995:9;46989:16;47014:30;47038:5;47014:30;:::i;47079:179::-;47114:3;47156:1;47138:16;47135:23;47132:120;;;47202:1;47199;47196;47181:23;-1:-1:-1;47239:1:28;47233:8;47228:3;47224:18;47132:120;47079:179;:::o;47263:671::-;47302:3;47344:4;47326:16;47323:26;47320:39;;;47263:671;:::o;47320:39::-;47386:2;47380:9;-1:-1:-1;;47451:16:28;47447:25;;47444:1;47380:9;47423:50;47502:4;47496:11;47526:16;-1:-1:-1;;;;;47632:2:28;47625:4;47617:6;47613:17;47610:25;47605:2;47597:6;47594:14;47591:45;47588:58;;;47639:5;;;;;47263:671;:::o;47588:58::-;47676:6;47670:4;47666:17;47655:28;;47712:3;47706:10;47739:2;47731:6;47728:14;47725:27;;;47745:5;;;;;;47263:671;:::o;47725:27::-;47829:2;47810:16;47804:4;47800:27;47796:36;47789:4;47780:6;47775:3;47771:16;47767:27;47764:69;47761:82;;;47836:5;;;;;;47263:671;:::o;47761:82::-;47852:57;47903:4;47894:6;47886;47882:19;47878:30;47872:4;47852:57;:::i;:::-;-1:-1:-1;47925:3:28;;47263:671;-1:-1:-1;;;;;47263:671:28:o;48360:404::-;48562:2;48544:21;;;48601:2;48581:18;;;48574:30;48640:34;48635:2;48620:18;;48613:62;-1:-1:-1;;;48706:2:28;48691:18;;48684:38;48754:3;48739:19;;48360:404::o;48769:399::-;48971:2;48953:21;;;49010:2;48990:18;;;48983:30;49049:34;49044:2;49029:18;;49022:62;-1:-1:-1;;;49115:2:28;49100:18;;49093:33;49158:3;49143:19;;48769:399::o;49173:400::-;49375:2;49357:21;;;49414:2;49394:18;;;49387:30;49453:34;49448:2;49433:18;;49426:62;-1:-1:-1;;;49519:2:28;49504:18;;49497:34;49563:3;49548:19;;49173:400::o;49578:768::-;-1:-1:-1;;;;;49941:32:28;;49923:51;;50010:3;50005:2;49990:18;;49983:31;;;-1:-1:-1;;50037:57:28;;50074:19;;50066:6;50037:57;:::i;:::-;50142:9;50134:6;50130:22;50125:2;50114:9;50110:18;50103:50;50176:44;50213:6;50205;50176:44;:::i;:::-;50162:58;;50268:9;50260:6;50256:22;50251:2;50240:9;50236:18;50229:50;50296:44;50333:6;50325;50296:44;:::i;50351:561::-;-1:-1:-1;;;;;50648:15:28;;;50630:34;;50700:15;;50695:2;50680:18;;50673:43;50747:2;50732:18;;50725:34;;;50790:2;50775:18;;50768:34;;;50610:3;50833;50818:19;;50811:32;;;50573:4;;50860:46;;50886:19;;50878:6;50860:46;:::i;51124:746::-;-1:-1:-1;;;;;51503:15:28;;;51485:34;;51555:15;;;51550:2;51535:18;;51528:43;51607:15;;51602:2;51587:18;;51580:43;51465:3;51654:2;51639:18;;51632:31;;;51428:4;;51686:57;;51723:19;;51715:6;51686:57;:::i;:::-;51792:9;51784:6;51780:22;51774:3;51763:9;51759:19;51752:51;51820:44;51857:6;51849;51820:44;:::i;51875:245::-;51942:6;51995:2;51983:9;51974:7;51970:23;51966:32;51963:52;;;52011:1;52008;52001:12;51963:52;52043:9;52037:16;52062:28;52084:5;52062:28;:::i;52125:350::-;52327:2;52309:21;;;52366:2;52346:18;;;52339:30;52405:28;52400:2;52385:18;;52378:56;52466:2;52451:18;;52125:350::o;52480:397::-;52682:2;52664:21;;;52721:2;52701:18;;;52694:30;52760:34;52755:2;52740:18;;52733:62;-1:-1:-1;;;52826:2:28;52811:18;;52804:31;52867:3;52852:19;;52480:397::o
Swarm Source
ipfs://87e894976939a6cd108252b9737d2bcdaa1b4acdc23217ecf3aa9911aa8feb88
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.