Overview
TokenID
100000278
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 8 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
E741V1Wrapped741
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-03 */ //⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣾⣿⣷⣾⣿⣿⣿⣿⣶⣾⣿⣿⣶⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⠉⢉⡽⢋⣙⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⢰⣿⣦⣀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣛⣛⣓⣒⠶⢤⣾⠀⠀⠸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⢸⣿⠳⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⡄⠀⠀⢳⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⠀⣿⡄⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⣿⡦⠀⠀⠻⠿⣦⣀⡀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⠀⢸⣷⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⢿⡏⠀⠜⡴⠁⠀⠀⠀⡀⠀⠀⠉⠉⠲⢦⡀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⢠⣿⣷⡾⢿⣿⣿⣿⣿⣿⠿⢿⣿⣿⣿⣿⣿⡿⠛⠉⠁⠀⠀⣸⠀⠀⠀⢧⠀⠀⠀⠀⠹⠒⢤⣀⠀⠀⠁⠈⢢⠀ //⠀⠀⠀⠀⠀⠀⠀⠈⣿⣟⠀⠀⠈⠻⣿⠏⢨⠔⢦⠈⢻⣿⡼⠋⢀⣤⣶⣶⣿⣿⣿⣄⢠⣀⡜⠆⠀⢀⡠⠴⠒⠂⠈⢻⢦⡀⠀⠈⡇ //⠀⠀⢀⣶⣿⣷⠀⠀⠘⣿⡄⠀⠐⣶⢬⣇⠉⢣⡸⠀⣰⣿⣁⣴⣿⣿⣿⣿⣿⣿⣟⢿⣽⡛⣧⠔⠒⡏⣀⠀⠀⣀⣀⣾⠀⠑⠢⠤⠃ //⠀⣴⡟⣾⡟⣿⡇⣀⣼⣿⣿⣦⡀⠀⠙⠻⡆⠀⠇⢰⠟⠻⣿⣿⣿⣿⣿⡿⣿⣿⣿⣷⡿⠟⣇⠀⠀⢙⣰⣺⣽⣿⣿⣿⠀⠀⠀⠀⠀ //⢸⡿⢸⡿⣰⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡴⠃⠀⠀⢸⡀⠀⢹⣿⣿⣿⣿⣿⢹⣿⣿⣯⣀⣀⣀⣭⣏⠁⠀⠀⠈⠻⣿⣿⠀⠀⠀⠀⠀ //⣿⡇⢸⡗⢸⠛⣿⡍⠉⠙⠛⠻⢭⣻⣿⣧⠀⠀⢀⣴⠷⣄⡀⠻⣿⣿⣿⣿⣿⣿⣿⣽⣿⣿⣿⣿⡻⡆⠀⠀⠀⠀⠙⠇⠀⠀⠀⠀⠀ //⣿⡇⢸⣷⣽⠶⠛⢷⡀⣠⠤⢤⣾⣿⣿⣽⣞⣿⣭⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡙⢿⣿⠉⠛⢿⣿⣷⡇⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀ //⣿⣇⣼⢿⠁⠀⠀⢠⡷⡇⢠⣶⡽⣿⠋⠉⢻⠿⠛⠋⠉⠉⢹⠉⢻⢻⣿⣿⣿⣿⣿⣷⡶⢏⡠⠿⣿⣷⡞⠛⠙⢳⣦⡀⠀⠀⠀⠀⠀ //⣿⡏⢠⡋⣆⠀⠀⡞⠀⠇⠈⢿⣿⣏⠀⠀⠸⡀⠀⠀⠀⢀⡞⠀⢸⢸⣿⡏⠛⠛⠛⠉⣠⠋⣠⠀⠸⠧⢻⡝⢷⡄⢿⣷⠀⠀⠀⠀⠀ //⢸⣧⠸⡹⡌⢆⣴⣿⡀⠀⠀⠈⠻⠿⣆⠀⠀⠳⣄⣰⣚⠉⠉⠉⠻⣾⣿⡻⣦⣀⣠⣴⠷⠟⣻⠀⠀⠀⢸⡇⢸⣧⢨⣿⠀⠀⠀⠀⠀ //⠀⢿⣇⠓⠃⣼⣇⡈⠻⣄⠀⠰⢦⣀⢀⣷⡄⠀⠀⠀⠈⠉⠓⡤⣄⡈⡿⣿⣷⣶⣶⣶⣾⣿⠟⢀⠆⠀⡾⢷⣾⡇⣼⡟⠀⠀⠀⠀⠀ //⠀⠈⢿⢷⣞⠛⣿⣿⣤⡍⠳⣤⣤⣤⡿⠗⠁⠀⠀⠀⠀⠀⠀⠙⠀⠹⡅⠀⠈⠉⠉⠉⠻⣤⠔⠚⠒⠊⠀⠀⠈⣿⡿⠃⠀⠀⠀⠀⠀ // ███████ █████ ██ ██ ██⣤⣔⡊⣀⠀⠀⡷⠀⠀⠀⢀⣴⠞⠓⠲⠦⣤⡀⠀⠀⣠⡿⠁⠀⠀⠀⠀⠀⠀ // ██ ██ ██ ██ ███⠀⢹⠀⠙⣤⣃⣤⠶⠞⣫⣤⣟⣛⣷⣶⣿⢟⡦⣾⠟⠀⠀⠀⠀⠀⠀⠀⠀ // █████ ██ ███████ ██ ⢸⠀⠀⣿⡏⠾⠿⣶⣿⣿⣿⠿⣛⣽⣾⡿⠚⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀ // ██ ██ ██ ██ ⡇⠀⣠⠏⠉⠛⠳⠶⢶⣶⡿⠿⠟⠊⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ // ███████ ██ ██ ██⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ // A public demonstration in single-contract dual-token implementations // with zero-conflict events, and function overloading. // https://github.com/SJ741/E741-Platform // https://741.gg (Get the token telegram link from 'telegram' variable) // Emerald Token Standard // WARNING - Fungible NFT specs are universally new, and inherently DANGEROUS // no systems have been built with these usecases in mind, and there are a number of // ways that experimental, complex contracts can lead to unforseen consequences. // INTERACT WITH EXPERIMENTAL SMART CONTRACTS AT YOUR OWN RISK //SPDX-License-Identifier: MIT pragma solidity ^0.8.24; // libraries to separate ERC20 and ERC721 events, and certain signature-specific functions // ERC20 events library libES20 { event Transfer(address indexed from, address indexed to, uint amount); event Approval(address indexed owner, address indexed spender, uint256 value); function emitTransfer(address _from, address _to, uint _amount) internal { emit Transfer(_from, _to, _amount); } function emitApproval(address _owner, address _spender, uint _value) internal { emit Approval(_owner, _spender, _value); } } // ERC721 events library libES721 { event Transfer(address indexed _from, address indexed _to, uint indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint indexed _tokenId); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); function emitTransfer(address _from, address _to, uint _tokenId) internal { emit Transfer(_from, _to, _tokenId); } function emitApproval(address _owner, address _approve, uint _tokenId) internal { emit Approval(_owner, _approve, _tokenId); } function emitApprovalForAll(address _owner, address _operator, bool _approved) internal { emit ApprovalForAll(_owner, _operator, _approved); } } // ERC165 https://eips.ethereum.org/EIPS/eip-721 interface IERC165 { function supportsInterface(bytes4 interfaceID) external view returns (bool); } // ERC20 https://eips.ethereum.org/EIPS/eip-20 interface IERC20 { function balanceOf(address account) external view returns (uint256); function totalSupply() external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function decimals() external view returns (uint); } // ERC721 https://eips.ethereum.org/EIPS/eip-721 interface IERC721 is IERC165 { function balanceOf(address account) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external payable; function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function setApprovalForAll(address _operator, bool _approved) external; function getApproved(uint256 _tokenId) external view returns (address); function isApprovedForAll(address _owner, address _operator) external view returns (bool); // payable removed for erc20 etherscan compatibility function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); } interface IE741 is IERC20, IERC721 { // supportsInterface 0x5a46575f // library transfers can not be included in the interface // incorporate them directly with library // libES20.Transfer // libES20.Approval // libES721.Transfer // libES721.Approval // libES721.ApprovalForAll function balanceOf(address account) external override(IERC20, IERC721) view returns (uint256); function approve(address spender, uint256 value) external override(IERC20, IERC721) returns (bool); function transferFrom(address from, address to, uint256 value) external override(IERC20, IERC721) returns (bool); } interface IERC721Metadata { function name() external view returns (string memory _name); function symbol() external view returns (string memory _symbol); function tokenURI(uint256 _tokenId) external view returns (string memory); } interface IERC7572 { function contractURI() external view returns (string memory); event ContractURIUpdated(); } interface IERC20Metadata { function name() external view returns (string memory _name); function symbol() external view returns (string memory _symbol); function tokenURI(uint256 _tokenId) external view returns (string memory); } interface IDevable { function initialize(bytes memory encodedParameters) external returns (address); function dev() external returns (address dev); function setContractURI(string memory newContractURI) external; function setBaseURI(string memory newBaseURI) external; function changeDev(address newDev) external; function toggelNFTinterface() external; function withdraw() external; function setExtension(string memory newExtension) external; function setTelegram(string memory newTelegram) external; function setSkipMintingGlobal(bool newSkipMintingGlobal) external; } // ERC721 Token Receiver https://eips.ethereum.org/EIPS/eip-721 interface IERC721TokenReceiver { function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external returns(bytes4); } contract ERC721TokenReceiver is IERC721TokenReceiver { function onERC721Received(address, address, uint256, bytes memory) external virtual returns(bytes4) { return IERC721TokenReceiver.onERC721Received.selector; } } abstract contract E741V1Base is IDevable, ERC721TokenReceiver, IE741 { address public constant BROKEN_ADDRESS = address(0x5e7ec); address public constant DEPOSIT_ADDRESS = address(0x0); address public constant MINT_ADDRESS = address(0x0); string public baseURI; string internal _contractURI; string public extension; string public telegram; string internal _name; string internal _symbol; uint internal _decimals; uint internal _totalIds; uint internal _totalSupply; uint internal ONE; // 1.0 token(s) uint internal MAXID; // e.g. 1.00000001 : 1.00007777 is the range for NFT IDs uint64 public minted; // number of unique ID mints + ONE address public dev; bool public supportsNFTinterface; bool public skipMintingGlobal = false; mapping(address => mapping(address => bool)) private _operatorApprovals; mapping(address => mapping(address => uint)) internal _allowance; mapping(uint256 tokenId => address) public ownerOf; mapping(uint256 => address) private _nftApprovals; mapping(address => uint) internal _balanceOf; mapping(address => uint64[]) public ownedNFTs; // broken NFTs stored in limbo list are at ownedNFTs[BROKEN_ADDRESS] mapping(uint64 => uint256) internal idToIndex; mapping(address => bool) internal skipMintingUser; error UnsupportedReceiver(); modifier onlyDev() { require(msg.sender == dev, "Not the developer"); _; } constructor() { dev = msg.sender; } function initialize(bytes memory encodedParameters) public override virtual returns (address underlyingToken); function deposit(uint[] memory amounts) public virtual; function withdraw(uint[] memory amounts) public payable virtual; function name() public view virtual returns (string memory) { return _name; } function symbol() public view virtual returns (string memory) { return _symbol; } function decimals() public view virtual returns (uint) { return _decimals; } function totalSupply() public view virtual returns (uint) { return _totalSupply; } function maxSupply() public view virtual returns (uint) { return _totalIds * ONE; } function balanceOf( address account) public view override returns (uint) { return _balanceOf[account]; } function allowance(address owner, address spender) public view override returns (uint) { return _allowance[owner][spender]; } function setBaseURI(string memory newBaseURI) public onlyDev override {baseURI = newBaseURI;} function setContractURI(string memory newContractURI) public onlyDev override virtual {_contractURI = newContractURI; emit IERC7572.ContractURIUpdated();} function setExtension(string memory newExtension) public onlyDev override virtual {extension = newExtension;} function setTelegram(string memory newTelegram) public onlyDev virtual {telegram = newTelegram;} function changeDev(address newDev) public onlyDev override {dev = newDev;}//simple function to change developer address, or revoke ownership (with address(0)) // @DEV toggleNFTinterface is for the small possibility of frontend system changes leading the contract to favor enabling the disabled supportsNFTinterface flag // don't waste it, as frontends don't typically change classification of contracts // probably never to be used. function toggelNFTinterface() public onlyDev override {supportsNFTinterface = !supportsNFTinterface;} function tokensOfOwner(address owner) public view returns (uint64[] memory){return ownedNFTs[owner];} function nftBalanceOf(address account) public view returns (uint) {return ownedNFTs[account].length;} function contractURI() public view virtual returns (string memory) {return _contractURI;} function setSkipMintingGlobal(bool newSkipMintingGlobal) public override virtual onlyDev { skipMintingGlobal = newSkipMintingGlobal; } function setSkipMinting(bool newSkipMinting) public virtual { skipMintingUser[msg.sender] = newSkipMinting; } function approve(address spender, uint amount) public override returns (bool) { // if the amount is greater than one token, and within range of IDs for NFTs // then set NFT approval for the given ID if(amount >= ONE && amount <= MAXID) { address owner = ownerOf[amount]; // getting the owner of token ID via the `amount` input if (msg.sender != owner && !isApprovedForAll(owner, msg.sender)) revert("E741: You are not approved"); _nftApprovals[amount] = spender; // calling nft approval for the token and spender libES721.emitApproval(owner, spender, amount); return true; } // else set the ERC20 allowance // the NFT ID range being set within a limited subset of ONE token(s) // allows for non-clashing interactions _allowance[msg.sender][spender] = amount; libES20.emitApproval(msg.sender, spender, amount); return true; } function _transfer741(address from, address to, uint amount) internal virtual { require(_balanceOf[from] >= amount, "E741: transfer amount exceeds balance"); // checking the decimal amount of tokens owned before transaction for both participants uint256 fromDecimalsPre = _balanceOf[from] % ONE; uint256 toDecimalsPre = _balanceOf[to] % ONE; // simple erc20 balance operations _transfer20(from, to, amount); // checking the decimal amount of tokens after transaction for both partcipants uint256 fromDecimalsPost = _balanceOf[from] % ONE; uint256 toDecimalsPost = _balanceOf[to] % ONE; // stores the NFT IDs owned by `from`, enabling NFT management for that address. uint64[] storage ownedNFTsArray = ownedNFTs[from]; // references NFTs marked as "broken", tracking these special state NFTs. uint64[] storage brokenIDsArray = ownedNFTs[BROKEN_ADDRESS]; // if sender has higher decimal count after transaction, then they "roll under" and break an NFT if (fromDecimalsPre < fromDecimalsPost) { if(ownedNFTsArray.length > 0) { // if the sender has an nft to send //pushes the last nft in the owned list into the "broken list" for limbo NFTs _transfer721Pop(from, BROKEN_ADDRESS, ownedNFTsArray); //transfers the NFT ID ownership to BROKEN address for stewardship } } // if receiver has lower decimal count after transaction then they "roll over" and will "remake" an nft if (toDecimalsPre > toDecimalsPost) { if(brokenIDsArray.length > 0) { // recover an id from broken list _transfer721Pop(BROKEN_ADDRESS, to, brokenIDsArray); } else { // mint new id _mint(to); } } // amount of tokens - amount of whole tokens being processed in int uint amountInTokens = amount / ONE; uint len = ownedNFTsArray.length; //len is the length, or number of NFTs in the addresses's owned array // ignore minting nfts from dev when they call -- this allows for gas-efficient team operations // @DEV if dev gathers NFTs, use the ERC721 transferFrom method to extract // @DEV be careful, don't let the wallet fall to some convoluted transferFrom scam to do something unexpected if(skipMintingGlobal || from == DEPOSIT_ADDRESS || skipMintingUser[to] || skipMintingUser[from] || from == dev) { // When skipping minting the nft holder can only send out the tokens they hold (reduce gas) amountInTokens = amountInTokens < len ? amountInTokens : len; } if(amountInTokens > 0) { len = amountInTokens < len ? amountInTokens : len; // transfers owned NFTs from `from` to `to` until either all are transferred or the desired amount is reached // Subtracts transferred NFT count from `amountInTokens` to update remaining transfers for (uint i = 0; i < len; i++) { _transfer721Pop(from, to, ownedNFTsArray); } amountInTokens -= len; len = brokenIDsArray.length; len = amountInTokens < len ? amountInTokens : len; // recovers NFTs from the broken state to `to`, or mints new ones if not enough broken NFTs are available // if any tokens remain to be allocated, it mints new NFTs to `to` for the remaining balance for (uint i = 0; i < len; i++) { _transfer721Pop(BROKEN_ADDRESS, to, brokenIDsArray); } _mintBatch(to, amountInTokens - len); } } function _mintBatch(address to, uint256 amount) internal virtual { if(amount == 0) return; // Exit if no NFTs to mint if(amount == 1) { // Optimize single mint process _mint(to); return; } uint64 id = minted; // Start ID from last minted value uint256 ownedLen = ownedNFTs[to].length; // Current number of NFTs owned by 'to' for(uint i = 0; i < amount;) { unchecked { id++; // Increment ID for each new NFT } ownerOf[id] = to; // Assign new NFT to owner. idToIndex[id] = ownedLen; // Map NFT ID to its index in owner's array ownedNFTs[to].push(id); // Add new NFT ID to owner's list libES721.emitTransfer(MINT_ADDRESS, to, id); // Emit NFT transfer event unchecked { ownedLen++; // Increment count of owned NFTs i++; // Move to next NFT } } unchecked { minted += uint64(amount); // Update total minted count } } function _mint(address to) internal virtual returns(uint64 tokenId){ unchecked { minted++; // Increment the total number of minted tokens } tokenId = minted; // Assign the newly minted token ID ownerOf[tokenId] = to; // Set ownership of the new token to 'to' idToIndex[tokenId] = ownedNFTs[to].length; // Map the new token ID to its index in the owner's list ownedNFTs[to].push(tokenId); // Add the new token ID to the owner's list of owned tokens libES721.emitTransfer(MINT_ADDRESS, to, tokenId); // Emit an event for the token transfer } // Updates the mappings and arrays managing ownership and index of NFTs after a transfer function _updateOwnedNFTs(address from, address to, uint64 tokenId) internal { uint256 index = idToIndex[tokenId]; // Get current index of the token in the owner's list uint64[] storage nftArray = ownedNFTs[from]; // Reference to the list of NFTs owned by 'from' uint256 len = nftArray.length; // Current number of NFTs owned by 'from' uint64 lastTokenId = nftArray[len - 1]; // Last token in the 'from' array to swap with transferred token nftArray[index] = lastTokenId; // Replace the transferred token with the last token in the array nftArray.pop(); // Remove the last element, effectively deleting the transferred token from 'from' if(len - 1 != 0){ idToIndex[lastTokenId] = index; // Update the index of the swapped token } ownedNFTs[to].push(tokenId); // Add the transferred token to the 'to' array idToIndex[tokenId] = ownedNFTs[to].length - 1; // Update the index mapping for the transferred token } // Executes a simple ERC20 token transfer. function _transfer20(address from, address to, uint256 amount) internal { _balanceOf[from] -= amount; // Deduct the amount from the sender's balance unchecked { _balanceOf[to] += amount; // Add the amount to the recipient's balance } libES20.emitTransfer(from, to, amount); // Emit an ERC20 transfer event } // Handles the transfer of an ERC721 token, ensuring proper ownership and event emission function _transfer721(address from, address to, uint64 tokenId) internal virtual { require(from == ownerOf[tokenId], "E741: Incorrect owner"); // Ensure 'from' is the current owner delete _nftApprovals[tokenId]; // Clear any approvals for this token ownerOf[tokenId] = to; // Transfer ownership of the token to 'to' _updateOwnedNFTs(from, to, tokenId); // Update ownership tracking structures libES721.emitTransfer(from, to, tokenId); // Emit an ERC721 transfer event } // Handles the transfer of an ERC721 token, ensuring proper ownership and event emission function _transfer721Pop(address from, address to, uint64[] storage nftArray) internal virtual { uint64 tokenId = nftArray[nftArray.length - 1]; delete _nftApprovals[tokenId]; // Clear any approvals for this token ownerOf[tokenId] = to; // Transfer ownership of the token to 'to' // update owned nfts pop edition nftArray.pop(); // Remove the last element, effectively deleting the transferred token from 'from' ownedNFTs[to].push(tokenId); // Add the transferred token to the 'to' array idToIndex[tokenId] = ownedNFTs[to].length - 1; // Update the index mapping for the transferred token libES721.emitTransfer(from, to, tokenId); // Emit an ERC721 transfer event } // only erc20 calls this // if amount is a token id owned my the caller send as an NFT // else transfer741 function transfer(address to, uint amount) public override returns (bool) { if(ownerOf[amount] == msg.sender) { _transfer721(msg.sender, to, uint64(amount)); _transfer20(msg.sender, to, ONE); return true; } _transfer741(msg.sender, to, amount); return true; } // erc20 and erc721 call this function transferFrom(address from, address to, uint amount) public override returns (bool) { //if amount is within the NFT id range, then a simple NFT transfer + token amount (ONE) if(amount >= ONE && amount <= MAXID) { require( //require from is the msg caller, or that caller is approved for that specific NFT, or all NFTs msg.sender == from || msg.sender == getApproved(amount) || isApprovedForAll(from, msg.sender), "E741: You don't have the right" ); _transfer721(from, to, uint64(amount)); _transfer20(from, to, ONE); return true; } _spendAllowance(from, msg.sender, amount); _transfer741(from, to, amount); return true; } // erc721 function safeTransferFrom(address from, address to, uint256 tokenId) public payable override { require( msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender), "E741: You don't have the right" ); _transfer721(from, to, uint64(tokenId)); _transfer20(from, to, ONE); if ( to.code.length != 0 && IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, "") != IERC721TokenReceiver.onERC721Received.selector ) { revert UnsupportedReceiver(); } } // erc721 function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override { require( msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender), "E741: You don't have the right" ); _transfer721(from, to, uint64(tokenId)); _transfer20(from, to, ONE); if ( to.code.length != 0 && IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, data) != IERC721TokenReceiver.onERC721Received.selector ) { revert UnsupportedReceiver(); } } function _spendAllowance(address owner, address spender, uint amount) internal virtual { require(_allowance[owner][spender] >= amount, "E741: insufficient allowance"); _allowance[owner][spender] -= amount; } function getApproved(uint256 tokenId) public view override returns (address) { if (ownerOf[tokenId] == address(0)) revert(); return _nftApprovals[tokenId]; } function setApprovalForAll(address operator, bool approved) public override { _operatorApprovals[msg.sender][operator] = approved; libES721.emitApprovalForAll(msg.sender, operator, approved); } function isApprovedForAll(address owner, address operator) public view override returns (bool) { return _operatorApprovals[owner][operator]; } function tokenURI(uint256 tokenId) public view virtual returns (string memory) { require(tokenId <= MAXID, "E741: invalid id"); if (bytes(baseURI).length == 0) {return "";} return string(abi.encodePacked(baseURI, toString(tokenId - ONE), extension)); } function toString(uint256 value) internal pure returns (string memory) { 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(value % 10) + 48); value /= 10;} return string(buffer); } function withdraw() external onlyDev override { (bool success,) = payable(dev).call{value: address(this).balance}(""); require(success); } function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return // Even though we support ERC721 and should return true, etherscan wants to treat us as ERC721 instead of ERC20 // @DEV ERC165 for ERC721 can be toggled on for reasons of frontend/dapp/script implementations, but is very specific (supportsNFTinterface && interfaceId == 0x80ac58cd) || // ERC165 interface ID for ERC721 interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165 interfaceId == 0x36372b07 || // ERC165 interface ID for ERC20 interfaceId == 0x150b7a02 || // ERC165 interface ID for IERC721TokenReceiver interfaceId == 0x5a46575f; // ERC165 interface ID for IE741 } } pragma solidity ^0.8.24; contract E741V1Wrapped741 is E741V1Base { event Deposit(address indexed from, uint amount741Out, uint[] amounts741In); event Withdrawal(address indexed to, uint amountUnderlyingOut, uint[] amounts741In); address constant EMERALDS = 0x382EDfe4c6168858C81893fE00fCB7b68914d929; address public underlying741; uint public underlyingWeiPerNft; address public feeRecipient; uint public withdrawalFees; uint internal withdrawalFeesDivisor = 10000; uint constant WITHDRAWAL_FEES_MIN = 5; // 0.05% uint constant WITHDRAWAL_FEES_MAX = 50; // 0.5% function initialize(bytes memory encodedParameters) public virtual override returns (address) { require(_decimals == 0, "Already initialized"); { // to prevent stack to deep error string memory _inputName; string memory _inputSymbol; (withdrawalFees, underlying741, _inputName, _inputSymbol, _decimals, baseURI, _contractURI, _totalIds, underlyingWeiPerNft) = abi.decode(encodedParameters, (uint,address,string,string,uint,string,string,uint,uint)); _name = _inputName; _symbol = _inputSymbol; } { address _token = underlying741; require(_token != address(0), 'E741V1: ZERO_ADDRESS'); try IERC165(_token).supportsInterface(0x5a46575f) returns (bool supports741) { require(_token == EMERALDS || supports741, "The underlying token does not support e741"); } catch { revert("The underlying token does not support ERC165"); } } ONE = 10 ** _decimals; MAXID = ONE + _totalIds - 1; minted = uint64(ONE) - 1; // start minting from ID ONE-1 so you can get id 0 feeRecipient = msg.sender; // our factory is always the fee recipient even if dev of token changes require(_decimals <= 18 && IERC20(underlying741).decimals() <= 18, "Too many decimals"); require(_totalIds > 0, "Need at least 1 nft"); require(withdrawalFees >= WITHDRAWAL_FEES_MIN, "Min fees of 0.05%"); require(withdrawalFees <= WITHDRAWAL_FEES_MAX, "Max fees of 0.5%"); require(ONE > _totalIds, "Not enough decimals for NFT count"); return underlying741; } // deposit amount of underlying741 function deposit(uint[] memory _amountsArray) public virtual override { uint _len = _amountsArray.length; uint _amount741Out; uint _underlyingONE = 10 ** IERC20(underlying741).decimals(); if(_len == 1) { if(IE741(underlying741).ownerOf(_amountsArray[0]) != msg.sender) { // not single nft transfer _amount741Out = (_amountsArray[0] * ONE) / underlyingWeiPerNft; } else { _amount741Out = (_underlyingONE * ONE) / underlyingWeiPerNft; // _len is 1 } // use direct from array to transfer the nft id if used IE741(underlying741).transferFrom(msg.sender, address(this), _amountsArray[0]); } else { for(uint i = 0; i < _len; i++) { // reverts if they deposit unowned or invalid id IE741(underlying741).safeTransferFrom(msg.sender, address(this), _amountsArray[i]); } _amount741Out = ((_len * _underlyingONE) * ONE) / underlyingWeiPerNft; } // spawn raw tokens _balanceOf[DEPOSIT_ADDRESS] += _amount741Out; _totalSupply += _amount741Out; _transfer741(DEPOSIT_ADDRESS, msg.sender, _amount741Out); // use _transfer741 to give user broken nfts if necessary // donating tokens to this wrapper will only make the wrapped token more scarce require(underlyingWeiPerNft * _totalIds >= IERC20(underlying741).balanceOf(address(this)), "NFT capacity reached, wait for someone to withdraw"); emit Deposit(msg.sender, _amount741Out, _amountsArray); } // Two modes // withdraw([amount]) // withdraw([id1, id2, id3]) function withdraw(uint256[] memory _amountsArray741) public virtual override payable { uint _arrayLen = _amountsArray741.length; require(_arrayLen > 0, "Trying to withdraw nothing"); uint _amount741; uint _amount741Sum; uint _underlyingONE = 10 ** IERC20(underlying741).decimals(); if (_arrayLen == 1) { _amount741 = _amountsArray741[0]; if (ownerOf[_amount741] == msg.sender) { _amount741Sum = ONE; // only record ONE for owned transfer } else { _amount741Sum = _amount741; } transfer(DEPOSIT_ADDRESS, _amount741); } else { for(uint i = 0; i < _arrayLen;) { _amount741 = _amountsArray741[i]; require(ownerOf[_amount741] == msg.sender, "Can only withdraw for nfts you own"); transfer(DEPOSIT_ADDRESS, _amount741); unchecked { i++; } } _amount741Sum = _arrayLen * ONE; // only record ONE for owned transfer } // remove raw tokens _balanceOf[DEPOSIT_ADDRESS] -= _amount741Sum; _totalSupply -= _amount741Sum; uint _totalUnderlyingOut = (_amount741Sum * underlyingWeiPerNft) / ONE; // use ONE not _underlyingONE uint _totalUnderlyingFees = (_totalUnderlyingOut * withdrawalFees) / withdrawalFeesDivisor; IE741(underlying741).transfer(feeRecipient, _totalUnderlyingFees); IE741(underlying741).transfer(msg.sender, (_totalUnderlyingOut - _totalUnderlyingFees)); emit Withdrawal(msg.sender, _totalUnderlyingOut, _amountsArray741); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"UnsupportedReceiver","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount741Out","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"amounts741In","type":"uint256[]"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountUnderlyingOut","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"amounts741In","type":"uint256[]"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"BROKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDev","type":"address"}],"name":"changeDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amountsArray","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedParameters","type":"bytes"}],"name":"initialize","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"nftBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownedNFTs","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtension","type":"string"}],"name":"setExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newSkipMinting","type":"bool"}],"name":"setSkipMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newSkipMintingGlobal","type":"bool"}],"name":"setSkipMintingGlobal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newTelegram","type":"string"}],"name":"setTelegram","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skipMintingGlobal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supportsNFTinterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"telegram","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggelNFTinterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying741","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underlyingWeiPerNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amountsArray741","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600b805460ff60e81b19169055612710601855348015610022575f80fd5b50600b8054600160401b600160e01b03191633680100000000000000000217905561386e806100505f395ff3fe6080604052600436106102a5575f3560e01c80636bcef9a61161016f578063a9059cbb116100d8578063d5abeb0111610092578063e8e81fe41161006d578063e8e81fe414610856578063e985e9c514610875578063f835ab0014610894578063ff0d2c26146104c9575f80fd5b8063d5abeb01146107ea578063dd62ed3e146107fe578063e8a3d48514610842575f80fd5b8063a9059cbb14610745578063b3720c3414610764578063b88d4fde14610784578063bb74e1ae14610797578063c87b56dd146107b6578063caf0dcc2146107d5575f80fd5b806391cca3db1161012957806391cca3db1461069a578063938e3d7b146106c057806395d89b41146106df578063983d95ce146106f3578063a22cb46514610706578063a563833b14610725575f80fd5b80636bcef9a6146105d45780636c0360eb146105e857806370a08231146105fc5780637e2285aa146106305780638462151c1461064f57806388a8c95c1461067b575f80fd5b80633ccfd60b116102115780634ee2c4ce116101cb5780634ee2c4ce1461050f5780634f02c4201461052457806355f804b314610543578063598b8e71146105625780636352211e146105815780636a21f8e1146105b5575f80fd5b80633ccfd60b1461048157806342842e0e14610497578063439fab91146104aa578063466c35fc146104c957806346904840146104dc57806347ecb665146104fb575f80fd5b806318160ddd1161026257806318160ddd146103d95780631a72b87d146103ed57806323b872dd146104245780632d5537b0146104435780632ff3a24214610457578063313ce5671461046d575f80fd5b806301ffc9a7146102a957806306fdde03146102dd578063081812fc146102fe578063095ea7b3146103355780630e313e9814610354578063150b7a0214610396575b5f80fd5b3480156102b4575f80fd5b506102c86102c3366004612db5565b6108cd565b60405190151581526020015b60405180910390f35b3480156102e8575f80fd5b506102f161096a565b6040516102d49190612e1d565b348015610309575f80fd5b5061031d610318366004612e2f565b6109fa565b6040516001600160a01b0390911681526020016102d4565b348015610340575f80fd5b506102c861034f366004612e5a565b610a34565b34801561035f575f80fd5b5061038861036e366004612e84565b6001600160a01b03165f9081526011602052604090205490565b6040519081526020016102d4565b3480156103a1575f80fd5b506103c06103b0366004612f62565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016102d4565b3480156103e4575f80fd5b50600854610388565b3480156103f8575f80fd5b5061040c610407366004612e5a565b610b42565b6040516001600160401b0390911681526020016102d4565b34801561042f575f80fd5b506102c861043e366004612fc9565b610b89565b34801561044e575f80fd5b506102f1610c40565b348015610462575f80fd5b5061031d6205e7ec81565b348015610478575f80fd5b50600654610388565b34801561048c575f80fd5b50610495610ccc565b005b6104956104a5366004612fc9565b610d63565b3480156104b5575f80fd5b5061031d6104c4366004613007565b610ea2565b3480156104d4575f80fd5b5061031d5f81565b3480156104e7575f80fd5b5060165461031d906001600160a01b031681565b348015610506575f80fd5b506102f16113a2565b34801561051a575f80fd5b5061038860175481565b34801561052f575f80fd5b50600b5461040c906001600160401b031681565b34801561054e575f80fd5b5061049561055d366004613038565b6113af565b34801561056d575f80fd5b5061049561057c36600461307c565b6113ef565b34801561058c575f80fd5b5061031d61059b366004612e2f565b600e6020525f90815260409020546001600160a01b031681565b3480156105c0575f80fd5b506104956105cf366004613129565b611880565b3480156105df575f80fd5b506104956118cf565b3480156105f3575f80fd5b506102f1611921565b348015610607575f80fd5b50610388610616366004612e84565b6001600160a01b03165f9081526010602052604090205490565b34801561063b575f80fd5b5061049561064a366004613038565b61192d565b34801561065a575f80fd5b5061066e610669366004612e84565b61196a565b6040516102d49190613144565b348015610686575f80fd5b50610495610695366004612e84565b611a04565b3480156106a5575f80fd5b50600b5461031d90600160401b90046001600160a01b031681565b3480156106cb575f80fd5b506104956106da366004613038565b611a66565b3480156106ea575f80fd5b506102f1611acf565b61049561070136600461307c565b611ade565b348015610711575f80fd5b50610495610720366004613190565b611eb8565b348015610730575f80fd5b50600b546102c890600160e01b900460ff1681565b348015610750575f80fd5b506102c861075f366004612e5a565b611ef1565b34801561076f575f80fd5b50600b546102c890600160e81b900460ff1681565b610495610792366004612f62565b611f3b565b3480156107a2575f80fd5b5060145461031d906001600160a01b031681565b3480156107c1575f80fd5b506102f16107d0366004612e2f565b612068565b3480156107e0575f80fd5b5061038860155481565b3480156107f5575f80fd5b50610388612117565b348015610809575f80fd5b506103886108183660046131c7565b6001600160a01b039182165f908152600d6020908152604080832093909416825291909152205490565b34801561084d575f80fd5b506102f161212d565b348015610861575f80fd5b50610495610870366004613038565b61213c565b348015610880575f80fd5b506102c861088f3660046131c7565b612179565b34801561089f575f80fd5b506104956108ae366004613129565b335f908152601360205260409020805460ff1916911515919091179055565b600b545f90600160e01b900460ff1680156108f857506380ac58cd60e01b6001600160e01b03198316145b8061091357506301ffc9a760e01b6001600160e01b03198316145b8061092e57506336372b0760e01b6001600160e01b03198316145b806109495750630a85bd0160e11b6001600160e01b03198316145b806109645750635a46575f60e01b6001600160e01b03198316145b92915050565b606060048054610979906131f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109a5906131f3565b80156109f05780601f106109c7576101008083540402835291602001916109f0565b820191905f5260205f20905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b5f818152600e60205260408120546001600160a01b0316610a19575f80fd5b505f908152600f60205260409020546001600160a01b031690565b5f6009548210158015610a495750600a548211155b15610b09575f828152600e60205260409020546001600160a01b0316338114801590610a7c5750610a7a8133612179565b155b15610ace5760405162461bcd60e51b815260206004820152601a60248201527f453734313a20596f7520617265206e6f7420617070726f76656400000000000060448201526064015b60405180910390fd5b5f838152600f6020526040902080546001600160a01b0319166001600160a01b038616179055610aff8185856121a6565b6001915050610964565b335f818152600d602090815260408083206001600160a01b03881684529091529020839055610b399084846121ec565b50600192915050565b6011602052815f5260405f208181548110610b5b575f80fd5b905f5260205f209060049182820401919006600802915091509054906101000a90046001600160401b031681565b5f6009548210158015610b9e5750600a548211155b15610c1f57336001600160a01b0385161480610bd35750610bbe826109fa565b6001600160a01b0316336001600160a01b0316145b80610be35750610be38433612179565b610bff5760405162461bcd60e51b8152600401610ac59061322b565b610c0a84848461223e565b610c17848460095461230c565b506001610c39565b610c2a843384612360565b610c35848484612414565b5060015b9392505050565b60028054610c4d906131f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c79906131f3565b8015610cc45780601f10610c9b57610100808354040283529160200191610cc4565b820191905f5260205f20905b815481529060010190602001808311610ca757829003601f168201915b505050505081565b600b54600160401b90046001600160a01b03163314610cfd5760405162461bcd60e51b8152600401610ac590613262565b600b546040515f91600160401b90046001600160a01b03169047908381818185875af1925050503d805f8114610d4e576040519150601f19603f3d011682016040523d82523d5f602084013e610d53565b606091505b5050905080610d60575f80fd5b50565b336001600160a01b0384161480610d935750610d7e816109fa565b6001600160a01b0316336001600160a01b0316145b80610da35750610da38333612179565b610dbf5760405162461bcd60e51b8152600401610ac59061322b565b610dca83838361223e565b610dd7838360095461230c565b6001600160a01b0382163b15801590610e7f5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e72919061328d565b6001600160e01b03191614155b15610e9d576040516301d6c93560e61b815260040160405180910390fd5b505050565b5f6006545f14610eea5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610ac5565b60608083806020019051810190610f0191906132f5565b6015819055600782905560175f60148160068180806001610f228c8261341a565b50610f2f90508b8261341a565b508a91905055899d508a9e508b91906101000a8154816001600160a01b0302191690836001600160a01b031602179055508a919050555050505050505050508160049081610f7d919061341a565b506005610f8a828261341a565b50506014546001600160a01b0316905080610fde5760405162461bcd60e51b81526020600482015260146024820152734537343156313a205a45524f5f4144445245535360601b6044820152606401610ac5565b6040516301ffc9a760e01b8152635a46575f60e01b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015611045575060408051601f3d908101601f19168201909252611042918101906134d9565b60015b6110a65760405162461bcd60e51b815260206004820152602c60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526b70706f72742045524331363560a01b6064820152608401610ac5565b6001600160a01b03821673382edfe4c6168858c81893fe00fcb7b68914d92914806110ce5750805b61112d5760405162461bcd60e51b815260206004820152602a60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526970706f7274206537343160b01b6064820152608401610ac5565b505060065461113d90600a6135d9565b600981905560075460019161115291906135e4565b61115c91906135f7565b600a5560095461116e9060019061360a565b600b80546001600160401b039290921667ffffffffffffffff19909216919091179055601680546001600160a01b0319163317905560065460121080159061122057506014546040805163313ce56760e01b815290516012926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156111f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121d9190613631565b11155b6112605760405162461bcd60e51b8152602060048201526011602482015270546f6f206d616e7920646563696d616c7360781b6044820152606401610ac5565b5f600754116112a75760405162461bcd60e51b81526020600482015260136024820152721399595908185d081b19585cdd080c481b999d606a1b6044820152606401610ac5565b600560175410156112ee5760405162461bcd60e51b81526020600482015260116024820152704d696e2066656573206f6620302e30352560781b6044820152606401610ac5565b603260175411156113345760405162461bcd60e51b815260206004820152601060248201526f4d61782066656573206f6620302e352560801b6044820152606401610ac5565b600754600954116113915760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820646563696d616c7320666f72204e465420636f756e6044820152601d60fa1b6064820152608401610ac5565b50506014546001600160a01b031690565b60038054610c4d906131f3565b600b54600160401b90046001600160a01b031633146113e05760405162461bcd60e51b8152600401610ac590613262565b5f6113eb828261341a565b5050565b80516014546040805163313ce56760e01b815290515f9283926001600160a01b039091169163313ce567916004808201926020929091908290030181865afa15801561143d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114619190613631565b61146c90600a6135d9565b90508260010361161957601454845133916001600160a01b031690636352211e9087905f9061149d5761149d613648565b60200260200101516040518263ffffffff1660e01b81526004016114c391815260200190565b602060405180830381865afa1580156114de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611502919061365c565b6001600160a01b03161461154b57601554600954855f8151811061152857611528613648565b602002602001015161153a9190613677565b61154491906136a2565b9150611568565b60155460095461155b9083613677565b61156591906136a2565b91505b60145484516001600160a01b03909116906323b872dd903390309088905f9061159357611593613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303815f875af11580156115ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161391906134d9565b506116f1565b5f5b838110156116c95760145485516001600160a01b03909116906342842e0e903390309089908690811061165057611650613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015f604051808303815f87803b1580156116a7575f80fd5b505af11580156116b9573d5f803e3d5ffd5b50506001909201915061161b9050565b506015546009546116da8386613677565b6116e49190613677565b6116ee91906136a2565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01805484929061172b9084906135e4565b925050819055508160085f82825461174391906135e4565b9091555061175490505f3384612414565b6014546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117be9190613631565b6007546015546117ce9190613677565b10156118375760405162461bcd60e51b815260206004820152603260248201527f4e465420636170616369747920726561636865642c207761697420666f7220736044820152716f6d656f6e6520746f20776974686472617760701b6064820152608401610ac5565b336001600160a01b03167fe7425730072f5a6ec278ae24c998f6a79299c875cbd84ad35585563a0cb3c66683866040516118729291906136b5565b60405180910390a250505050565b600b54600160401b90046001600160a01b031633146118b15760405162461bcd60e51b8152600401610ac590613262565b600b8054911515600160e81b0260ff60e81b19909216919091179055565b600b54600160401b90046001600160a01b031633146119005760405162461bcd60e51b8152600401610ac590613262565b600b805460ff60e01b198116600160e01b9182900460ff1615909102179055565b5f8054610c4d906131f3565b600b54600160401b90046001600160a01b0316331461195e5760405162461bcd60e51b8152600401610ac590613262565b60026113eb828261341a565b6001600160a01b0381165f908152601160209081526040918290208054835181840281018401909452808452606093928301828280156119f857602002820191905f5260205f20905f905b82829054906101000a90046001600160401b03166001600160401b0316815260200190600801906020826007010492830192600103820291508084116119b55790505b50505050509050919050565b600b54600160401b90046001600160a01b03163314611a355760405162461bcd60e51b8152600401610ac590613262565b600b80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b600b54600160401b90046001600160a01b03163314611a975760405162461bcd60e51b8152600401610ac590613262565b6001611aa3828261341a565b506040517fa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad962905f90a150565b606060058054610979906131f3565b805180611b2d5760405162461bcd60e51b815260206004820152601a60248201527f547279696e6720746f207769746864726177206e6f7468696e670000000000006044820152606401610ac5565b5f805f60145f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba49190613631565b611baf90600a6135d9565b905083600103611c1857845f81518110611bcb57611bcb613648565b6020908102919091018101515f818152600e909252604090912054909350336001600160a01b0390911603611c04576009549150611c08565b8291505b611c125f84611ef1565b50611cd8565b5f5b84811015611cc757858181518110611c3457611c34613648565b6020908102919091018101515f818152600e9092526040909120549094506001600160a01b03163314611cb45760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920776974686472617720666f72206e66747320796f75206f6044820152613bb760f11b6064820152608401610ac5565b611cbe5f85611ef1565b50600101611c1a565b50600954611cd59085613677565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb018054849290611d129084906135f7565b925050819055508160085f828254611d2a91906135f7565b90915550506009546015545f9190611d429085613677565b611d4c91906136a2565b90505f60185460175483611d609190613677565b611d6a91906136a2565b60145460165460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611dbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de291906134d9565b506014546001600160a01b031663a9059cbb33611dff84866135f7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6b91906134d9565b50336001600160a01b03167f2384392c42d82ed11db876875a09153a0d3585ff3fc7b9dc12393a232e46b2cf8389604051611ea79291906136b5565b60405180910390a250505050505050565b335f818152600c602090815260408083206001600160a01b03871684529091529020805460ff19168315151790556113eb908383612706565b5f818152600e6020526040812054336001600160a01b0390911603611f3057611f1b33848461223e565b611f28338460095461230c565b506001610964565b610b39338484612414565b336001600160a01b0385161480611f6b5750611f56826109fa565b6001600160a01b0316336001600160a01b0316145b80611f7b5750611f7b8433612179565b611f975760405162461bcd60e51b8152600401610ac59061322b565b611fa284848461223e565b611faf848460095461230c565b6001600160a01b0383163b158015906120445750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290611ff7903390899088908890600401613703565b6020604051808303815f875af1158015612013573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612037919061328d565b6001600160e01b03191614155b15612062576040516301d6c93560e61b815260040160405180910390fd5b50505050565b6060600a548211156120af5760405162461bcd60e51b815260206004820152601060248201526f114dcd0c4e881a5b9d985b1a59081a5960821b6044820152606401610ac5565b5f80546120bb906131f3565b90505f036120d657505060408051602081019091525f815290565b5f6120ed600954846120e891906135f7565b61274d565b6002604051602001612101939291906137ae565b6040516020818303038152906040529050919050565b5f6009546007546121289190613677565b905090565b606060018054610979906131f3565b600b54600160401b90046001600160a01b0316331461216d5760405162461bcd60e51b8152600401610ac590613262565b60036113eb828261341a565b6001600160a01b039182165f908152600c6020908152604080832093909416825291909152205460ff1690565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161223191815260200190565b60405180910390a3505050565b6001600160401b0381165f908152600e60205260409020546001600160a01b038481169116146122a85760405162461bcd60e51b8152602060048201526015602482015274229b9a189d1024b731b7b93932b1ba1037bbb732b960591b6044820152606401610ac5565b6001600160401b0381165f908152600f6020908152604080832080546001600160a01b0319908116909155600e90925290912080549091166001600160a01b0384161790556122f8838383612851565b610e9d8383836001600160401b0316612a07565b6001600160a01b0383165f90815260106020526040812080548392906123339084906135f7565b90915550506001600160a01b0382165f908152601060205260409020805482019055610e9d838383612a4d565b6001600160a01b038084165f908152600d60209081526040808320938616835292905220548111156123d45760405162461bcd60e51b815260206004820152601c60248201527f453734313a20696e73756666696369656e7420616c6c6f77616e6365000000006044820152606401610ac5565b6001600160a01b038084165f908152600d602090815260408083209386168352929052908120805483929061240a9084906135f7565b9091555050505050565b6001600160a01b0383165f908152601060205260409020548111156124895760405162461bcd60e51b815260206004820152602560248201527f453734313a207472616e7366657220616d6f756e7420657863656564732062616044820152646c616e636560d81b6064820152608401610ac5565b6009546001600160a01b0384165f9081526010602052604081205490916124af916137e0565b6009546001600160a01b0385165f90815260106020526040812054929350916124d891906137e0565b90506124e585858561230c565b6009546001600160a01b0386165f90815260106020526040812054909161250b916137e0565b6009546001600160a01b0387165f908152601060205260408120549293509161253491906137e0565b6001600160a01b0388165f9081526011602052604081206205e7ec9091529091507f1b6e7c417ed9cfc24ca11cc87b3bdb69a80c713b279159d52af44c081e616a17838610156125935781541561259357612593896205e7ec84612a92565b828511156125c0578054156125b5576125b06205e7ec8983612a92565b6125c0565b6125be88612be2565b505b5f600954886125cf91906136a2565b8354600b5491925090600160e81b900460ff16806125f457506001600160a01b038b16155b8061261657506001600160a01b038a165f9081526013602052604090205460ff165b8061263857506001600160a01b038b165f9081526013602052604090205460ff165b806126575750600b546001600160a01b038c8116600160401b90920416145b1561266e57808210612669578061266b565b815b91505b81156126f9578082106126815780612683565b815b90505f5b818110156126a25761269a8c8c87612a92565b600101612687565b506126ad81836135f7565b835490925090508082106126c157806126c3565b815b90505f5b818110156126e5576126dd6205e7ec8c86612a92565b6001016126c7565b506126f98a6126f483856135f7565b612c8f565b5050505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612231911515815260200190565b6060815f036127735750506040805180820190915260018152600360fc1b602082015290565b815f5b811561279c5780612786816137f3565b91506127959050600a836136a2565b9150612776565b5f816001600160401b038111156127b5576127b5612e9f565b6040519080825280601f01601f1916602001820160405280156127df576020820181803683370190505b5090505b8415612849576127f46001836135f7565b9150612801600a866137e0565b61280c90603061380b565b60f81b81838151811061282157612821613648565b60200101906001600160f81b03191690815f1a905350612842600a866136a2565b94506127e3565b949350505050565b6001600160401b0381165f908152601260209081526040808320546001600160a01b03871684526011909252822080549192909190826128926001846135f7565b815481106128a2576128a2613648565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b03169050808385815481106128de576128de613648565b905f5260205f2090600491828204019190066008026101000a8154816001600160401b0302191690836001600160401b031602179055508280548061292557612925613824565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a0219169055905561295f6001836135f7565b1561297f576001600160401b0381165f9081526012602052604090208490555b6001600160a01b0386165f81815260116020908152604082208054600180820183558285529284206004820401805460039092166008026101000a6001600160401b0381810219909316928c16029190911790559290915290546129e391906135f7565b6001600160401b039095165f90815260126020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161223191815260200190565b80545f908290612aa4906001906135f7565b81548110612ab457612ab4613648565b5f918252602080832060048304015460039092166008026101000a9091046001600160401b0316808352600f8252604080842080546001600160a01b0319908116909155600e90935290922080549091166001600160a01b0386161790558254909150829080612b2657612b26613824565b5f828152602080822060045f1990940184810490910180546001600160401b0360086003808616820261010090810a840219909416909455939097556001600160a01b038a16808652601185526040862080546001818101835582895296882098810490980180548b8b169990951690950290920a968702969097021990911694909417905592905254612bba91906135f7565b6001600160401b0382165f818152601260205260409020919091556120629085908590612a07565b600b805467ffffffffffffffff19811660016001600160401b03928316810183169182179093555f818152600e6020908152604080832080546001600160a01b0319166001600160a01b03891690811790915583526011808352818420805486865260128552928520839055908352958101865594825281206004850401805460039095166008026101000a9384021990941692820292909217909255612c8a908383612a07565b919050565b805f03612c9a575050565b80600103612cab57610e9d82612be2565b600b546001600160a01b0383165f908152601160205260408120546001600160401b0390921691905b83811015612d735760019283016001600160401b038181165f818152600e6020908152604080832080546001600160a01b0319166001600160a01b038d1690811790915560128352818420899055835260118252822080549889018155825281206004880401805460039098166008026101000a93840219909716928202929092179095559093612d6791908790612a07565b60019182019101612cd4565b5050600b805467ffffffffffffffff1981166001600160401b039182169490940116929092179091555050565b6001600160e01b031981168114610d60575f80fd5b5f60208284031215612dc5575f80fd5b8135610c3981612da0565b5f5b83811015612dea578181015183820152602001612dd2565b50505f910152565b5f8151808452612e09816020860160208601612dd0565b601f01601f19169290920160200192915050565b602081525f610c396020830184612df2565b5f60208284031215612e3f575f80fd5b5035919050565b6001600160a01b0381168114610d60575f80fd5b5f8060408385031215612e6b575f80fd5b8235612e7681612e46565b946020939093013593505050565b5f60208284031215612e94575f80fd5b8135610c3981612e46565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715612edb57612edb612e9f565b604052919050565b5f6001600160401b03821115612efb57612efb612e9f565b50601f01601f191660200190565b5f612f1b612f1684612ee3565b612eb3565b9050828152838383011115612f2e575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112612f53575f80fd5b610c3983833560208501612f09565b5f805f8060808587031215612f75575f80fd5b8435612f8081612e46565b93506020850135612f9081612e46565b92506040850135915060608501356001600160401b03811115612fb1575f80fd5b612fbd87828801612f44565b91505092959194509250565b5f805f60608486031215612fdb575f80fd5b8335612fe681612e46565b92506020840135612ff681612e46565b929592945050506040919091013590565b5f60208284031215613017575f80fd5b81356001600160401b0381111561302c575f80fd5b61284984828501612f44565b5f60208284031215613048575f80fd5b81356001600160401b0381111561305d575f80fd5b8201601f8101841361306d575f80fd5b61284984823560208401612f09565b5f602080838503121561308d575f80fd5b82356001600160401b03808211156130a3575f80fd5b818501915085601f8301126130b6575f80fd5b8135818111156130c8576130c8612e9f565b8060051b91506130d9848301612eb3565b81815291830184019184810190888411156130f2575f80fd5b938501935b83851015613110578435825293850193908501906130f7565b98975050505050505050565b8015158114610d60575f80fd5b5f60208284031215613139575f80fd5b8135610c398161311c565b602080825282518282018190525f9190848201906040850190845b818110156131845783516001600160401b03168352928401929184019160010161315f565b50909695505050505050565b5f80604083850312156131a1575f80fd5b82356131ac81612e46565b915060208301356131bc8161311c565b809150509250929050565b5f80604083850312156131d8575f80fd5b82356131e381612e46565b915060208301356131bc81612e46565b600181811c9082168061320757607f821691505b60208210810361322557634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252601e908201527f453734313a20596f7520646f6e27742068617665207468652072696768740000604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f6020828403121561329d575f80fd5b8151610c3981612da0565b8051612c8a81612e46565b5f82601f8301126132c2575f80fd5b81516132d0612f1682612ee3565b8181528460208386010111156132e4575f80fd5b612849826020830160208701612dd0565b5f805f805f805f805f6101208a8c03121561330e575f80fd5b8951985061331e60208b016132a8565b975060408a01516001600160401b0380821115613339575f80fd5b6133458d838e016132b3565b985060608c015191508082111561335a575f80fd5b6133668d838e016132b3565b975060808c0151965060a08c0151915080821115613382575f80fd5b61338e8d838e016132b3565b955060c08c01519150808211156133a3575f80fd5b506133b08c828d016132b3565b93505060e08a015191506101008a015190509295985092959850929598565b601f821115610e9d57805f5260205f20601f840160051c810160208510156133f45750805b601f840160051c820191505b81811015613413575f8155600101613400565b5050505050565b81516001600160401b0381111561343357613433612e9f565b6134478161344184546131f3565b846133cf565b602080601f83116001811461347a575f84156134635750858301515b5f19600386901b1c1916600185901b1785556134d1565b5f85815260208120601f198616915b828110156134a857888601518255948401946001909101908401613489565b50858210156134c557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156134e9575f80fd5b8151610c398161311c565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561354257815f1904821115613528576135286134f4565b8085161561353557918102915b93841c939080029061350d565b509250929050565b5f8261355857506001610964565b8161356457505f610964565b8160018114610aff57600281036135915760ff841115613586576135866134f4565b50506001821b610964565b5060208310610133831016604e8410600b84101617156135b4575081810a610964565b6135be8383613508565b805f19048211156135d1576135d16134f4565b029392505050565b5f610c39838361354a565b80820180821115610964576109646134f4565b81810381811115610964576109646134f4565b6001600160401b0382811682821603908082111561362a5761362a6134f4565b5092915050565b5f60208284031215613641575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561366c575f80fd5b8151610c3981612e46565b8082028115828204841417610964576109646134f4565b634e487b7160e01b5f52601260045260245ffd5b5f826136b0576136b061368e565b500490565b5f604082018483526020604060208501528185518084526060860191506020870193505f5b818110156136f6578451835293830193918301916001016136da565b5090979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061373590830184612df2565b9695505050505050565b5f815461374b816131f3565b600182811680156137635760018114613778576137a4565b60ff19841687528215158302870194506137a4565b855f526020805f205f5b8581101561379b5781548a820152908401908201613782565b50505082870194505b5050505092915050565b5f6137b9828661373f565b84516137c9818360208901612dd0565b6137d58183018661373f565b979650505050505050565b5f826137ee576137ee61368e565b500690565b5f60018201613804576138046134f4565b5060010190565b60ff8181168382160190811115610964576109646134f4565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220e68db4566750c8448bec0263df669a89d4d5586467cae4dc16b0731ab2ffe71664736f6c63430008180033
Deployed Bytecode
0x6080604052600436106102a5575f3560e01c80636bcef9a61161016f578063a9059cbb116100d8578063d5abeb0111610092578063e8e81fe41161006d578063e8e81fe414610856578063e985e9c514610875578063f835ab0014610894578063ff0d2c26146104c9575f80fd5b8063d5abeb01146107ea578063dd62ed3e146107fe578063e8a3d48514610842575f80fd5b8063a9059cbb14610745578063b3720c3414610764578063b88d4fde14610784578063bb74e1ae14610797578063c87b56dd146107b6578063caf0dcc2146107d5575f80fd5b806391cca3db1161012957806391cca3db1461069a578063938e3d7b146106c057806395d89b41146106df578063983d95ce146106f3578063a22cb46514610706578063a563833b14610725575f80fd5b80636bcef9a6146105d45780636c0360eb146105e857806370a08231146105fc5780637e2285aa146106305780638462151c1461064f57806388a8c95c1461067b575f80fd5b80633ccfd60b116102115780634ee2c4ce116101cb5780634ee2c4ce1461050f5780634f02c4201461052457806355f804b314610543578063598b8e71146105625780636352211e146105815780636a21f8e1146105b5575f80fd5b80633ccfd60b1461048157806342842e0e14610497578063439fab91146104aa578063466c35fc146104c957806346904840146104dc57806347ecb665146104fb575f80fd5b806318160ddd1161026257806318160ddd146103d95780631a72b87d146103ed57806323b872dd146104245780632d5537b0146104435780632ff3a24214610457578063313ce5671461046d575f80fd5b806301ffc9a7146102a957806306fdde03146102dd578063081812fc146102fe578063095ea7b3146103355780630e313e9814610354578063150b7a0214610396575b5f80fd5b3480156102b4575f80fd5b506102c86102c3366004612db5565b6108cd565b60405190151581526020015b60405180910390f35b3480156102e8575f80fd5b506102f161096a565b6040516102d49190612e1d565b348015610309575f80fd5b5061031d610318366004612e2f565b6109fa565b6040516001600160a01b0390911681526020016102d4565b348015610340575f80fd5b506102c861034f366004612e5a565b610a34565b34801561035f575f80fd5b5061038861036e366004612e84565b6001600160a01b03165f9081526011602052604090205490565b6040519081526020016102d4565b3480156103a1575f80fd5b506103c06103b0366004612f62565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016102d4565b3480156103e4575f80fd5b50600854610388565b3480156103f8575f80fd5b5061040c610407366004612e5a565b610b42565b6040516001600160401b0390911681526020016102d4565b34801561042f575f80fd5b506102c861043e366004612fc9565b610b89565b34801561044e575f80fd5b506102f1610c40565b348015610462575f80fd5b5061031d6205e7ec81565b348015610478575f80fd5b50600654610388565b34801561048c575f80fd5b50610495610ccc565b005b6104956104a5366004612fc9565b610d63565b3480156104b5575f80fd5b5061031d6104c4366004613007565b610ea2565b3480156104d4575f80fd5b5061031d5f81565b3480156104e7575f80fd5b5060165461031d906001600160a01b031681565b348015610506575f80fd5b506102f16113a2565b34801561051a575f80fd5b5061038860175481565b34801561052f575f80fd5b50600b5461040c906001600160401b031681565b34801561054e575f80fd5b5061049561055d366004613038565b6113af565b34801561056d575f80fd5b5061049561057c36600461307c565b6113ef565b34801561058c575f80fd5b5061031d61059b366004612e2f565b600e6020525f90815260409020546001600160a01b031681565b3480156105c0575f80fd5b506104956105cf366004613129565b611880565b3480156105df575f80fd5b506104956118cf565b3480156105f3575f80fd5b506102f1611921565b348015610607575f80fd5b50610388610616366004612e84565b6001600160a01b03165f9081526010602052604090205490565b34801561063b575f80fd5b5061049561064a366004613038565b61192d565b34801561065a575f80fd5b5061066e610669366004612e84565b61196a565b6040516102d49190613144565b348015610686575f80fd5b50610495610695366004612e84565b611a04565b3480156106a5575f80fd5b50600b5461031d90600160401b90046001600160a01b031681565b3480156106cb575f80fd5b506104956106da366004613038565b611a66565b3480156106ea575f80fd5b506102f1611acf565b61049561070136600461307c565b611ade565b348015610711575f80fd5b50610495610720366004613190565b611eb8565b348015610730575f80fd5b50600b546102c890600160e01b900460ff1681565b348015610750575f80fd5b506102c861075f366004612e5a565b611ef1565b34801561076f575f80fd5b50600b546102c890600160e81b900460ff1681565b610495610792366004612f62565b611f3b565b3480156107a2575f80fd5b5060145461031d906001600160a01b031681565b3480156107c1575f80fd5b506102f16107d0366004612e2f565b612068565b3480156107e0575f80fd5b5061038860155481565b3480156107f5575f80fd5b50610388612117565b348015610809575f80fd5b506103886108183660046131c7565b6001600160a01b039182165f908152600d6020908152604080832093909416825291909152205490565b34801561084d575f80fd5b506102f161212d565b348015610861575f80fd5b50610495610870366004613038565b61213c565b348015610880575f80fd5b506102c861088f3660046131c7565b612179565b34801561089f575f80fd5b506104956108ae366004613129565b335f908152601360205260409020805460ff1916911515919091179055565b600b545f90600160e01b900460ff1680156108f857506380ac58cd60e01b6001600160e01b03198316145b8061091357506301ffc9a760e01b6001600160e01b03198316145b8061092e57506336372b0760e01b6001600160e01b03198316145b806109495750630a85bd0160e11b6001600160e01b03198316145b806109645750635a46575f60e01b6001600160e01b03198316145b92915050565b606060048054610979906131f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109a5906131f3565b80156109f05780601f106109c7576101008083540402835291602001916109f0565b820191905f5260205f20905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b5f818152600e60205260408120546001600160a01b0316610a19575f80fd5b505f908152600f60205260409020546001600160a01b031690565b5f6009548210158015610a495750600a548211155b15610b09575f828152600e60205260409020546001600160a01b0316338114801590610a7c5750610a7a8133612179565b155b15610ace5760405162461bcd60e51b815260206004820152601a60248201527f453734313a20596f7520617265206e6f7420617070726f76656400000000000060448201526064015b60405180910390fd5b5f838152600f6020526040902080546001600160a01b0319166001600160a01b038616179055610aff8185856121a6565b6001915050610964565b335f818152600d602090815260408083206001600160a01b03881684529091529020839055610b399084846121ec565b50600192915050565b6011602052815f5260405f208181548110610b5b575f80fd5b905f5260205f209060049182820401919006600802915091509054906101000a90046001600160401b031681565b5f6009548210158015610b9e5750600a548211155b15610c1f57336001600160a01b0385161480610bd35750610bbe826109fa565b6001600160a01b0316336001600160a01b0316145b80610be35750610be38433612179565b610bff5760405162461bcd60e51b8152600401610ac59061322b565b610c0a84848461223e565b610c17848460095461230c565b506001610c39565b610c2a843384612360565b610c35848484612414565b5060015b9392505050565b60028054610c4d906131f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c79906131f3565b8015610cc45780601f10610c9b57610100808354040283529160200191610cc4565b820191905f5260205f20905b815481529060010190602001808311610ca757829003601f168201915b505050505081565b600b54600160401b90046001600160a01b03163314610cfd5760405162461bcd60e51b8152600401610ac590613262565b600b546040515f91600160401b90046001600160a01b03169047908381818185875af1925050503d805f8114610d4e576040519150601f19603f3d011682016040523d82523d5f602084013e610d53565b606091505b5050905080610d60575f80fd5b50565b336001600160a01b0384161480610d935750610d7e816109fa565b6001600160a01b0316336001600160a01b0316145b80610da35750610da38333612179565b610dbf5760405162461bcd60e51b8152600401610ac59061322b565b610dca83838361223e565b610dd7838360095461230c565b6001600160a01b0382163b15801590610e7f5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e72919061328d565b6001600160e01b03191614155b15610e9d576040516301d6c93560e61b815260040160405180910390fd5b505050565b5f6006545f14610eea5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610ac5565b60608083806020019051810190610f0191906132f5565b6015819055600782905560175f60148160068180806001610f228c8261341a565b50610f2f90508b8261341a565b508a91905055899d508a9e508b91906101000a8154816001600160a01b0302191690836001600160a01b031602179055508a919050555050505050505050508160049081610f7d919061341a565b506005610f8a828261341a565b50506014546001600160a01b0316905080610fde5760405162461bcd60e51b81526020600482015260146024820152734537343156313a205a45524f5f4144445245535360601b6044820152606401610ac5565b6040516301ffc9a760e01b8152635a46575f60e01b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015611045575060408051601f3d908101601f19168201909252611042918101906134d9565b60015b6110a65760405162461bcd60e51b815260206004820152602c60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526b70706f72742045524331363560a01b6064820152608401610ac5565b6001600160a01b03821673382edfe4c6168858c81893fe00fcb7b68914d92914806110ce5750805b61112d5760405162461bcd60e51b815260206004820152602a60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526970706f7274206537343160b01b6064820152608401610ac5565b505060065461113d90600a6135d9565b600981905560075460019161115291906135e4565b61115c91906135f7565b600a5560095461116e9060019061360a565b600b80546001600160401b039290921667ffffffffffffffff19909216919091179055601680546001600160a01b0319163317905560065460121080159061122057506014546040805163313ce56760e01b815290516012926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156111f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121d9190613631565b11155b6112605760405162461bcd60e51b8152602060048201526011602482015270546f6f206d616e7920646563696d616c7360781b6044820152606401610ac5565b5f600754116112a75760405162461bcd60e51b81526020600482015260136024820152721399595908185d081b19585cdd080c481b999d606a1b6044820152606401610ac5565b600560175410156112ee5760405162461bcd60e51b81526020600482015260116024820152704d696e2066656573206f6620302e30352560781b6044820152606401610ac5565b603260175411156113345760405162461bcd60e51b815260206004820152601060248201526f4d61782066656573206f6620302e352560801b6044820152606401610ac5565b600754600954116113915760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820646563696d616c7320666f72204e465420636f756e6044820152601d60fa1b6064820152608401610ac5565b50506014546001600160a01b031690565b60038054610c4d906131f3565b600b54600160401b90046001600160a01b031633146113e05760405162461bcd60e51b8152600401610ac590613262565b5f6113eb828261341a565b5050565b80516014546040805163313ce56760e01b815290515f9283926001600160a01b039091169163313ce567916004808201926020929091908290030181865afa15801561143d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114619190613631565b61146c90600a6135d9565b90508260010361161957601454845133916001600160a01b031690636352211e9087905f9061149d5761149d613648565b60200260200101516040518263ffffffff1660e01b81526004016114c391815260200190565b602060405180830381865afa1580156114de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611502919061365c565b6001600160a01b03161461154b57601554600954855f8151811061152857611528613648565b602002602001015161153a9190613677565b61154491906136a2565b9150611568565b60155460095461155b9083613677565b61156591906136a2565b91505b60145484516001600160a01b03909116906323b872dd903390309088905f9061159357611593613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303815f875af11580156115ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161391906134d9565b506116f1565b5f5b838110156116c95760145485516001600160a01b03909116906342842e0e903390309089908690811061165057611650613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015f604051808303815f87803b1580156116a7575f80fd5b505af11580156116b9573d5f803e3d5ffd5b50506001909201915061161b9050565b506015546009546116da8386613677565b6116e49190613677565b6116ee91906136a2565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01805484929061172b9084906135e4565b925050819055508160085f82825461174391906135e4565b9091555061175490505f3384612414565b6014546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117be9190613631565b6007546015546117ce9190613677565b10156118375760405162461bcd60e51b815260206004820152603260248201527f4e465420636170616369747920726561636865642c207761697420666f7220736044820152716f6d656f6e6520746f20776974686472617760701b6064820152608401610ac5565b336001600160a01b03167fe7425730072f5a6ec278ae24c998f6a79299c875cbd84ad35585563a0cb3c66683866040516118729291906136b5565b60405180910390a250505050565b600b54600160401b90046001600160a01b031633146118b15760405162461bcd60e51b8152600401610ac590613262565b600b8054911515600160e81b0260ff60e81b19909216919091179055565b600b54600160401b90046001600160a01b031633146119005760405162461bcd60e51b8152600401610ac590613262565b600b805460ff60e01b198116600160e01b9182900460ff1615909102179055565b5f8054610c4d906131f3565b600b54600160401b90046001600160a01b0316331461195e5760405162461bcd60e51b8152600401610ac590613262565b60026113eb828261341a565b6001600160a01b0381165f908152601160209081526040918290208054835181840281018401909452808452606093928301828280156119f857602002820191905f5260205f20905f905b82829054906101000a90046001600160401b03166001600160401b0316815260200190600801906020826007010492830192600103820291508084116119b55790505b50505050509050919050565b600b54600160401b90046001600160a01b03163314611a355760405162461bcd60e51b8152600401610ac590613262565b600b80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b600b54600160401b90046001600160a01b03163314611a975760405162461bcd60e51b8152600401610ac590613262565b6001611aa3828261341a565b506040517fa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad962905f90a150565b606060058054610979906131f3565b805180611b2d5760405162461bcd60e51b815260206004820152601a60248201527f547279696e6720746f207769746864726177206e6f7468696e670000000000006044820152606401610ac5565b5f805f60145f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba49190613631565b611baf90600a6135d9565b905083600103611c1857845f81518110611bcb57611bcb613648565b6020908102919091018101515f818152600e909252604090912054909350336001600160a01b0390911603611c04576009549150611c08565b8291505b611c125f84611ef1565b50611cd8565b5f5b84811015611cc757858181518110611c3457611c34613648565b6020908102919091018101515f818152600e9092526040909120549094506001600160a01b03163314611cb45760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920776974686472617720666f72206e66747320796f75206f6044820152613bb760f11b6064820152608401610ac5565b611cbe5f85611ef1565b50600101611c1a565b50600954611cd59085613677565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb018054849290611d129084906135f7565b925050819055508160085f828254611d2a91906135f7565b90915550506009546015545f9190611d429085613677565b611d4c91906136a2565b90505f60185460175483611d609190613677565b611d6a91906136a2565b60145460165460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611dbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de291906134d9565b506014546001600160a01b031663a9059cbb33611dff84866135f7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6b91906134d9565b50336001600160a01b03167f2384392c42d82ed11db876875a09153a0d3585ff3fc7b9dc12393a232e46b2cf8389604051611ea79291906136b5565b60405180910390a250505050505050565b335f818152600c602090815260408083206001600160a01b03871684529091529020805460ff19168315151790556113eb908383612706565b5f818152600e6020526040812054336001600160a01b0390911603611f3057611f1b33848461223e565b611f28338460095461230c565b506001610964565b610b39338484612414565b336001600160a01b0385161480611f6b5750611f56826109fa565b6001600160a01b0316336001600160a01b0316145b80611f7b5750611f7b8433612179565b611f975760405162461bcd60e51b8152600401610ac59061322b565b611fa284848461223e565b611faf848460095461230c565b6001600160a01b0383163b158015906120445750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290611ff7903390899088908890600401613703565b6020604051808303815f875af1158015612013573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612037919061328d565b6001600160e01b03191614155b15612062576040516301d6c93560e61b815260040160405180910390fd5b50505050565b6060600a548211156120af5760405162461bcd60e51b815260206004820152601060248201526f114dcd0c4e881a5b9d985b1a59081a5960821b6044820152606401610ac5565b5f80546120bb906131f3565b90505f036120d657505060408051602081019091525f815290565b5f6120ed600954846120e891906135f7565b61274d565b6002604051602001612101939291906137ae565b6040516020818303038152906040529050919050565b5f6009546007546121289190613677565b905090565b606060018054610979906131f3565b600b54600160401b90046001600160a01b0316331461216d5760405162461bcd60e51b8152600401610ac590613262565b60036113eb828261341a565b6001600160a01b039182165f908152600c6020908152604080832093909416825291909152205460ff1690565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161223191815260200190565b60405180910390a3505050565b6001600160401b0381165f908152600e60205260409020546001600160a01b038481169116146122a85760405162461bcd60e51b8152602060048201526015602482015274229b9a189d1024b731b7b93932b1ba1037bbb732b960591b6044820152606401610ac5565b6001600160401b0381165f908152600f6020908152604080832080546001600160a01b0319908116909155600e90925290912080549091166001600160a01b0384161790556122f8838383612851565b610e9d8383836001600160401b0316612a07565b6001600160a01b0383165f90815260106020526040812080548392906123339084906135f7565b90915550506001600160a01b0382165f908152601060205260409020805482019055610e9d838383612a4d565b6001600160a01b038084165f908152600d60209081526040808320938616835292905220548111156123d45760405162461bcd60e51b815260206004820152601c60248201527f453734313a20696e73756666696369656e7420616c6c6f77616e6365000000006044820152606401610ac5565b6001600160a01b038084165f908152600d602090815260408083209386168352929052908120805483929061240a9084906135f7565b9091555050505050565b6001600160a01b0383165f908152601060205260409020548111156124895760405162461bcd60e51b815260206004820152602560248201527f453734313a207472616e7366657220616d6f756e7420657863656564732062616044820152646c616e636560d81b6064820152608401610ac5565b6009546001600160a01b0384165f9081526010602052604081205490916124af916137e0565b6009546001600160a01b0385165f90815260106020526040812054929350916124d891906137e0565b90506124e585858561230c565b6009546001600160a01b0386165f90815260106020526040812054909161250b916137e0565b6009546001600160a01b0387165f908152601060205260408120549293509161253491906137e0565b6001600160a01b0388165f9081526011602052604081206205e7ec9091529091507f1b6e7c417ed9cfc24ca11cc87b3bdb69a80c713b279159d52af44c081e616a17838610156125935781541561259357612593896205e7ec84612a92565b828511156125c0578054156125b5576125b06205e7ec8983612a92565b6125c0565b6125be88612be2565b505b5f600954886125cf91906136a2565b8354600b5491925090600160e81b900460ff16806125f457506001600160a01b038b16155b8061261657506001600160a01b038a165f9081526013602052604090205460ff165b8061263857506001600160a01b038b165f9081526013602052604090205460ff165b806126575750600b546001600160a01b038c8116600160401b90920416145b1561266e57808210612669578061266b565b815b91505b81156126f9578082106126815780612683565b815b90505f5b818110156126a25761269a8c8c87612a92565b600101612687565b506126ad81836135f7565b835490925090508082106126c157806126c3565b815b90505f5b818110156126e5576126dd6205e7ec8c86612a92565b6001016126c7565b506126f98a6126f483856135f7565b612c8f565b5050505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612231911515815260200190565b6060815f036127735750506040805180820190915260018152600360fc1b602082015290565b815f5b811561279c5780612786816137f3565b91506127959050600a836136a2565b9150612776565b5f816001600160401b038111156127b5576127b5612e9f565b6040519080825280601f01601f1916602001820160405280156127df576020820181803683370190505b5090505b8415612849576127f46001836135f7565b9150612801600a866137e0565b61280c90603061380b565b60f81b81838151811061282157612821613648565b60200101906001600160f81b03191690815f1a905350612842600a866136a2565b94506127e3565b949350505050565b6001600160401b0381165f908152601260209081526040808320546001600160a01b03871684526011909252822080549192909190826128926001846135f7565b815481106128a2576128a2613648565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b03169050808385815481106128de576128de613648565b905f5260205f2090600491828204019190066008026101000a8154816001600160401b0302191690836001600160401b031602179055508280548061292557612925613824565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a0219169055905561295f6001836135f7565b1561297f576001600160401b0381165f9081526012602052604090208490555b6001600160a01b0386165f81815260116020908152604082208054600180820183558285529284206004820401805460039092166008026101000a6001600160401b0381810219909316928c16029190911790559290915290546129e391906135f7565b6001600160401b039095165f90815260126020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161223191815260200190565b80545f908290612aa4906001906135f7565b81548110612ab457612ab4613648565b5f918252602080832060048304015460039092166008026101000a9091046001600160401b0316808352600f8252604080842080546001600160a01b0319908116909155600e90935290922080549091166001600160a01b0386161790558254909150829080612b2657612b26613824565b5f828152602080822060045f1990940184810490910180546001600160401b0360086003808616820261010090810a840219909416909455939097556001600160a01b038a16808652601185526040862080546001818101835582895296882098810490980180548b8b169990951690950290920a968702969097021990911694909417905592905254612bba91906135f7565b6001600160401b0382165f818152601260205260409020919091556120629085908590612a07565b600b805467ffffffffffffffff19811660016001600160401b03928316810183169182179093555f818152600e6020908152604080832080546001600160a01b0319166001600160a01b03891690811790915583526011808352818420805486865260128552928520839055908352958101865594825281206004850401805460039095166008026101000a9384021990941692820292909217909255612c8a908383612a07565b919050565b805f03612c9a575050565b80600103612cab57610e9d82612be2565b600b546001600160a01b0383165f908152601160205260408120546001600160401b0390921691905b83811015612d735760019283016001600160401b038181165f818152600e6020908152604080832080546001600160a01b0319166001600160a01b038d1690811790915560128352818420899055835260118252822080549889018155825281206004880401805460039098166008026101000a93840219909716928202929092179095559093612d6791908790612a07565b60019182019101612cd4565b5050600b805467ffffffffffffffff1981166001600160401b039182169490940116929092179091555050565b6001600160e01b031981168114610d60575f80fd5b5f60208284031215612dc5575f80fd5b8135610c3981612da0565b5f5b83811015612dea578181015183820152602001612dd2565b50505f910152565b5f8151808452612e09816020860160208601612dd0565b601f01601f19169290920160200192915050565b602081525f610c396020830184612df2565b5f60208284031215612e3f575f80fd5b5035919050565b6001600160a01b0381168114610d60575f80fd5b5f8060408385031215612e6b575f80fd5b8235612e7681612e46565b946020939093013593505050565b5f60208284031215612e94575f80fd5b8135610c3981612e46565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715612edb57612edb612e9f565b604052919050565b5f6001600160401b03821115612efb57612efb612e9f565b50601f01601f191660200190565b5f612f1b612f1684612ee3565b612eb3565b9050828152838383011115612f2e575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112612f53575f80fd5b610c3983833560208501612f09565b5f805f8060808587031215612f75575f80fd5b8435612f8081612e46565b93506020850135612f9081612e46565b92506040850135915060608501356001600160401b03811115612fb1575f80fd5b612fbd87828801612f44565b91505092959194509250565b5f805f60608486031215612fdb575f80fd5b8335612fe681612e46565b92506020840135612ff681612e46565b929592945050506040919091013590565b5f60208284031215613017575f80fd5b81356001600160401b0381111561302c575f80fd5b61284984828501612f44565b5f60208284031215613048575f80fd5b81356001600160401b0381111561305d575f80fd5b8201601f8101841361306d575f80fd5b61284984823560208401612f09565b5f602080838503121561308d575f80fd5b82356001600160401b03808211156130a3575f80fd5b818501915085601f8301126130b6575f80fd5b8135818111156130c8576130c8612e9f565b8060051b91506130d9848301612eb3565b81815291830184019184810190888411156130f2575f80fd5b938501935b83851015613110578435825293850193908501906130f7565b98975050505050505050565b8015158114610d60575f80fd5b5f60208284031215613139575f80fd5b8135610c398161311c565b602080825282518282018190525f9190848201906040850190845b818110156131845783516001600160401b03168352928401929184019160010161315f565b50909695505050505050565b5f80604083850312156131a1575f80fd5b82356131ac81612e46565b915060208301356131bc8161311c565b809150509250929050565b5f80604083850312156131d8575f80fd5b82356131e381612e46565b915060208301356131bc81612e46565b600181811c9082168061320757607f821691505b60208210810361322557634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252601e908201527f453734313a20596f7520646f6e27742068617665207468652072696768740000604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f6020828403121561329d575f80fd5b8151610c3981612da0565b8051612c8a81612e46565b5f82601f8301126132c2575f80fd5b81516132d0612f1682612ee3565b8181528460208386010111156132e4575f80fd5b612849826020830160208701612dd0565b5f805f805f805f805f6101208a8c03121561330e575f80fd5b8951985061331e60208b016132a8565b975060408a01516001600160401b0380821115613339575f80fd5b6133458d838e016132b3565b985060608c015191508082111561335a575f80fd5b6133668d838e016132b3565b975060808c0151965060a08c0151915080821115613382575f80fd5b61338e8d838e016132b3565b955060c08c01519150808211156133a3575f80fd5b506133b08c828d016132b3565b93505060e08a015191506101008a015190509295985092959850929598565b601f821115610e9d57805f5260205f20601f840160051c810160208510156133f45750805b601f840160051c820191505b81811015613413575f8155600101613400565b5050505050565b81516001600160401b0381111561343357613433612e9f565b6134478161344184546131f3565b846133cf565b602080601f83116001811461347a575f84156134635750858301515b5f19600386901b1c1916600185901b1785556134d1565b5f85815260208120601f198616915b828110156134a857888601518255948401946001909101908401613489565b50858210156134c557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156134e9575f80fd5b8151610c398161311c565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561354257815f1904821115613528576135286134f4565b8085161561353557918102915b93841c939080029061350d565b509250929050565b5f8261355857506001610964565b8161356457505f610964565b8160018114610aff57600281036135915760ff841115613586576135866134f4565b50506001821b610964565b5060208310610133831016604e8410600b84101617156135b4575081810a610964565b6135be8383613508565b805f19048211156135d1576135d16134f4565b029392505050565b5f610c39838361354a565b80820180821115610964576109646134f4565b81810381811115610964576109646134f4565b6001600160401b0382811682821603908082111561362a5761362a6134f4565b5092915050565b5f60208284031215613641575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561366c575f80fd5b8151610c3981612e46565b8082028115828204841417610964576109646134f4565b634e487b7160e01b5f52601260045260245ffd5b5f826136b0576136b061368e565b500490565b5f604082018483526020604060208501528185518084526060860191506020870193505f5b818110156136f6578451835293830193918301916001016136da565b5090979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061373590830184612df2565b9695505050505050565b5f815461374b816131f3565b600182811680156137635760018114613778576137a4565b60ff19841687528215158302870194506137a4565b855f526020805f205f5b8581101561379b5781548a820152908401908201613782565b50505082870194505b5050505092915050565b5f6137b9828661373f565b84516137c9818360208901612dd0565b6137d58183018661373f565b979650505050505050565b5f826137ee576137ee61368e565b500690565b5f60018201613804576138046134f4565b5060010190565b60ff8181168382160190811115610964576109646134f4565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220e68db4566750c8448bec0263df669a89d4d5586467cae4dc16b0731ab2ffe71664736f6c63430008180033
Deployed Bytecode Sourcemap
28539:5871:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27707:795;;;;;;;;;;-1:-1:-1;27707:795:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27707:795:0;;;;;;;;11357:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26277:180::-;;;;;;;;;;-1:-1:-1;26277:180:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;26277:180:0;1533:203:1;13631:997:0;;;;;;;;;;-1:-1:-1;13631:997:0;;;;;:::i;:::-;;:::i;13171:101::-;;;;;;;;;;-1:-1:-1;13171:101:0;;;;;:::i;:::-;-1:-1:-1;;;;;13245:18:0;13231:4;13245:18;;;:9;:18;;;;;:25;;13171:101;;;;2595:25:1;;;2583:2;2568:18;13171:101:0;2449:177:1;9354:172:0;;;;;;;;;;-1:-1:-1;9354:172:0;;;;;:::i;:::-;-1:-1:-1;;;9354:172:0;;;;;;;;;;-1:-1:-1;;;;;;4632:33:1;;;4614:52;;4602:2;4587:18;9354:172:0;4470:202:1;11609:82:0;;;;;;;;;;-1:-1:-1;11676:12:0;;11609:82;;10678:45;;;;;;;;;;-1:-1:-1;10678:45:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4839:31:1;;;4821:50;;4809:2;4794:18;10678:45:0;4677:200:1;23839:817:0;;;;;;;;;;-1:-1:-1;23839:817:0;;;;;:::i;:::-;;:::i;9860:23::-;;;;;;;;;;;;;:::i;9612:57::-;;;;;;;;;;;;9661:7;9612:57;;11527:76;;;;;;;;;;-1:-1:-1;11591:9:0;;11527:76;;27538:161;;;;;;;;;;;;;:::i;:::-;;24679:654;;;;;;:::i;:::-;;:::i;29139:1769::-;;;;;;;;;;-1:-1:-1;29139:1769:0;;;;;:::i;:::-;;:::i;9737:51::-;;;;;;;;;;;;9784:3;9737:51;;28914:27;;;;;;;;;;-1:-1:-1;28914:27:0;;;;-1:-1:-1;;;;;28914:27:0;;;9890:22;;;;;;;;;;;;;:::i;28948:26::-;;;;;;;;;;;;;;;;10193:20;;;;;;;;;;-1:-1:-1;10193:20:0;;;;-1:-1:-1;;;;;10193:20:0;;;12027:93;;;;;;;;;;-1:-1:-1;12027:93:0;;;;;:::i;:::-;;:::i;30958:1671::-;;;;;;;;;;-1:-1:-1;30958:1671:0;;;;;:::i;:::-;;:::i;10514:50::-;;;;;;;;;;-1:-1:-1;10514:50:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;10514:50:0;;;13373:134;;;;;;;;;;-1:-1:-1;13373:134:0;;;;;:::i;:::-;;:::i;12957:101::-;;;;;;;;;;;;;:::i;9797:21::-;;;;;;;;;;;;;:::i;11786:104::-;;;;;;;;;;-1:-1:-1;11786:104:0;;;;;:::i;:::-;-1:-1:-1;;;;;11868:19:0;11853:4;11868:19;;;:10;:19;;;;;;;11786:104;12286:109;;;;;;;;;;-1:-1:-1;12286:109:0;;;;;:::i;:::-;;:::i;13064:101::-;;;;;;;;;;-1:-1:-1;13064:101:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12503:75::-;;;;;;;;;;-1:-1:-1;12503:75:0;;;;;:::i;:::-;;:::i;10255:18::-;;;;;;;;;;-1:-1:-1;10255:18:0;;;;-1:-1:-1;;;10255:18:0;;-1:-1:-1;;;;;10255:18:0;;;12126:154;;;;;;;;;;-1:-1:-1;12126:154:0;;;;;:::i;:::-;;:::i;11440:81::-;;;;;;;;;;;;;:::i;32716:1691::-;;;;;;:::i;:::-;;:::i;26465:216::-;;;;;;;;;;-1:-1:-1;26465:216:0;;;;;:::i;:::-;;:::i;10280:32::-;;;;;;;;;;-1:-1:-1;10280:32:0;;;;-1:-1:-1;;;10280:32:0;;;;;;23457:339;;;;;;;;;;-1:-1:-1;23457:339:0;;;;;:::i;:::-;;:::i;10319:37::-;;;;;;;;;;-1:-1:-1;10319:37:0;;;;-1:-1:-1;;;10319:37:0;;;;;;25356:675;;;;;;:::i;:::-;;:::i;28839:28::-;;;;;;;;;;-1:-1:-1;28839:28:0;;;;-1:-1:-1;;;;;28839:28:0;;;26853:284;;;;;;;;;;-1:-1:-1;26853:284:0;;;;;:::i;:::-;;:::i;28874:31::-;;;;;;;;;;;;;;;;11697:83;;;;;;;;;;;;;:::i;11896:125::-;;;;;;;;;;-1:-1:-1;11896:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;11992:17:0;;;11977:4;11992:17;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;11896:125;13278:89;;;;;;;;;;;;;:::i;12401:96::-;;;;;;;;;;-1:-1:-1;12401:96:0;;;;;:::i;:::-;;:::i;26689:156::-;;;;;;;;;;-1:-1:-1;26689:156:0;;;;;:::i;:::-;;:::i;13514:109::-;;;;;;;;;;-1:-1:-1;13514:109:0;;;;;:::i;:::-;13592:10;13576:27;;;;:15;:27;;;;;:44;;-1:-1:-1;;13576:44:0;;;;;;;;;;13514:109;27707:795;28078:20;;27784:4;;-1:-1:-1;;;28078:20:0;;;;:49;;;;-1:-1:-1;;;;;;;;;;28102:25:0;;;28078:49;28077:127;;;-1:-1:-1;;;;;;;;;;28179:25:0;;;28077:127;:203;;;-1:-1:-1;;;;;;;;;;28255:25:0;;;28077:203;:278;;;-1:-1:-1;;;;;;;;;;28330:25:0;;;28077:278;:368;;;-1:-1:-1;;;;;;;;;;28420:25:0;;;28077:368;27801:644;27707:795;-1:-1:-1;;27707:795:0:o;11357:77::-;11402:13;11426:5;11419:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11357:77;:::o;26277:180::-;26345:7;26369:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26369:16:0;26365:44;;26401:8;;;26365:44;-1:-1:-1;26427:22:0;;;;:13;:22;;;;;;-1:-1:-1;;;;;26427:22:0;;26277:180::o;13631:997::-;13703:4;13873:3;;13863:6;:13;;:32;;;;;13890:5;;13880:6;:15;;13863:32;13860:449;;;13912:13;13928:15;;;:7;:15;;;;;;-1:-1:-1;;;;;13928:15:0;14018:10;:19;;;;;:59;;;14042:35;14059:5;14066:10;14042:16;:35::i;:::-;14041:36;14018:59;14014:101;;;14079:36;;-1:-1:-1;;;14079:36:0;;9470:2:1;14079:36:0;;;9452:21:1;9509:2;9489:18;;;9482:30;9548:28;9528:18;;;9521:56;9594:18;;14079:36:0;;;;;;;;14014:101;14130:21;;;;:13;:21;;;;;:31;;-1:-1:-1;;;;;;14130:31:0;-1:-1:-1;;;;;14130:31:0;;;;;14226:45;14248:5;14130:31;:21;14226;:45::i;:::-;14293:4;14286:11;;;;;13860:449;14509:10;14498:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;14498:31:0;;;;;;;;;:40;;;14549:49;;14521:7;14532:6;14549:20;:49::i;:::-;-1:-1:-1;14616:4:0;13631:997;;;;:::o;10678:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10678:45:0;;:::o;23839:817::-;23925:4;24054:3;;24044:6;:13;;:32;;;;;24071:5;;24061:6;:15;;24044:32;24041:489;;;24233:10;-1:-1:-1;;;;;24233:18:0;;;;:55;;;24269:19;24281:6;24269:11;:19::i;:::-;-1:-1:-1;;;;;24255:33:0;:10;-1:-1:-1;;;;;24255:33:0;;24233:55;:93;;;;24292:34;24309:4;24315:10;24292:16;:34::i;:::-;24093:303;;;;-1:-1:-1;;;24093:303:0;;;;;;;:::i;:::-;24413:38;24426:4;24432:2;24443:6;24413:12;:38::i;:::-;24466:26;24478:4;24484:2;24488:3;;24466:11;:26::i;:::-;-1:-1:-1;24514:4:0;24507:11;;24041:489;24542:41;24558:4;24564:10;24576:6;24542:15;:41::i;:::-;24594:30;24607:4;24613:2;24617:6;24594:12;:30::i;:::-;-1:-1:-1;24642:4:0;23839:817;;;;;;:::o;9860:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27538:161::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;27621:3:::1;::::0;27613:51:::1;::::0;27596:12:::1;::::0;-1:-1:-1;;;27621:3:0;::::1;-1:-1:-1::0;;;;;27621:3:0::1;::::0;27638:21:::1;::::0;27596:12;27613:51;27596:12;27613:51;27638:21;27621:3;27613:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27595:69;;;27683:7;27675:16;;;::::0;::::1;;27584:115;27538:161::o:0;24679:654::-;24809:10;-1:-1:-1;;;;;24809:18:0;;;;:56;;;24845:20;24857:7;24845:11;:20::i;:::-;-1:-1:-1;;;;;24831:34:0;:10;-1:-1:-1;;;;;24831:34:0;;24809:56;:94;;;;24869:34;24886:4;24892:10;24869:16;:34::i;:::-;24783:186;;;;-1:-1:-1;;;24783:186:0;;;;;;;:::i;:::-;24980:39;24993:4;24999:2;25010:7;24980:12;:39::i;:::-;25031:26;25043:4;25049:2;25053:3;;25031:11;:26::i;:::-;-1:-1:-1;;;;;25088:14:0;;;:19;;;;:171;;-1:-1:-1;25124:72:0;;-1:-1:-1;;;25124:72:0;;;25166:10;25124:72;;;10843:34:1;-1:-1:-1;;;;;10913:15:1;;;10893:18;;;10886:43;10945:18;;;10938:34;;;11008:3;10988:18;;;10981:31;-1:-1:-1;11028:19:1;;;11021:30;25213:46:0;;25124:41;;;;25213:46;;11068:19:1;;25124:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;25124:135:0;;;25088:171;25070:256;;;25293:21;;-1:-1:-1;;;25293:21:0;;;;;;;;;;;25070:256;24679:654;;;:::o;29139:1769::-;29224:7;29252:9;;29265:1;29252:14;29244:46;;;;-1:-1:-1;;;29244:46:0;;11554:2:1;29244:46:0;;;11536:21:1;11593:2;11573:18;;;11566:30;-1:-1:-1;;;11612:18:1;;;11605:49;11671:18;;29244:46:0;11352:343:1;29244:46:0;29373:24;29413:26;29609:17;29598:88;;;;;;;;;;;;:::i;:::-;29557:19;29454:232;;;29546:9;29454:232;;;29455:14;;29471:13;29455:14;29512:9;29455:14;;;29532:12;29454:232;;29532:12;29454:232;:::i;:::-;-1:-1:-1;29454:232:0;;-1:-1:-1;29454:232:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29454:232:0;;;;;-1:-1:-1;;;;;29454:232:0;;;;;;;;;;;;;;;;;;;;29711:10;29703:5;:18;;;;;;:::i;:::-;-1:-1:-1;29736:7:0;:22;29746:12;29736:7;:22;:::i;:::-;-1:-1:-1;;29814:13:0;;-1:-1:-1;;;;;29814:13:0;;-1:-1:-1;29814:13:0;29842:53;;;;-1:-1:-1;;;29842:53:0;;15996:2:1;29842:53:0;;;15978:21:1;16035:2;16015:18;;;16008:30;-1:-1:-1;;;16054:18:1;;;16047:50;16114:18;;29842:53:0;15794:344:1;29842:53:0;29914:45;;-1:-1:-1;;;29914:45:0;;-1:-1:-1;;;29914:45:0;;;16305:62:1;-1:-1:-1;;;;;29914:33:0;;;;;16278:18:1;;29914:45:0;;;;;;;;;;;;;;;;;;-1:-1:-1;29914:45:0;;;;;;;;-1:-1:-1;;29914:45:0;;;;;;;;;;;;:::i;:::-;;;29910:296;;30136:54;;-1:-1:-1;;;30136:54:0;;16830:2:1;30136:54:0;;;16812:21:1;16869:2;16849:18;;;16842:30;16908:34;16888:18;;;16881:62;-1:-1:-1;;;16959:18:1;;;16952:42;17011:19;;30136:54:0;16628:408:1;29910:296:0;-1:-1:-1;;;;;30014:18:0;;28790:42;30014:18;;:33;;;30036:11;30014:33;30006:88;;;;-1:-1:-1;;;30006:88:0;;17243:2:1;30006:88:0;;;17225:21:1;17282:2;17262:18;;;17255:30;17321:34;17301:18;;;17294:62;-1:-1:-1;;;17372:18:1;;;17365:40;17422:19;;30006:88:0;17041:406:1;30006:88:0;29960:150;-1:-1:-1;30241:9:0;;30235:15;;:2;:15;:::i;:::-;30229:3;:21;;;30275:9;;30287:1;;30269:15;;30275:9;30269:15;:::i;:::-;:19;;;;:::i;:::-;30261:5;:27;30315:3;;30308:15;;30322:1;;30308:15;:::i;:::-;30299:6;:24;;-1:-1:-1;;;;;30299:24:0;;;;-1:-1:-1;;30299:24:0;;;;;;;;;30387:12;:25;;-1:-1:-1;;;;;;30387:25:0;30402:10;30387:25;;;30505:9;;30518:2;-1:-1:-1;30505:15:0;;;:57;;-1:-1:-1;30531:13:0;;30524:32;;;-1:-1:-1;;;30524:32:0;;;;30560:2;;-1:-1:-1;;;;;30531:13:0;;30524:30;;:32;;;;;;;;;;;;;;30531:13;30524:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;30505:57;30497:87;;;;-1:-1:-1;;;30497:87:0;;19794:2:1;30497:87:0;;;19776:21:1;19833:2;19813:18;;;19806:30;-1:-1:-1;;;19852:18:1;;;19845:47;19909:18;;30497:87:0;19592:341:1;30497:87:0;30615:1;30603:9;;:13;30595:45;;;;-1:-1:-1;;;30595:45:0;;20140:2:1;30595:45:0;;;20122:21:1;20179:2;20159:18;;;20152:30;-1:-1:-1;;;20198:18:1;;;20191:49;20257:18;;30595:45:0;19938:343:1;30595:45:0;29067:1;30659:14;;:37;;30651:67;;;;-1:-1:-1;;;30651:67:0;;20488:2:1;30651:67:0;;;20470:21:1;20527:2;20507:18;;;20500:30;-1:-1:-1;;;20546:18:1;;;20539:47;20603:18;;30651:67:0;20286:341:1;30651:67:0;29120:2;30737:14;;:37;;30729:66;;;;-1:-1:-1;;;30729:66:0;;20834:2:1;30729:66:0;;;20816:21:1;20873:2;20853:18;;;20846:30;-1:-1:-1;;;20892:18:1;;;20885:46;20948:18;;30729:66:0;20632:340:1;30729:66:0;30820:9;;30814:3;;:15;30806:61;;;;-1:-1:-1;;;30806:61:0;;21179:2:1;30806:61:0;;;21161:21:1;21218:2;21198:18;;;21191:30;21257:34;21237:18;;;21230:62;-1:-1:-1;;;21308:18:1;;;21301:31;21349:19;;30806:61:0;20977:397:1;30806:61:0;-1:-1:-1;;30887:13:0;;-1:-1:-1;;;;;30887:13:0;;29139:1769::o;9890:22::-;;;;;;;:::i;12027:93::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12098:7:::1;:20;12108:10:::0;12098:7;:20:::1;:::i;:::-;;12027:93:::0;:::o;30958:1671::-;31053:20;;31148:13;;31141:32;;;-1:-1:-1;;;31141:32:0;;;;31041:9;;;;-1:-1:-1;;;;;31148:13:0;;;;31141:30;;:32;;;;;;;;;;;;;;;31148:13;31141:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31135:38;;:2;:38;:::i;:::-;31113:60;;31189:4;31197:1;31189:9;31186:869;;31224:13;;31247:16;;31268:10;;-1:-1:-1;;;;;31224:13:0;;31218:28;;31247:13;;31224;;31247:16;;;;:::i;:::-;;;;;;;31218:46;;;;;;;;;;;;;2595:25:1;;2583:2;2568:18;;2449:177;31218:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31218:60:0;;31215:316;;31369:19;;31362:3;;31343:13;31357:1;31343:16;;;;;;;;:::i;:::-;;;;;;;:22;;;;:::i;:::-;31342:46;;;;:::i;:::-;31326:62;;31215:316;;;31483:19;;31476:3;;31459:20;;:14;:20;:::i;:::-;31458:44;;;;:::i;:::-;31442:60;;31215:316;31632:13;;31687:16;;-1:-1:-1;;;;;31632:13:0;;;;31626:33;;31660:10;;31680:4;;31687:13;;31632;;31687:16;;;;:::i;:::-;;;;;;;;;;;31626:78;;-1:-1:-1;;;;;;31626:78:0;;;;;;;-1:-1:-1;;;;;22455:15:1;;;31626:78:0;;;22437:34:1;22507:15;;;;22487:18;;;22480:43;22539:18;;;22532:34;22372:18;;31626:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31186:869;;;31750:6;31746:214;31766:4;31762:1;:8;31746:214;;;31868:13;;31927:16;;-1:-1:-1;;;;;31868:13:0;;;;31862:37;;31900:10;;31920:4;;31927:13;;31941:1;;31927:16;;;;;;:::i;:::-;;;;;;;;;;;31862:82;;-1:-1:-1;;;;;;31862:82:0;;;;;;;-1:-1:-1;;;;;22455:15:1;;;31862:82:0;;;22437:34:1;22507:15;;;;22487:18;;;22480:43;22539:18;;;22532:34;22372:18;;31862:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31772:3:0;;;;;-1:-1:-1;31746:214:0;;-1:-1:-1;31746:214:0;;-1:-1:-1;32024:19:0;;32017:3;;31992:21;31999:14;31992:4;:21;:::i;:::-;31991:29;;;;:::i;:::-;31990:53;;;;:::i;:::-;31974:69;;31186:869;32094:27;;;;:10;:27;;;:44;;32125:13;;32094:27;:44;;32125:13;;32094:44;:::i;:::-;;;;;;;;32167:13;32151:12;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;32193:56:0;;-1:-1:-1;9726:3:0;32223:10;32235:13;32193:12;:56::i;:::-;32460:13;;32453:46;;-1:-1:-1;;;32453:46:0;;32493:4;32453:46;;;1679:51:1;-1:-1:-1;;;;;32460:13:0;;;;32453:31;;1652:18:1;;32453:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32439:9;;32417:19;;:31;;;;:::i;:::-;:82;;32409:145;;;;-1:-1:-1;;;32409:145:0;;22779:2:1;32409:145:0;;;22761:21:1;22818:2;22798:18;;;22791:30;22857:34;22837:18;;;22830:62;-1:-1:-1;;;22908:18:1;;;22901:48;22966:19;;32409:145:0;22577:414:1;32409:145:0;32580:10;-1:-1:-1;;;;;32572:49:0;;32592:13;32607;32572:49;;;;;;;:::i;:::-;;;;;;;;31028:1601;;;30958:1671;:::o;13373:134::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;13464:17:::1;:40:::0;;;::::1;;-1:-1:-1::0;;;13464:40:0::1;-1:-1:-1::0;;;;13464:40:0;;::::1;::::0;;;::::1;::::0;;13373:134::o;12957:101::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;13036:20:::1;::::0;;-1:-1:-1;;;;13012:44:0;::::1;-1:-1:-1::0;;;13036:20:0;;;::::1;;;13035:21;13012:44:::0;;::::1;;::::0;;12957:101::o;9797:21::-;;;;;;;:::i;12286:109::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12369:9:::1;:24;12381:12:::0;12369:9;:24:::1;:::i;13064:101::-:0;-1:-1:-1;;;;;13147:16:0;;;;;;:9;:16;;;;;;;;;13140:23;;;;;;;;;;;;;;;;;13123:15;;13140:23;;;13147:16;13140:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13140:23:0;-1:-1:-1;;;;;13140:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13064:101;;;:::o;12503:75::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12564:3:::1;:12:::0;;-1:-1:-1;;;;;12564:12:0;;::::1;-1:-1:-1::0;;;12564:12:0::1;-1:-1:-1::0;;;;;;12564:12:0;;::::1;::::0;;;::::1;::::0;;12503:75::o;12126:154::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12213:12:::1;:29;12228:14:::0;12213:12;:29:::1;:::i;:::-;-1:-1:-1::0;12249:29:0::1;::::0;::::1;::::0;;;::::1;12126:154:::0;:::o;11440:81::-;11487:13;11511:7;11504:14;;;;;:::i;32716:1691::-;32829:23;;32871:13;32863:52;;;;-1:-1:-1;;;32863:52:0;;23906:2:1;32863:52:0;;;23888:21:1;23945:2;23925:18;;;23918:30;23984:28;23964:18;;;23957:56;24030:18;;32863:52:0;23704:350:1;32863:52:0;32928:15;32945:18;32974:19;33009:13;;;;;;;;;-1:-1:-1;;;;;33009:13:0;-1:-1:-1;;;;;33002:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32996:38;;:2;:38;:::i;:::-;32974:60;;33051:9;33064:1;33051:14;33047:749;;33095:16;33112:1;33095:19;;;;;;;;:::i;:::-;;;;;;;;;;;;33133;;;;:7;:19;;;;;;;;33095;;-1:-1:-1;33156:10:0;-1:-1:-1;;;;;33133:19:0;;;:33;33129:198;;33203:3;;33187:19;;33129:198;;;33301:10;33285:26;;33129:198;33341:37;9726:3;33367:10;33341:8;:37::i;:::-;;33047:749;;;33415:6;33411:290;33431:9;33427:1;:13;33411:290;;;33475:16;33492:1;33475:19;;;;;;;;:::i;:::-;;;;;;;;;;;;33521;;;;:7;:19;;;;;;;;33475;;-1:-1:-1;;;;;;33521:19:0;33544:10;33521:33;33513:80;;;;-1:-1:-1;;;33513:80:0;;24261:2:1;33513:80:0;;;24243:21:1;24300:2;24280:18;;;24273:30;24339:34;24319:18;;;24312:62;-1:-1:-1;;;24390:18:1;;;24383:32;24432:19;;33513:80:0;24059:398:1;33513:80:0;33612:37;9726:3;33638:10;33612:8;:37::i;:::-;-1:-1:-1;33680:3:0;;33411:290;;;-1:-1:-1;33743:3:0;;33731:15;;:9;:15;:::i;:::-;33715:31;;33047:749;33836:27;;;;:10;:27;;;:44;;33867:13;;33836:27;:44;;33867:13;;33836:44;:::i;:::-;;;;;;;;33907:13;33891:12;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;34000:3:0;;33977:19;;33933:24;;34000:3;33961:35;;:13;:35;:::i;:::-;33960:43;;;;:::i;:::-;33933:70;;34044:25;34113:21;;34095:14;;34073:19;:36;;;;:::i;:::-;34072:62;;;;:::i;:::-;34153:13;;34177:12;;34147:65;;-1:-1:-1;;;34147:65:0;;-1:-1:-1;;;;;34177:12:0;;;34147:65;;;24636:51:1;24703:18;;;24696:34;;;34044:90:0;;-1:-1:-1;34153:13:0;;34147:29;;24609:18:1;;34147:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34239:13:0;;-1:-1:-1;;;;;34239:13:0;34233:29;34263:10;34276:42;34298:20;34276:19;:42;:::i;:::-;34233:87;;-1:-1:-1;;;;;;34233:87:0;;;;;;;-1:-1:-1;;;;;24654:32:1;;;34233:87:0;;;24636:51:1;24703:18;;;24696:34;24609:18;;34233:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34349:10;-1:-1:-1;;;;;34338:61:0;;34361:19;34382:16;34338:61;;;;;;;:::i;:::-;;;;;;;;32801:1606;;;;;;32716:1691;:::o;26465:216::-;26571:10;26552:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;26552:40:0;;;;;;;;;:51;;-1:-1:-1;;26552:51:0;;;;;;;26614:59;;26552:40;:51;26614:27;:59::i;23457:339::-;23525:4;23545:15;;;:7;:15;;;;;;23564:10;-1:-1:-1;;;;;23545:15:0;;;:29;23542:178;;23591:44;23604:10;23616:2;23627:6;23591:12;:44::i;:::-;23650:32;23662:10;23674:2;23678:3;;23650:11;:32::i;:::-;-1:-1:-1;23704:4:0;23697:11;;23542:178;23730:36;23743:10;23755:2;23759:6;23730:12;:36::i;25356:675::-;25505:10;-1:-1:-1;;;;;25505:18:0;;;;:56;;;25541:20;25553:7;25541:11;:20::i;:::-;-1:-1:-1;;;;;25527:34:0;:10;-1:-1:-1;;;;;25527:34:0;;25505:56;:94;;;;25565:34;25582:4;25588:10;25565:16;:34::i;:::-;25479:186;;;;-1:-1:-1;;;25479:186:0;;;;;;;:::i;:::-;25676:39;25689:4;25695:2;25706:7;25676:12;:39::i;:::-;25727:26;25739:4;25745:2;25749:3;;25727:11;:26::i;:::-;-1:-1:-1;;;;;25784:14:0;;;:19;;;;:173;;-1:-1:-1;25820:74:0;;-1:-1:-1;;;25820:74:0;;;25911:46;-1:-1:-1;;;;;25820:41:0;;;25911:46;;25820:74;;25862:10;;25874:4;;25880:7;;25889:4;;25820:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;25820:137:0;;;25784:173;25766:258;;;25991:21;;-1:-1:-1;;;25991:21:0;;;;;;;;;;;25766:258;25356:675;;;;:::o;26853:284::-;26917:13;26962:5;;26951:7;:16;;26943:45;;;;-1:-1:-1;;;26943:45:0;;25437:2:1;26943:45:0;;;25419:21:1;25476:2;25456:18;;;25449:30;-1:-1:-1;;;25495:18:1;;;25488:46;25551:18;;26943:45:0;25235:340:1;26943:45:0;27009:7;27003:21;;;;;:::i;:::-;;;27028:1;27003:26;26999:44;;-1:-1:-1;;27032:9:0;;;;;;;;;-1:-1:-1;27032:9:0;;;26853:284::o;26999:44::-;27084:7;27093:23;27112:3;;27102:7;:13;;;;:::i;:::-;27093:8;:23::i;:::-;27118:9;27067:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27053:76;;26853:284;;;:::o;11697:83::-;11747:4;11774:3;;11762:9;;:15;;;;:::i;:::-;11755:22;;11697:83;:::o;13278:89::-;13330:13;13353:12;13346:19;;;;;:::i;12401:96::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12473:8:::1;:22;12484:11:::0;12473:8;:22:::1;:::i;26689:156::-:0;-1:-1:-1;;;;;26802:25:0;;;26778:4;26802:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26689:156::o;5201:126::-;5315:8;5305;-1:-1:-1;;;;;5288:36:0;5297:6;-1:-1:-1;;;;;5288:36:0;;;;;;;;;;;5201:126;;;:::o;4633:122::-;4735:8;-1:-1:-1;;;;;4718:34:0;4727:6;-1:-1:-1;;;;;4718:34:0;;4745:6;4718:34;;;;2595:25:1;;2583:2;2568:18;;2449:177;4718:34:0;;;;;;;;4633:122;;;:::o;21926:529::-;-1:-1:-1;;;;;22034:16:0;;;;;;:7;:16;;;;;;-1:-1:-1;;;;;22026:24:0;;;22034:16;;22026:24;22018:58;;;;-1:-1:-1;;;22018:58:0;;26984:2:1;22018:58:0;;;26966:21:1;27023:2;27003:18;;;26996:30;-1:-1:-1;;;27042:18:1;;;27035:51;27103:18;;22018:58:0;26782:345:1;22018:58:0;-1:-1:-1;;;;;22142:22:0;;;;;;:13;:22;;;;;;;;22135:29;;-1:-1:-1;;;;;;22135:29:0;;;;;;22213:7;:16;;;;;;:21;;;;;-1:-1:-1;;;;;22213:21:0;;;;;22288:35;22305:4;22213:21;22142:22;22288:16;:35::i;:::-;22374:40;22396:4;22402:2;22406:7;-1:-1:-1;;;;;22374:40:0;:21;:40::i;21463:361::-;-1:-1:-1;;;;;21546:16:0;;;;;;:10;:16;;;;;:26;;21566:6;;21546:16;:26;;21566:6;;21546:26;:::i;:::-;;;;-1:-1:-1;;;;;;;21655:14:0;;;;;;:10;:14;;;;;:24;;;;;;21746:38;21767:4;21666:2;21673:6;21746:20;:38::i;26039:230::-;-1:-1:-1;;;;;26145:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;:36;-1:-1:-1;26145:36:0;26137:77;;;;-1:-1:-1;;;26137:77:0;;27334:2:1;26137:77:0;;;27316:21:1;27373:2;27353:18;;;27346:30;27412;27392:18;;;27385:58;27460:18;;26137:77:0;27132:352:1;26137:77:0;-1:-1:-1;;;;;26225:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;:36;;26255:6;;26225:17;:36;;26255:6;;26225:36;:::i;:::-;;;;-1:-1:-1;;;;;26039:230:0:o;14636:3875::-;-1:-1:-1;;;;;14743:16:0;;;;;;:10;:16;;;;;;:26;-1:-1:-1;14743:26:0;14735:76;;;;-1:-1:-1;;;14735:76:0;;27691:2:1;14735:76:0;;;27673:21:1;27730:2;27710:18;;;27703:30;27769:34;27749:18;;;27742:62;-1:-1:-1;;;27820:18:1;;;27813:35;27865:19;;14735:76:0;27489:401:1;14735:76:0;14974:3;;-1:-1:-1;;;;;14955:16:0;;14929:23;14955:16;;;:10;:16;;;;;;14929:23;;14955:22;;;:::i;:::-;15029:3;;-1:-1:-1;;;;;15012:14:0;;14988:21;15012:14;;;:10;:14;;;;;;14929:48;;-1:-1:-1;14988:21:0;15012:20;;15029:3;15012:20;:::i;:::-;14988:44;;15097:29;15109:4;15115:2;15119:6;15097:11;:29::i;:::-;15274:3;;-1:-1:-1;;;;;15255:16:0;;15228:24;15255:16;;;:10;:16;;;;;;15228:24;;15255:22;;;:::i;:::-;15330:3;;-1:-1:-1;;;;;15313:14:0;;15288:22;15313:14;;;:10;:14;;;;;;15228:49;;-1:-1:-1;15288:22:0;15313:20;;15330:3;15313:20;:::i;:::-;-1:-1:-1;;;;;15470:15:0;;15436:31;15470:15;;;:9;:15;;;;;9661:7;15615:25;;;15288:45;;-1:-1:-1;15615:25:0;15773:34;;;15769:384;;;15829:21;;:25;15826:316;;16006:53;16022:4;9661:7;16044:14;16006:15;:53::i;:::-;16299:14;16283:13;:30;16279:308;;;16335:21;;:25;16332:230;;16417:51;9661:7;16449:2;16453:14;16417:15;:51::i;:::-;16332:230;;;16537:9;16543:2;16537:5;:9::i;:::-;;16332:230;16684:19;16715:3;;16706:6;:12;;;;:::i;:::-;16742:21;;17157:17;;16684:34;;-1:-1:-1;16742:21:0;-1:-1:-1;;;17157:17:0;;;;;:44;;-1:-1:-1;;;;;;17178:23:0;;;17157:44;:67;;;-1:-1:-1;;;;;;17205:19:0;;;;;;:15;:19;;;;;;;;17157:67;:92;;;-1:-1:-1;;;;;;17228:21:0;;;;;;:15;:21;;;;;;;;17157:92;:107;;;-1:-1:-1;17261:3:0;;-1:-1:-1;;;;;17253:11:0;;;-1:-1:-1;;;17261:3:0;;;;17253:11;17157:107;17154:305;;;17421:3;17404:14;:20;:43;;17444:3;17404:43;;;17427:14;17404:43;17387:60;;17154:305;17474:18;;17471:1033;;17546:3;17529:14;:20;:43;;17569:3;17529:43;;;17552:14;17529:43;17523:49;;17815:6;17810:108;17831:3;17827:1;:7;17810:108;;;17860:41;17876:4;17882:2;17886:14;17860:15;:41::i;:::-;17836:3;;17810:108;;;-1:-1:-1;17932:21:0;17950:3;17932:21;;:::i;:::-;17974;;17932;;-1:-1:-1;17974:21:0;-1:-1:-1;18016:20:0;;;:43;;18056:3;18016:43;;;18039:14;18016:43;18010:49;;18318:6;18313:125;18334:3;18330:1;:7;18313:125;;;18371:51;9661:7;18403:2;18407:14;18371:15;:51::i;:::-;18339:3;;18313:125;;;-1:-1:-1;18454:36:0;18465:2;18469:20;18486:3;18469:14;:20;:::i;:::-;18454:10;:36::i;:::-;14714:3797;;;;;;;;14636:3875;;;:::o;5333:142::-;5451:9;-1:-1:-1;;;;;5428:44:0;5443:6;-1:-1:-1;;;;;5428:44:0;;5462:9;5428:44;;;;565:14:1;558:22;540:41;;528:2;513:18;;400:187;27145:385:0;27201:13;27231:5;27240:1;27231:10;27227:29;;-1:-1:-1;;27244:10:0;;;;;;;;;;;;-1:-1:-1;;;27244:10:0;;;;;27145:385::o;27227:29::-;27272:5;27257:12;27304:41;27311:9;;27304:41;;27323:8;;;;:::i;:::-;;-1:-1:-1;27333:10:0;;-1:-1:-1;27341:2:0;27333:10;;:::i;:::-;;;27304:41;;;27346:19;27378:6;-1:-1:-1;;;;;27368:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27368:17:0;;27346:39;;27396:95;27403:10;;27396:95;;27416:11;27426:1;27416:11;;:::i;:::-;;-1:-1:-1;27459:10:0;27467:2;27459:5;:10;:::i;:::-;27453:22;;27473:2;27453:22;:::i;:::-;27446:30;;27429:6;27436;27429:14;;;;;;;;:::i;:::-;;;;:47;-1:-1:-1;;;;;27429:47:0;;;;;;;;-1:-1:-1;27478:11:0;27487:2;27478:11;;:::i;:::-;;;27396:95;;;27515:6;27145:385;-1:-1:-1;;;;27145:385:0:o;20362:1045::-;-1:-1:-1;;;;;20467:18:0;;20451:13;20467:18;;;:9;:18;;;;;;;;;-1:-1:-1;;;;;20578:15:0;;;;:9;:15;;;;;20667;;20467:18;;20578:15;;20667;20578;20765:7;20771:1;20667:15;20765:7;:::i;:::-;20756:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20756:17:0;20735:38;;20877:11;20859:8;20868:5;20859:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;;;;-1:-1:-1;;;;;20859:29:0;;;;;-1:-1:-1;;;;;20859:29:0;;;;;;20965:8;:14;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;20965:14:0;;;;;;;;;-1:-1:-1;;;;;20965:14:0;;;;;;;;;;;;;;21086:7;20965:14;21086:3;:7;:::i;:::-;:12;21083:115;;-1:-1:-1;;;;;21115:22:0;;;;;;:9;:22;;;;;:30;;;21083:115;-1:-1:-1;;;;;21215:13:0;;;;;;:9;:13;;;;;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21215:27:0;;;;;;;;;;;;;;;;;21321:13;;;;:20;;:24;;21215:27;21321:24;:::i;:::-;-1:-1:-1;;;;;21300:18:0;;;;;;;:9;:18;;;;;:45;;;;-1:-1:-1;;;;;;20362:1045:0:o;5081:114::-;5183:8;5178:3;-1:-1:-1;;;;;5162:30:0;5171:5;-1:-1:-1;;;;;5162:30:0;;;;;;;;;;;5081:114;;;:::o;4515:112::-;4611:3;-1:-1:-1;;;;;4595:29:0;4604:5;-1:-1:-1;;;;;4595:29:0;;4616:7;4595:29;;;;2595:25:1;;2583:2;2568:18;;2449:177;22557:768:0;22689:15;;22663:14;;22680:8;;22689:19;;22707:1;;22689:19;:::i;:::-;22680:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22680:29:0;22737:22;;;:13;:22;;;;;;22730:29;;-1:-1:-1;;;;;;22730:29:0;;;;;;22808:7;:16;;;;;;:21;;;;;-1:-1:-1;;;;;22808:21:0;;;;;22935:14;;22680:29;;-1:-1:-1;22935:14:0;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;22935:14:0;;;;;;;;;;;-1:-1:-1;;;;;22935:14:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23047:13:0;;;;;:9;:13;;;;;:27;;22935:14;23047:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23153:13;;;:20;:24;;22935:14;23153:24;:::i;:::-;-1:-1:-1;;;;;23132:18:0;;;;;;:9;:18;;;;;:45;;;;23244:40;;23266:4;;23272:2;;23244:21;:40::i;19626:632::-;19729:6;:8;;-1:-1:-1;;19729:8:0;;;-1:-1:-1;;;;;19729:8:0;;;;;;;;;;;;;-1:-1:-1;19871:16:0;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;19871:21:0;-1:-1:-1;;;;;19871:21:0;;;;;;;;19966:13;;:9;:13;;;;;;:20;;19945:18;;;:9;:18;;;;;:41;;;20054:13;;;:27;;;;;;;;;;;;;;;;;;;;;;19729:8;20054:27;;;;;;;;;;;;;;;;;;20162:48;;19871:21;19729:8;20162:21;:48::i;:::-;19626:632;;;:::o;18519:1097::-;18598:6;18608:1;18598:11;18595:23;;18519:1097;;:::o;18595:23::-;18660:6;18670:1;18660:11;18657:105;;18720:9;18726:2;18720:5;:9::i;18657:105::-;18784:6;;-1:-1:-1;;;;;18855:13:0;;18772:9;18855:13;;;:9;:13;;;;;:20;-1:-1:-1;;;;;18784:6:0;;;;18855:20;18926:583;18946:6;18942:1;:10;18926:583;;;18999:4;;;;-1:-1:-1;;;;;19066:11:0;;;;;;;:7;:11;;;;;;;;:16;;-1:-1:-1;;;;;;19066:16:0;-1:-1:-1;;;;;19066:16:0;;;;;;;;19125:9;:13;;;;;:24;;;19208:13;;:9;:13;;;;:22;;;;;;;;;;;;;;;;;;;;;;;19066:16;19208:22;;;;;;;;;;;;;;;;;;18999:4;;19281:43;;19066:11;:16;;19281:21;:43::i;:::-;19397:10;;;;;19459:3;18926:583;;;-1:-1:-1;;19544:6:0;:24;;-1:-1:-1;;19544:24:0;;-1:-1:-1;;;;;19544:24:0;;;;;;;;;;;;;;;-1:-1:-1;;18519:1097:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:131::-;-1:-1:-1;;;;;1816:31:1;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:1:o;2197:247::-;2256:6;2309:2;2297:9;2288:7;2284:23;2280:32;2277:52;;;2325:1;2322;2315:12;2277:52;2364:9;2351:23;2383:31;2408:5;2383:31;:::i;2631:127::-;2692:10;2687:3;2683:20;2680:1;2673:31;2723:4;2720:1;2713:15;2747:4;2744:1;2737:15;2763:275;2834:2;2828:9;2899:2;2880:13;;-1:-1:-1;;2876:27:1;2864:40;;-1:-1:-1;;;;;2919:34:1;;2955:22;;;2916:62;2913:88;;;2981:18;;:::i;:::-;3017:2;3010:22;2763:275;;-1:-1:-1;2763:275:1:o;3043:186::-;3091:4;-1:-1:-1;;;;;3116:6:1;3113:30;3110:56;;;3146:18;;:::i;:::-;-1:-1:-1;3212:2:1;3191:15;-1:-1:-1;;3187:29:1;3218:4;3183:40;;3043:186::o;3234:336::-;3298:5;3327:52;3343:35;3371:6;3343:35;:::i;:::-;3327:52;:::i;:::-;3318:61;;3402:6;3395:5;3388:21;3442:3;3433:6;3428:3;3424:16;3421:25;3418:45;;;3459:1;3456;3449:12;3418:45;3508:6;3503:3;3496:4;3489:5;3485:16;3472:43;3562:1;3555:4;3546:6;3539:5;3535:18;3531:29;3524:40;3234:336;;;;;:::o;3575:220::-;3617:5;3670:3;3663:4;3655:6;3651:17;3647:27;3637:55;;3688:1;3685;3678:12;3637:55;3710:79;3785:3;3776:6;3763:20;3756:4;3748:6;3744:17;3710:79;:::i;3800:665::-;3895:6;3903;3911;3919;3972:3;3960:9;3951:7;3947:23;3943:33;3940:53;;;3989:1;3986;3979:12;3940:53;4028:9;4015:23;4047:31;4072:5;4047:31;:::i;:::-;4097:5;-1:-1:-1;4154:2:1;4139:18;;4126:32;4167:33;4126:32;4167:33;:::i;:::-;4219:7;-1:-1:-1;4273:2:1;4258:18;;4245:32;;-1:-1:-1;4328:2:1;4313:18;;4300:32;-1:-1:-1;;;;;4344:30:1;;4341:50;;;4387:1;4384;4377:12;4341:50;4410:49;4451:7;4442:6;4431:9;4427:22;4410:49;:::i;:::-;4400:59;;;3800:665;;;;;;;:::o;4882:456::-;4959:6;4967;4975;5028:2;5016:9;5007:7;5003:23;4999:32;4996:52;;;5044:1;5041;5034:12;4996:52;5083:9;5070:23;5102:31;5127:5;5102:31;:::i;:::-;5152:5;-1:-1:-1;5209:2:1;5194:18;;5181:32;5222:33;5181:32;5222:33;:::i;:::-;4882:456;;5274:7;;-1:-1:-1;;;5328:2:1;5313:18;;;;5300:32;;4882:456::o;5343:320::-;5411:6;5464:2;5452:9;5443:7;5439:23;5435:32;5432:52;;;5480:1;5477;5470:12;5432:52;5520:9;5507:23;-1:-1:-1;;;;;5545:6:1;5542:30;5539:50;;;5585:1;5582;5575:12;5539:50;5608:49;5649:7;5640:6;5629:9;5625:22;5608:49;:::i;5668:450::-;5737:6;5790:2;5778:9;5769:7;5765:23;5761:32;5758:52;;;5806:1;5803;5796:12;5758:52;5846:9;5833:23;-1:-1:-1;;;;;5871:6:1;5868:30;5865:50;;;5911:1;5908;5901:12;5865:50;5934:22;;5987:4;5979:13;;5975:27;-1:-1:-1;5965:55:1;;6016:1;6013;6006:12;5965:55;6039:73;6104:7;6099:2;6086:16;6081:2;6077;6073:11;6039:73;:::i;6123:946::-;6207:6;6238:2;6281;6269:9;6260:7;6256:23;6252:32;6249:52;;;6297:1;6294;6287:12;6249:52;6337:9;6324:23;-1:-1:-1;;;;;6407:2:1;6399:6;6396:14;6393:34;;;6423:1;6420;6413:12;6393:34;6461:6;6450:9;6446:22;6436:32;;6506:7;6499:4;6495:2;6491:13;6487:27;6477:55;;6528:1;6525;6518:12;6477:55;6564:2;6551:16;6586:2;6582;6579:10;6576:36;;;6592:18;;:::i;:::-;6638:2;6635:1;6631:10;6621:20;;6661:28;6685:2;6681;6677:11;6661:28;:::i;:::-;6723:15;;;6793:11;;;6789:20;;;6754:12;;;;6821:19;;;6818:39;;;6853:1;6850;6843:12;6818:39;6877:11;;;;6897:142;6913:6;6908:3;6905:15;6897:142;;;6979:17;;6967:30;;6930:12;;;;7017;;;;6897:142;;;7058:5;6123:946;-1:-1:-1;;;;;;;;6123:946:1:o;7074:118::-;7160:5;7153:13;7146:21;7139:5;7136:32;7126:60;;7182:1;7179;7172:12;7197:241;7253:6;7306:2;7294:9;7285:7;7281:23;7277:32;7274:52;;;7322:1;7319;7312:12;7274:52;7361:9;7348:23;7380:28;7402:5;7380:28;:::i;7443:655::-;7612:2;7664:21;;;7734:13;;7637:18;;;7756:22;;;7583:4;;7612:2;7835:15;;;;7809:2;7794:18;;;7583:4;7878:194;7892:6;7889:1;7886:13;7878:194;;;7957:13;;-1:-1:-1;;;;;7953:38:1;7941:51;;8047:15;;;;8012:12;;;;7914:1;7907:9;7878:194;;;-1:-1:-1;8089:3:1;;7443:655;-1:-1:-1;;;;;;7443:655:1:o;8103:382::-;8168:6;8176;8229:2;8217:9;8208:7;8204:23;8200:32;8197:52;;;8245:1;8242;8235:12;8197:52;8284:9;8271:23;8303:31;8328:5;8303:31;:::i;:::-;8353:5;-1:-1:-1;8410:2:1;8395:18;;8382:32;8423:30;8382:32;8423:30;:::i;:::-;8472:7;8462:17;;;8103:382;;;;;:::o;8490:388::-;8558:6;8566;8619:2;8607:9;8598:7;8594:23;8590:32;8587:52;;;8635:1;8632;8625:12;8587:52;8674:9;8661:23;8693:31;8718:5;8693:31;:::i;:::-;8743:5;-1:-1:-1;8800:2:1;8785:18;;8772:32;8813:33;8772:32;8813:33;:::i;8883:380::-;8962:1;8958:12;;;;9005;;;9026:61;;9080:4;9072:6;9068:17;9058:27;;9026:61;9133:2;9125:6;9122:14;9102:18;9099:38;9096:161;;9179:10;9174:3;9170:20;9167:1;9160:31;9214:4;9211:1;9204:15;9242:4;9239:1;9232:15;9096:161;;8883:380;;;:::o;9623:354::-;9825:2;9807:21;;;9864:2;9844:18;;;9837:30;9903:32;9898:2;9883:18;;9876:60;9968:2;9953:18;;9623:354::o;9982:341::-;10184:2;10166:21;;;10223:2;10203:18;;;10196:30;-1:-1:-1;;;10257:2:1;10242:18;;10235:47;10314:2;10299:18;;9982:341::o;11098:249::-;11167:6;11220:2;11208:9;11199:7;11195:23;11191:32;11188:52;;;11236:1;11233;11226:12;11188:52;11268:9;11262:16;11287:30;11311:5;11287:30;:::i;11700:146::-;11787:13;;11809:31;11787:13;11809:31;:::i;11851:442::-;11905:5;11958:3;11951:4;11943:6;11939:17;11935:27;11925:55;;11976:1;11973;11966:12;11925:55;12005:6;11999:13;12036:48;12052:31;12080:2;12052:31;:::i;12036:48::-;12109:2;12100:7;12093:19;12155:3;12148:4;12143:2;12135:6;12131:15;12127:26;12124:35;12121:55;;;12172:1;12169;12162:12;12121:55;12185:77;12259:2;12252:4;12243:7;12239:18;12232:4;12224:6;12220:17;12185:77;:::i;12298:1321::-;12488:6;12496;12504;12512;12520;12528;12536;12544;12552;12605:3;12593:9;12584:7;12580:23;12576:33;12573:53;;;12622:1;12619;12612:12;12573:53;12651:9;12645:16;12635:26;;12680:57;12733:2;12722:9;12718:18;12680:57;:::i;:::-;12670:67;;12781:2;12770:9;12766:18;12760:25;-1:-1:-1;;;;;12845:2:1;12837:6;12834:14;12831:34;;;12861:1;12858;12851:12;12831:34;12884:61;12937:7;12928:6;12917:9;12913:22;12884:61;:::i;:::-;12874:71;;12991:2;12980:9;12976:18;12970:25;12954:41;;13020:2;13010:8;13007:16;13004:36;;;13036:1;13033;13026:12;13004:36;13059:63;13114:7;13103:8;13092:9;13088:24;13059:63;:::i;:::-;13049:73;;13162:3;13151:9;13147:19;13141:26;13131:36;;13213:3;13202:9;13198:19;13192:26;13176:42;;13243:2;13233:8;13230:16;13227:36;;;13259:1;13256;13249:12;13227:36;13282:63;13337:7;13326:8;13315:9;13311:24;13282:63;:::i;:::-;13272:73;;13391:3;13380:9;13376:19;13370:26;13354:42;;13421:2;13411:8;13408:16;13405:36;;;13437:1;13434;13427:12;13405:36;;13460:63;13515:7;13504:8;13493:9;13489:24;13460:63;:::i;:::-;13450:73;;;13563:3;13552:9;13548:19;13542:26;13532:36;;13608:3;13597:9;13593:19;13587:26;13577:36;;12298:1321;;;;;;;;;;;:::o;13750:518::-;13852:2;13847:3;13844:11;13841:421;;;13888:5;13885:1;13878:16;13932:4;13929:1;13919:18;14002:2;13990:10;13986:19;13983:1;13979:27;13973:4;13969:38;14038:4;14026:10;14023:20;14020:47;;;-1:-1:-1;14061:4:1;14020:47;14116:2;14111:3;14107:12;14104:1;14100:20;14094:4;14090:31;14080:41;;14171:81;14189:2;14182:5;14179:13;14171:81;;;14248:1;14234:16;;14215:1;14204:13;14171:81;;;14175:3;;13750:518;;;:::o;14444:1345::-;14570:3;14564:10;-1:-1:-1;;;;;14589:6:1;14586:30;14583:56;;;14619:18;;:::i;:::-;14648:97;14738:6;14698:38;14730:4;14724:11;14698:38;:::i;:::-;14692:4;14648:97;:::i;:::-;14800:4;;14857:2;14846:14;;14874:1;14869:663;;;;15576:1;15593:6;15590:89;;;-1:-1:-1;15645:19:1;;;15639:26;15590:89;-1:-1:-1;;14401:1:1;14397:11;;;14393:24;14389:29;14379:40;14425:1;14421:11;;;14376:57;15692:81;;14839:944;;14869:663;13697:1;13690:14;;;13734:4;13721:18;;-1:-1:-1;;14905:20:1;;;15023:236;15037:7;15034:1;15031:14;15023:236;;;15126:19;;;15120:26;15105:42;;15218:27;;;;15186:1;15174:14;;;;15053:19;;15023:236;;;15027:3;15287:6;15278:7;15275:19;15272:201;;;15348:19;;;15342:26;-1:-1:-1;;15431:1:1;15427:14;;;15443:3;15423:24;15419:37;15415:42;15400:58;15385:74;;15272:201;;;15519:1;15510:6;15507:1;15503:14;15499:22;15493:4;15486:36;14839:944;;;;;14444:1345;;:::o;16378:245::-;16445:6;16498:2;16486:9;16477:7;16473:23;16469:32;16466:52;;;16514:1;16511;16504:12;16466:52;16546:9;16540:16;16565:28;16587:5;16565:28;:::i;17452:127::-;17513:10;17508:3;17504:20;17501:1;17494:31;17544:4;17541:1;17534:15;17568:4;17565:1;17558:15;17584:416;17673:1;17710:5;17673:1;17724:270;17745:7;17735:8;17732:21;17724:270;;;17804:4;17800:1;17796:6;17792:17;17786:4;17783:27;17780:53;;;17813:18;;:::i;:::-;17863:7;17853:8;17849:22;17846:55;;;17883:16;;;;17846:55;17962:22;;;;17922:15;;;;17724:270;;;17728:3;17584:416;;;;;:::o;18005:806::-;18054:5;18084:8;18074:80;;-1:-1:-1;18125:1:1;18139:5;;18074:80;18173:4;18163:76;;-1:-1:-1;18210:1:1;18224:5;;18163:76;18255:4;18273:1;18268:59;;;;18341:1;18336:130;;18248:218;18336:130;18373:3;18363:8;18360:17;18357:43;;;18380:18;;:::i;:::-;-1:-1:-1;;18436:1:1;18422:16;;18451:5;;18248:218;;18550:2;18540:8;18537:16;18531:3;18525:4;18522:13;18518:36;18512:2;18502:8;18499:16;18494:2;18488:4;18485:12;18481:35;18478:77;18475:159;;;-1:-1:-1;18587:19:1;;;18619:5;;18475:159;18666:34;18691:8;18685:4;18666:34;:::i;:::-;18736:6;18732:1;18728:6;18724:19;18715:7;18712:32;18709:58;;;18747:18;;:::i;:::-;18785:20;;18005:806;-1:-1:-1;;;18005:806:1:o;18816:131::-;18876:5;18905:36;18932:8;18926:4;18905:36;:::i;18952:125::-;19017:9;;;19038:10;;;19035:36;;;19051:18;;:::i;19082:128::-;19149:9;;;19170:11;;;19167:37;;;19184:18;;:::i;19215:183::-;-1:-1:-1;;;;;19334:10:1;;;19322;;;19318:27;;19357:12;;;19354:38;;;19372:18;;:::i;:::-;19354:38;19215:183;;;;:::o;19403:184::-;19473:6;19526:2;19514:9;19505:7;19501:23;19497:32;19494:52;;;19542:1;19539;19532:12;19494:52;-1:-1:-1;19565:16:1;;19403:184;-1:-1:-1;19403:184:1:o;21379:127::-;21440:10;21435:3;21431:20;21428:1;21421:31;21471:4;21468:1;21461:15;21495:4;21492:1;21485:15;21511:251;21581:6;21634:2;21622:9;21613:7;21609:23;21605:32;21602:52;;;21650:1;21647;21640:12;21602:52;21682:9;21676:16;21701:31;21726:5;21701:31;:::i;21767:168::-;21840:9;;;21871;;21888:15;;;21882:22;;21868:37;21858:71;;21909:18;;:::i;21940:127::-;22001:10;21996:3;21992:20;21989:1;21982:31;22032:4;22029:1;22022:15;22056:4;22053:1;22046:15;22072:120;22112:1;22138;22128:35;;22143:18;;:::i;:::-;-1:-1:-1;22177:9:1;;22072:120::o;22996:703::-;23166:4;23214:2;23203:9;23199:18;23244:6;23233:9;23226:25;23270:2;23308;23303;23292:9;23288:18;23281:30;23331:6;23366;23360:13;23397:6;23389;23382:22;23435:2;23424:9;23420:18;23413:25;;23473:2;23465:6;23461:15;23447:29;;23494:1;23504:169;23518:6;23515:1;23512:13;23504:169;;;23579:13;;23567:26;;23648:15;;;;23613:12;;;;23540:1;23533:9;23504:169;;;-1:-1:-1;23690:3:1;;22996:703;-1:-1:-1;;;;;;;22996:703:1:o;24741:489::-;-1:-1:-1;;;;;25010:15:1;;;24992:34;;25062:15;;25057:2;25042:18;;25035:43;25109:2;25094:18;;25087:34;;;25157:3;25152:2;25137:18;;25130:31;;;24935:4;;25178:46;;25204:19;;25196:6;25178:46;:::i;:::-;25170:54;24741:489;-1:-1:-1;;;;;;24741:489:1:o;25580:723::-;25630:3;25671:5;25665:12;25700:36;25726:9;25700:36;:::i;:::-;25755:1;25772:17;;;25798:133;;;;25945:1;25940:357;;;;25765:532;;25798:133;-1:-1:-1;;25831:24:1;;25819:37;;25904:14;;25897:22;25885:35;;25876:45;;;-1:-1:-1;25798:133:1;;25940:357;25971:5;25968:1;25961:16;26000:4;26045;26042:1;26032:18;26072:1;26086:165;26100:6;26097:1;26094:13;26086:165;;;26178:14;;26165:11;;;26158:35;26221:16;;;;26115:10;;26086:165;;;26090:3;;;26280:6;26275:3;26271:16;26264:23;;25765:532;;;;;25580:723;;;;:::o;26308:469::-;26529:3;26557:38;26591:3;26583:6;26557:38;:::i;:::-;26624:6;26618:13;26640:65;26698:6;26694:2;26687:4;26679:6;26675:17;26640:65;:::i;:::-;26721:50;26763:6;26759:2;26755:15;26747:6;26721:50;:::i;:::-;26714:57;26308:469;-1:-1:-1;;;;;;;26308:469:1:o;27895:112::-;27927:1;27953;27943:35;;27958:18;;:::i;:::-;-1:-1:-1;27992:9:1;;27895:112::o;28012:135::-;28051:3;28072:17;;;28069:43;;28092:18;;:::i;:::-;-1:-1:-1;28139:1:1;28128:13;;28012:135::o;28152:148::-;28240:4;28219:12;;;28233;;;28215:31;;28258:13;;28255:39;;;28274:18;;:::i;28305:127::-;28366:10;28361:3;28357:20;28354:1;28347:31;28397:4;28394:1;28387:15;28421:4;28418:1;28411:15
Swarm Source
ipfs://e68db4566750c8448bec0263df669a89d4d5586467cae4dc16b0731ab2ffe716
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.