Source Code
Overview
FRAX Balance | FXTL Balance
0 FRAX | 0 FXTL
FRAX Value
$0.00
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Swap_Market
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/**
*Submitted for verification at fraxscan.com on 2024-02-28
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
interface IERC20 {
/**
* @dev Allows for the transfer of a specified amount of tokens from a sender to a recipient.
* @param sender The address sending the tokens.
* @param recipient The address receiving the tokens.
* @param amount The amount of tokens to be transferred.
* @return Returns true if the transfer was successful.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Allows for the transfer of a specified amount of tokens to a recipient.
* @param recipient The address receiving the tokens.
* @param amount The amount of tokens to be transferred.
* @return Returns true if the transfer was successful.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
}
interface IAggregator {
/**
* @dev Returns the latest answer from the oracle.
* @return The latest answer as an integer.
*/
function latestAnswer() external view returns (int256);
}
contract Swap_Market {
/**
* @dev Emitted when tokens are swapped between different types.
* @param sender The address of the party initiating the swap.
* @param tokenFrom The address of the token being sent.
* @param tokenTo The address of the token being received.
* @param amountFrom The amount of the token being sent.
* @param amountTo The amount of the token being received.
*/
event TokensSwapped(address indexed sender, address indexed tokenFrom, address indexed tokenTo, uint amountFrom, uint amountTo);
/**
* @dev Emitted when tokens are swapped for a stablecoin.
* @param sender The address of the party initiating the swap.
* @param tokenFrom The address of the token being sent.
* @param stablecoin The address of the stablecoin being received.
* @param amountFrom The amount of the token being sent.
* @param amountStablecoin The amount of the stablecoin being received.
*/
event TokensSwappedToDefaultStablecoin(address indexed sender, address indexed tokenFrom, address indexed stablecoin, uint amountFrom, uint amountStablecoin);
/**
* @dev Emitted when tokens are swapped for ETH.
* @param sender The address of the party initiating the swap.
* @param tokenFrom The address of the token being sent.
* @param amountFrom The amount of the token being sent.
* @param amountETH The amount of ETH being received.
*/
event TokensSwappedToETH(address indexed sender, address indexed tokenFrom, uint amountFrom, uint amountETH);
/**
* @dev Emitted when ETH is deposited into the contract by the admin.
* @param admin The address of the admin.
* @param amount The amount of ETH deposited.
*/
event ETHDeposited(address indexed admin, uint amount);
/**
* @dev Emitted when ETH is withdrawn from the contract by the admin.
* @param admin The address of the admin.
* @param amount The amount of ETH withdrawn.
*/
event ETHWithdrawn(address indexed admin, uint amount);
/**
* @dev Emitted when a generic execution is performed by the admin.
* @param target The address of the target contract.
* @param data The data used for the execution.
* @param result The result of the execution.
*/
event Executed(address indexed target, bytes data, bytes result);
/**
* @dev Emitted when the contract setup is completed.
* @param admin The address of the admin who completed the setup.
* @param maxSlippagePercent The max slippage percent set during setup.
*/
event SetupCompleted(address indexed admin, uint maxSlippagePercent);
/**
* @dev Emitted when the admin role is transferred to a new address.
* @param admin The address of the current admin.
* @param newAdmin The address of the new admin.
*/
event AdminTransferred(address indexed admin, address newAdmin);
/**
* @dev Emitted when the block limit is changed.
* @param admin The address of the admin who changed the limit.
* @param newBlockLimit The new block limit.
*/
event BlockLimitChanged(address indexed admin, uint newBlockLimit);
/**
* @dev Emitted when the max slippage percent is changed.
* @param admin The address of the admin who changed the slippage percent.
* @param newMaxSlippagePercent The new max slippage percent.
*/
event MaxSlippagePercentChanged(address indexed admin, uint newMaxSlippagePercent);
/**
* @dev Emitted when token decimals are set.
* @param admin The address of the admin who set the token decimals.
* @param tokenSymbol The symbol of the token.
* @param decimals The number of decimals set for the token.
*/
event TokenDecimalsSet(address indexed admin, string tokenSymbol, uint8 decimals);
/**
* @dev Emitted when a new token is added to the contract.
* @param admin The address of the admin who added the token.
* @param tokenSymbol The symbol of the token added.
* @param tokenAddress The address of the token added.
*/
event TokenAdded(address indexed admin, string tokenSymbol, address tokenAddress);
/**
* @dev Emitted when a price feed is added for a token.
* @param admin The address of the admin who added the price feed.
* @param tokenSymbol The symbol of the token for which the price feed is added.
* @param priceFeedAddress The address of the price feed.
*/
event PriceFeedAdded(address indexed admin, string tokenSymbol, address priceFeedAddress);
/**
* @dev Emitted when a stablecoin is added to the contract.
* @param admin The address of the admin who added the stablecoin.
* @param stablecoinSymbol The symbol of the stablecoin added.
* @param stablecoinAddress The address of the stablecoin added.
*/
event StablecoinAdded(address indexed admin, string stablecoinSymbol, address stablecoinAddress);
/**
* @dev Emitted when a registered token is deposited.
* @param admin The address of the admin who deposited the token.
* @param tokenSymbol The symbol of the token deposited.
* @param sender The address of the sender who deposited the token.
* @param amount The amount of the token deposited.
*/
event RegisteredTokenDeposited(address indexed admin, string tokenSymbol, address indexed sender, uint amount);
/**
* @dev Emitted when the decimals of a token are reset.
* @param admin The address of the admin who reset the token decimals.
* @param tokenSymbol The symbol of the token whose decimals were reset.
*/
event TokenDecimalsReset(address indexed admin, string tokenSymbol);
/**
* @dev Emitted when a registered stablecoin is removed from the contract.
* @param admin The address of the admin who removed the stablecoin.
* @param stablecoinSymbol The symbol of the stablecoin removed.
* @param stablecoinAddress The address of the stablecoin removed.
*/
event RegisteredStablecoinRemoved(address indexed admin, string stablecoinSymbol, address stablecoinAddress);
/**
* @dev Emitted when a price feed is removed for a token.
* @param admin The address of the admin who removed the price feed.
* @param tokenSymbol The symbol of the token whose price feed was removed.
* @param priceFeedAddress The address of the removed price feed.
*/
event PriceFeedRemoved(address indexed admin, string tokenSymbol, address priceFeedAddress);
/**
* @dev Emitted when a registered token is removed from the contract.
* @param admin The address of the admin who removed the token.
* @param tokenSymbol The symbol of the token removed.
* @param tokenAddress The address of the token removed.
*/
event RegisteredTokenRemoved(address indexed admin, string tokenSymbol, address tokenAddress);
/**
* @dev Emitted when an admin withdraws a registered token from the contract.
* @param admin The address of the admin who performed the withdrawal.
* @param tokenSymbol The symbol of the token being withdrawn.
* @param sender The address from which the token withdrawal was initiated.
* @param amount The amount of tokens that were withdrawn.
*/
event RegisteredTokenWithdrawn(address indexed admin, string tokenSymbol, address indexed sender, uint amount);
/**
* @dev Emitted when ETH is swapped for a specified token.
* @param sender The address of the party initiating the swap.
* @param ethAmount The amount of ETH being sent.
* @param token The address of the token being received.
* @param tokenAmount The amount of the token being received.
* This event is triggered after a successful swap operation, where the sender swaps ETH for a specified token.
* It logs the sender's address, the amount of ETH swapped, the address of the token received, and the amount
* of the token received. This information can be used for tracking and verification purposes.
*/
event EthereumSwappedToToken(address indexed sender, address indexed eth, address indexed token, uint ethAmount, uint tokenAmount);
/**
* @dev Emitted when the default stablecoin is swapped for a specified token.
* @param sender The address of the party initiating the swap.
* @param stablecoin The address of the stablecoin being sent.
* @param token The address of the token being received.
* @param stablecoinAmount The amount of the stablecoin being sent.
* @param tokenAmount The amount of the token being received.
* This event is triggered after a successful swap operation, where the sender swaps the default stablecoin
* for a specified token. It logs the sender's address, the address of the stablecoin swapped, the address
* of the token received, and the amounts of the stablecoin and token involved in the swap. This provides
* transparency and traceability for swap operations involving stablecoins and tokens.
*/
event DefaultStablecoinSwappedToToken(address indexed sender, address indexed stablecoin, address indexed token, uint stablecoinAmount, uint tokenAmount);
/**
* @dev Array to store the symbols of tokens added to the contract. This array is essential for tracking the symbols of all tokens added, as Solidity's mappings do not support iteration. The symbols in this array correspond to the keys in the tokenList mapping, enabling the retrieval of token contract addresses and the iteration over all tokens in the TokenListDetails function.
*/
string[] private tokenSymbols;
/**
* @dev Mapping of token symbols to their decimal places.
*/
mapping(string => uint8) private tokenDecimals;
/**
* @dev Mapping of token addresses to their registered balance in the contract.
*/
mapping(address => uint) private tokenRegisteredBalances;
/**
* @dev Mapping of addresses to their registered ETH deposit in the contract.
*/
mapping(address => uint) private registeredETHDeposit;
/**
* @dev Mapping of token symbols to their respective token contract addresses.
*/
mapping(string => address) private tokenList;
/**
* @dev Mapping of token symbols to their respective price feed contract addresses.
*/
mapping(string => address) private priceFeedList;
/**
* @dev Mapping of stablecoin symbols to their respective stablecoin contract addresses.
*/
mapping(string => address) private supportedStablecoin;
/**
* @dev Admin address managing the contract.
*/
address private admin;
/**
* @dev Maximum allowed slippage percent for token swaps.
*/
uint private maxSlippagePercent;
/**
* @dev Flag to prevent reentrant calls.
*/
bool private locked;
/**
* @dev Flag indicating if the contract setup is completed.
*/
bool private isSetup;
/**
* @dev Variable representing whether the contract is currently paused. A paused state indicates that certain functions of the contract,
* which are marked with modifiers to check the pause state, cannot be executed until the contract is unpaused. This is typically used
* as a security measure, allowing contract administrators to halt critical operations in the event of a security issue or major bug.
* The variable is set to true to pause the contract, and false to unpause it. Only privileged accounts (e.g., contract administrators)
* should have the ability to toggle this state to ensure controlled access to the pause functionality.
*/
bool private _paused;
/**
@dev The name of the contract.
*/
string private contractName;
/**
* @dev Modifier to make a function callable only by the admin account.
*/
modifier onlyAdmin() {
require(msg.sender == admin, "Only admin can call this function");
_;
}
/**
* @dev Modifier to ensure a function is called only once during the contract's lifetime.
*/
modifier setupOnce() {
require(!isSetup, "Setup already called!");
_;
isSetup = true;
}
/**
* @dev Modifier to prevent a contract from calling itself, directly or indirectly.
*/
modifier nonReentrant() {
require(!locked, "Reentrant call");
locked = true;
_;
locked = false;
}
// Modifier that allows function execution only when the contract is not paused
modifier whenNotPaused() {
require(!_paused, "Contract is paused"); // Checks if the contract is not paused
_; // Continues execution of the modified function
}
// Modifier that allows function execution only when the contract is paused
modifier whenPaused() {
require(_paused, "Contract is not paused"); // Checks if the contract is paused
_; // Continues execution of the modified function
}
// Function to pause the contract
function pause() public onlyAdmin whenNotPaused {
_paused = true; // Sets the contract state to paused
}
// Function to resume the contract's operations
function unpause() public onlyAdmin whenPaused {
_paused = false; // Sets the contract state to not paused
}
/**
* @dev Sets up initial configuration of the contract.
* This function can only be called once.
* It initializes the admin and maxSlippagePercent variables.
*/
function setup() public setupOnce {
admin = msg.sender;
maxSlippagePercent = 3000;
emit SetupCompleted(admin, maxSlippagePercent);
}
/**
* @dev Sets a new name for the contract.
* @param _name The new name to be set.
*/
function setContractName(string calldata _name) public onlyAdmin whenNotPaused {
require(keccak256(bytes(_name)) != keccak256(bytes(contractName)), "New name must be different from the current name"); // Checks if the new name is different from the current one
contractName = _name;
}
/**
* @dev Transfers the admin role to a new address.
* Can only be called by the current admin.
* @param newAdmin The address of the new admin.
*/
function transferAdmin(address newAdmin) public onlyAdmin {
require(newAdmin != address(0), "New admin cannot be the zero address");
admin = newAdmin;
emit AdminTransferred(admin, newAdmin);
}
/**
* @dev Returns the current maximum slippage percent set in the contract.
* @return The maximum slippage percent.
*/
function getMaxSlippagePercent() public view returns (uint) {
return maxSlippagePercent;
}
/**
* @dev Returns the boolean status indicating if the contract setup is completed.
* @return True if setup is completed, false otherwise.
*/
function getIsSetup() public view returns (bool) {
return isSetup;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function isPaused() public view returns (bool) {
return _paused;
}
/**
* @dev Retrieves the name of this contract.
* @return The name of the contract as a string.
*/
function getContractName() public view returns (string memory) {
return contractName;
}
/**
* @dev Returns the admin address of the contract.
* @return The address of the current admin.
*/
function getAdmin() public view returns (address) {
return admin;
}
/**
* @dev Retrieves the address of a token based on its symbol.
* @param tokenSymbol The symbol of the token.
* @return The address of the token.
*/
function getTokenAddress(string memory tokenSymbol) public view returns (address) {
require(tokenList[tokenSymbol] != address(0), "Token with this symbol does not exist");
return tokenList[tokenSymbol];
}
/**
* @dev Retrieves the decimal count for a given token symbol.
* @param tokenSymbol The symbol of the token.
* @return The number of decimals for the token.
*/
function getTokenDecimals(string memory tokenSymbol) public view returns (uint8) {
require(tokenDecimals[tokenSymbol] > 0, "Token symbol not found");
return tokenDecimals[tokenSymbol];
}
/**
* @dev Returns the address of the supported stablecoin in the contract.
* @return The address of the default stablecoin.
*/
function getSupportedStablecoin() public view returns (address) {
return supportedStablecoin["DEFAULT_STABLECOIN"];
}
/**
* @dev Retrieves the registered balance of a specified token.
* @param token The address of the token.
* @return The registered balance of the token.
*/
function getTokenRegisteredBalance(address token) public view returns (uint) {
return tokenRegisteredBalances[token];
}
/**
* @dev Retrieves the registered ETH deposit for a specific account.
* @param account The address of the account.
* @return The amount of registered ETH deposit.
*/
function getRegisteredETHDeposit(address account) public view returns (uint) {
return registeredETHDeposit[account];
}
/**
* @dev Returns a list of all token symbols and their respective addresses.
* This function iterates through the tokenSymbols array and retrieves addresses from the tokenList mapping.
* @return symbols Array of token symbols.
* @return addresses Array of corresponding token addresses.
*/
function TokenListDetails() public view returns (string[] memory symbols, address[] memory addresses) {
symbols = new string[](tokenSymbols.length);
addresses = new address[](tokenSymbols.length);
for (uint i = 0; i < tokenSymbols.length; i++) {
symbols[i] = tokenSymbols[i];
addresses[i] = tokenList[tokenSymbols[i]];
}
return (symbols, addresses);
}
/**
* @dev Checks if the slippage for a given token amount is within the set limits.
* @param tokenSymbol The symbol of the token.
* @param amount The amount of the token.
*/
function checkSlippage(string memory tokenSymbol, uint amount) private view {
require(tokenDecimals[tokenSymbol] > 0, "Token decimals not set");
int256 latestPrice = getLatestPrice(tokenSymbol);
uint256 latestAmount = (amount * uint256(latestPrice)) / 1e18;
latestAmount = latestAmount / 10 ** uint256(tokenDecimals[tokenSymbol]);
uint slippageAmount = (amount * maxSlippagePercent) / 1000;
require(latestAmount >= amount - slippageAmount && latestAmount <= amount + slippageAmount, "Slippage limit exceeded");
}
/**
* @dev Gets the latest price for a given token from its price feed.
* @param tokenSymbol The symbol of the token.
* @return The latest price of the token.
*/
function getLatestPrice(string memory tokenSymbol) public view returns (int256) {
IAggregator priceFeed = IAggregator(priceFeedList[tokenSymbol]);
return priceFeed.latestAnswer();
}
/**
* @dev Set the maximum slippage percent allowed for token price changes.
* @param _maxSlippagePercent The new maximum slippage percent to be set.
*/
function setMaxSlippagePercent(uint _maxSlippagePercent) public onlyAdmin {
require(_maxSlippagePercent <= 33333, "Slippage percent cannot be greater than 33.333%");
maxSlippagePercent = _maxSlippagePercent;
emit MaxSlippagePercentChanged(admin, _maxSlippagePercent);
}
/**
* @dev Executes a call to another contract.
* Can only be called by the admin.
* @param target The address of the target contract.
* @param data The calldata to be sent.
* @return success Indicates if the call was successful.
* @return result The data returned by the call.
*/
function execute(address target, bytes memory data) public onlyAdmin returns (bool, bytes memory) {
require(target != address(0), "Invalid target address");
(bool success, bytes memory result) = target.call(data);
require(success, "Execution failed");
emit Executed(target, data, result);
return (success, result);
}
/**
* @dev Allows multiple calls to different functions of this contract in a single transaction.
* @param data An array of payloads, each representing a function call with arguments.
* @return results An array of bytes, each representing the result of a corresponding function call.
*
* Each element in 'data' should be the ABI-encoded function signature and parameters.
* This function uses 'delegatecall' to execute each function call in the context of the current contract,
* ensuring that the state of the contract is maintained across calls.
* The function reverts if any of the calls fail, ensuring atomicity of the batch operation.
*/
function multicall(bytes[] calldata data) external returns (bytes[] memory results) {
results = new bytes[](data.length);
for (uint i = 0; i < data.length; i++) {
(bool success, bytes memory result) = address(this).delegatecall(data[i]);
require(success, "Multicall delegatecall failed");
results[i] = result;
}
return results;
}
/**
* @dev Adds a new token to the token list and updates the tokenSymbols array.
* This function can only be called by an admin. It stores the token's address in the tokenList mapping and adds the token's symbol to the tokenSymbols array for tracking.
* @param tokenSymbol The symbol of the token to add. This symbol is used as a key in the tokenList mapping and is added to the tokenSymbols array.
* @param tokenAddress The address of the token contract. This address is stored in the tokenList mapping, associated with the given token symbol.
*/
function addToken(string memory tokenSymbol, address tokenAddress) public onlyAdmin {
tokenList[tokenSymbol] = tokenAddress;
tokenSymbols.push(tokenSymbol);
emit TokenAdded(admin, tokenSymbol, tokenAddress);
}
/**
* @dev Adds a new price feed to the price feed list.
* Can only be called by the admin.
* @param tokenSymbol The symbol of the token for which to add the price feed.
* @param priceFeedAddress The address of the price feed contract.
*/
function addPriceFeed(string memory tokenSymbol, address priceFeedAddress) public onlyAdmin {
priceFeedList[tokenSymbol] = priceFeedAddress;
emit PriceFeedAdded(admin, tokenSymbol, priceFeedAddress);
}
/**
* @dev Adds a supported stablecoin to the contract.
* Can only be called by the admin.
* @param stablecoinSymbol The symbol of the stablecoin.
* @param stablecoinAddress The address of the stablecoin contract.
*/
function addSupportedStablecoin(string memory stablecoinSymbol, address stablecoinAddress) public onlyAdmin {
supportedStablecoin[stablecoinSymbol] = stablecoinAddress;
emit StablecoinAdded(admin, stablecoinSymbol, stablecoinAddress);
}
/**
* @dev Sets the number of decimals for a given token.
* @param tokenSymbol The symbol of the token.
* @param decimals The number of decimals.
*/
function setTokenDecimals(string memory tokenSymbol, uint8 decimals) public onlyAdmin {
require(decimals <= 18, "Decimals cannot be greater than 18");
tokenDecimals[tokenSymbol] = decimals;
emit TokenDecimalsSet(admin, tokenSymbol, decimals);
}
/**
* @dev Removes a token from both the tokenList mapping and the tokenSymbols array.
* First, it finds the token's address by its symbol from the tokenList mapping and checks if the token exists.
* Then, it removes the token's entry from the tokenList mapping.
* Next, it searches for the token's symbol in the tokenSymbols array, removes it by replacing it with the last element in the array, and then reduces the array's size by one.
* This is necessary because Solidity does not have a native way to remove an element from an array by its value.
* @param tokenSymbol The symbol of the token to remove.
*/
function removeToken(string memory tokenSymbol) public onlyAdmin {
// Retrieve the token address from the mapping using its symbol and check if it exists
address tokenAddress = tokenList[tokenSymbol];
require(tokenAddress != address(0), "Token not found");
// Remove the token's entry from the tokenList mapping
delete tokenList[tokenSymbol];
// Find the index of the token's symbol in the tokenSymbols array and remove it
for (uint i = 0; i < tokenSymbols.length; i++) {
if (keccak256(abi.encodePacked(tokenSymbols[i])) == keccak256(abi.encodePacked(tokenSymbol))) {
// Replace the token symbol to be removed with the last element in the array
tokenSymbols[i] = tokenSymbols[tokenSymbols.length - 1];
// Remove the last element (now duplicate) from the array
tokenSymbols.pop();
break;
}
}
// Emit an event for the removal of the token
emit RegisteredTokenRemoved(admin, tokenSymbol, tokenAddress);
}
/**
* @dev Removes a price feed from the price feed list.
* @param tokenSymbol The symbol of the token whose price feed is to be removed.
*/
function removePriceFeed(string memory tokenSymbol) public onlyAdmin {
address priceFeedAddress = priceFeedList[tokenSymbol];
require(priceFeedAddress != address(0), "Price feed not found");
delete priceFeedList[tokenSymbol];
emit PriceFeedRemoved(admin, tokenSymbol, priceFeedAddress);
}
/**
* @dev Removes a stablecoin from the supported stablecoin list.
* @param stablecoinSymbol The symbol of the stablecoin to remove.
*/
function removeSupportedStablecoin(string memory stablecoinSymbol) public onlyAdmin {
address stablecoinAddress = supportedStablecoin[stablecoinSymbol];
require(stablecoinAddress != address(0), "Stablecoin not found");
delete supportedStablecoin[stablecoinSymbol];
emit RegisteredStablecoinRemoved(admin, stablecoinSymbol, stablecoinAddress);
}
/**
* @dev Resets the number of decimals for a given token to zero.
* @param tokenSymbol The symbol of the token.
*/
function resetTokenDecimals(string memory tokenSymbol) public onlyAdmin {
delete tokenDecimals[tokenSymbol];
emit TokenDecimalsReset(admin, tokenSymbol);
}
/**
* @dev Deposit a specified amount of registered tokens into the contract.
* @param tokenSymbol The symbol of the token being deposited.
* @param amount The amount of tokens to deposit.
*/
function depositRegisteredToken(string memory tokenSymbol, uint amount) public onlyAdmin {
address tokenAddress = tokenList[tokenSymbol];
require(tokenAddress != address(0), "Token address cannot be zero");
require(IERC20(tokenAddress).transferFrom(msg.sender, address(this), amount), "Failed to transfer tokens to contract");
uint scaledAmount = amount * 10**uint256(tokenDecimals[tokenSymbol]);
increaseRegisteredTokenBalance(tokenAddress, scaledAmount);
emit RegisteredTokenDeposited(admin, tokenSymbol, msg.sender, amount);
}
/**
* @dev Increase the balance of registered tokens.
* @param token The address of the token whose balance is to be increased.
* @param amount The amount to increase the balance by.
*/
function increaseRegisteredTokenBalance(address token, uint amount) private {
tokenRegisteredBalances[token] += amount;
}
/**
* @dev Withdraw a specified amount of registered tokens from the contract.
* @param tokenSymbol The symbol of the token being withdrawn.
* @param amount The amount of tokens to withdraw.
*/
function withdrawRegisteredToken(string memory tokenSymbol, uint amount) public onlyAdmin {
address tokenAddress = tokenList[tokenSymbol];
require(tokenAddress != address(0), "Token address cannot be zero");
uint scaledAmount = amount * 10**uint256(tokenDecimals[tokenSymbol]);
require(tokenRegisteredBalances[tokenAddress] >= scaledAmount, "Insufficient balance");
decreaseRegisteredTokenBalance(tokenAddress, scaledAmount);
require(IERC20(tokenAddress).transfer(admin, amount), "Failed to transfer tokens to admin");
emit RegisteredTokenWithdrawn(admin, tokenSymbol, msg.sender, amount);
}
/**
* @dev Decrease the balance of registered tokens.
* @param token The address of the token whose balance is to be decreased.
* @param amount The amount to decrease the balance by.
*/
function decreaseRegisteredTokenBalance(address token, uint amount) private {
tokenRegisteredBalances[token] -= amount;
}
/**
* @dev Allows the contract's administrator to deposit Ether (ETH) into the contract. This function is critical for managing the liquidity
* within the contract, ensuring that there are sufficient ETH reserves for operations requiring payouts in ETH, such as token swaps to ETH
* or other functions that might be added to facilitate contract operations. The deposited ETH is tracked against the contract's address
* within an internal mapping, `registeredETHDeposit`, to segregate and manage ETH balances more effectively.
*
* The function is marked `payable` to accept ETH transfers and is restricted to execution by the contract's admin through the `onlyAdmin`
* modifier, ensuring that only authorized users can add liquidity to the contract. This function emits an `ETHDeposited` event upon
* successful deposit, providing transparency and auditability of ETH movements within the contract.
*
* Requirements:
* - The transaction must send a positive amount of ETH.
* - Only the contract's admin can call this function.
*
* @notice To deposit ETH into the contract, send a transaction with a positive ETH value to this function.
*/
function depositETH() public payable onlyAdmin {
require(msg.value > 0, "Deposit amount must be greater than 0");
registeredETHDeposit[address(this)] += msg.value;
emit ETHDeposited(admin, msg.value);
}
/**
* @dev Enables the contract's administrator to withdraw a specified amount of Ether (ETH) from the contract. This functionality is crucial
* for managing the contract's liquidity and for operational needs, such as rebalancing the liquidity pool, covering operational expenses,
* or responding to an emergency requiring the removal of assets from the contract.
*
* The function checks that the requested withdrawal amount is available within the contract's registered ETH balance, ensuring the integrity
* of the contract's liquidity is maintained and preventing over-withdrawal. It uses a low-level `call` to transfer ETH, which is recommended
* over `send` or `transfer` for its gas efficiency and ability to return a boolean success value. The successful execution of this call
* reduces the contract's `registeredETHDeposit` balance accordingly and emits an `ETHWithdrawn` event, providing an auditable trail of ETH
* withdrawals from the contract.
*
* Requirements:
* - The requested amount must be less than or equal to the contract's available ETH balance.
* - Only the contract's admin can initiate the withdrawal.
* - The ETH transfer must succeed; otherwise, the transaction is reverted.
*
* @param amount The amount of ETH to be withdrawn from the contract, specified in wei.
* @notice Ensure that the contract has enough ETH balance for the withdrawal to prevent transaction reversion.
*/
function withdrawETH(uint amount) public onlyAdmin {
require(amount <= registeredETHDeposit[address(this)], "Insufficient balance");
registeredETHDeposit[address(this)] -= amount;
(bool sent, ) = msg.sender.call{value: amount}("");
require(sent, "Failed to send ETH");
emit ETHWithdrawn(admin, amount);
}
/**
* @dev Performs a swap between two tokens, allowing a user to exchange one type of token for another based on current market rates.
* This function requires both tokens to be supported by the contract, checks that the token decimals have been set, and calculates
* the amount of the target token to be received using the latest price data. It ensures that the slippage between the expected
* and actual swap amounts is within acceptable limits. The function updates the internal balances of the tokens within the contract
* to reflect the swap and performs the necessary transfers between the user and the contract. This operation is protected against
* reentrancy attacks and can only be executed when the contract is not paused, ensuring the integrity of the swap process.
*
* @param tokenFrom The symbol of the token being sent by the user.
* @param tokenTo The symbol of the token the user wishes to receive.
* @param amount The amount of the `tokenFrom` that the user wants to swap.
*/
function swap(string memory tokenFrom, string memory tokenTo, uint amount) public nonReentrant whenNotPaused {
require(tokenList[tokenFrom] != address(0) && tokenList[tokenTo] != address(0), "Token not supported");
require(tokenDecimals[tokenFrom] > 0 && tokenDecimals[tokenTo] > 0, "Token decimals not set");
uint256 amountWithDecimals = amount * 10 ** uint256(tokenDecimals[tokenFrom]);
int256 priceFrom = getLatestPrice(tokenFrom);
int256 priceTo = getLatestPrice(tokenTo);
require(priceFrom > 0, "Price from must be greater than zero");
require(priceTo > 0, "Price to must be greater than zero");
uint256 amountTo = (amountWithDecimals * uint256(priceFrom)) / uint256(priceTo) / 10 ** uint256(tokenDecimals[tokenTo]);
checkSlippage(tokenTo, amount);
require(tokenRegisteredBalances[tokenList[tokenTo]] >= amountTo, "Insufficient registered token balance for send");
tokenRegisteredBalances[tokenList[tokenFrom]] += amount;
tokenRegisteredBalances[tokenList[tokenTo]] -= amountTo;
require(IERC20(tokenList[tokenFrom]).transferFrom(msg.sender, address(this), amount), "Failed to transfer tokens from sender");
require(IERC20(tokenList[tokenTo]).transfer(msg.sender, amountTo), "Failed to transfer tokens to sender");
emit TokensSwapped(msg.sender, tokenList[tokenFrom], tokenList[tokenTo], amountWithDecimals, amountTo);
}
/**
* @dev Allows a user to swap a specified amount of a given token for the contract's default stablecoin, leveraging the latest market
* price data to calculate the swap rate. This function is designed to provide users with a way to convert their tokens into a stable
* asset within the ecosystem. It verifies that both the source token and the default stablecoin are supported and that their decimal
* values are set. The function calculates the amount of stablecoin to be received, checks for slippage compliance, and then updates
* the internal balances before transferring the stablecoin to the user. Like other sensitive operations, it is guarded against
* reentrancy and is only available when the contract is operational (not paused).
*
* @param tokenFrom The symbol of the token being swapped by the user.
* @param amount The amount of `tokenFrom` that the user wants to convert into the default stablecoin.
*/
function swapTokenToDefaultStablecoin(string memory tokenFrom, uint amount) public nonReentrant whenNotPaused {
address stablecoinAddress = supportedStablecoin["DEFAULT_STABLECOIN"];
require(tokenList[tokenFrom] != address(0) && stablecoinAddress != address(0), "Token or default stablecoin not supported");
string memory stablecoinSymbol = "DEFAULT_STABLECOIN";
require(tokenDecimals[tokenFrom] > 0 && tokenDecimals[stablecoinSymbol] > 0, "Token decimals not set");
uint256 amountWithDecimals = amount * 10 ** uint256(tokenDecimals[tokenFrom]);
int256 priceFrom = getLatestPrice(tokenFrom);
int256 priceStablecoin = getLatestPrice(stablecoinSymbol);
require(priceFrom > 0, "Price from must be greater than zero");
require(priceStablecoin > 0, "Price stablecoin must be greater than zero");
uint256 amountStablecoin = (amountWithDecimals * uint256(priceFrom)) / uint256(priceStablecoin) / 10 ** uint256(tokenDecimals[stablecoinSymbol]);
checkSlippage(stablecoinSymbol, amountStablecoin);
require(tokenRegisteredBalances[stablecoinAddress] >= amountStablecoin, "Insufficient registered token balance for send");
tokenRegisteredBalances[tokenList[tokenFrom]] += amount;
tokenRegisteredBalances[stablecoinAddress] -= amountStablecoin;
require(IERC20(tokenList[tokenFrom]).transferFrom(msg.sender, address(this), amount), "Failed to transfer tokens from sender");
require(IERC20(stablecoinAddress).transfer(msg.sender, amountStablecoin), "Failed to transfer stablecoin to sender");
emit TokensSwappedToDefaultStablecoin(msg.sender, tokenList[tokenFrom], supportedStablecoin["DEFAULT_STABLECOIN"], amountWithDecimals, amountStablecoin);
}
/**
* @dev Facilitates the exchange of a specified token for ETH, using current market prices to determine the equivalent amount of ETH
* to be provided in return. This function caters to users looking to liquidate their tokens in exchange for Ethereum's native currency.
* It checks for the support and decimal configuration of the token, calculates the ETH amount based on the token's latest price, and
* performs slippage verification to ensure the trade's fairness. The swap reflects on the contract's internal token and ETH balances
* before executing the transfer of ETH to the user's address. The function is secured against reentrancy and operates only when the
* contract is active, ensuring a trusted environment for executing swaps.
*
* @param tokenFrom The symbol of the token users want to swap for ETH.
* @param amount The quantity of `tokenFrom` to be exchanged.
*/
function swapTokenToETH(string memory tokenFrom, uint amount) public nonReentrant whenNotPaused {
require(tokenList[tokenFrom] != address(0), "Token not supported");
require(tokenDecimals[tokenFrom] > 0, "Token decimals not set");
uint256 amountWithDecimals = amount * 10 ** uint256(tokenDecimals[tokenFrom]);
int256 priceFrom = getLatestPrice(tokenFrom);
int256 priceETH = getLatestPrice("ETH");
require(priceFrom > 0, "Price from must be greater than zero");
require(priceETH > 0, "Price ETH must be greater than zero");
uint256 amountETH = (amountWithDecimals * uint256(priceFrom)) / uint256(priceETH);
checkSlippage("ETH", amountETH);
require(registeredETHDeposit[address(this)] >= amount, "Insufficient registered ETH deposit for send");
tokenRegisteredBalances[tokenList[tokenFrom]] += amount;
registeredETHDeposit[address(this)] -= amountETH;
require(IERC20(tokenList[tokenFrom]).transferFrom(msg.sender, address(this), amount), "Failed to transfer tokens from sender");
(bool sent, ) = msg.sender.call{value: amountETH}("");
require(sent, "Failed to send ETH to sender");
emit TokensSwappedToETH(msg.sender, tokenList[tokenFrom], amountWithDecimals, amountETH);
}
/**
* @dev Enables the conversion of the contract's default stablecoin into a specified token, offering users a pathway to diversify
* or invest their stable assets into other tokens. It requires that both the stablecoin and the target token are recognized and
* verifies the precision (decimals) of each. The swap amount in the target token is determined by current price feeds, with slippage
* checks ensuring the swap's terms remain within predefined thresholds. Adjustments are made to the contract's tracked balances of
* the stablecoin and the target token to accurately reflect the swap, followed by the actual transfer of the target token to the user.
* This function is protected from reentrancy and is executable solely when the contract is not paused.
*
* @param tokenTo The symbol of the token the user desires in exchange for the default stablecoin.
* @param amount The amount of the default stablecoin the user wishes to swap.
*/
function swapDefaultStablecoinToToken(string memory tokenTo, uint amount) public nonReentrant whenNotPaused {
address stablecoinAddress = supportedStablecoin["DEFAULT_STABLECOIN"];
require(stablecoinAddress != address(0) && tokenList[tokenTo] != address(0), "Stablecoin or token not supported");
require(tokenDecimals["DEFAULT_STABLECOIN"] > 0 && tokenDecimals[tokenTo] > 0, "Token decimals not set");
uint256 amountWithDecimals = amount * 10 ** uint256(tokenDecimals["DEFAULT_STABLECOIN"]);
int256 priceStablecoin = getLatestPrice("DEFAULT_STABLECOIN");
int256 priceTo = getLatestPrice(tokenTo);
require(priceStablecoin > 0, "Price stablecoin must be greater than zero");
require(priceTo > 0, "Price to must be greater than zero");
uint256 amountTo = (amountWithDecimals * uint256(priceStablecoin)) / uint256(priceTo);
amountTo = amountTo / 10 ** uint256(tokenDecimals[tokenTo]);
checkSlippage(tokenTo, amountTo);
require(tokenRegisteredBalances[tokenList[tokenTo]] >= amountTo, "Insufficient registered token balance for send");
tokenRegisteredBalances[stablecoinAddress] += amount;
tokenRegisteredBalances[tokenList[tokenTo]] -= amountTo;
require(IERC20(stablecoinAddress).transferFrom(msg.sender, address(this), amount), "Failed to transfer stablecoin from sender");
require(IERC20(tokenList[tokenTo]).transfer(msg.sender, amountTo), "Failed to transfer token to sender");
emit DefaultStablecoinSwappedToToken(msg.sender, supportedStablecoin["DEFAULT_STABLECOIN"], tokenList[tokenTo], amountWithDecimals, amountTo);
}
/**
* @dev Allows users to directly swap ETH for a specific token, calculating the amount of the token they will receive based on the
* current ETH to token exchange rate. This function caters to users looking to quickly enter the token market using ETH. It verifies
* the target token's support status and decimal configuration, then calculates the token amount using up-to-date price information.
* Slippage checks are applied to ensure the exchange rate is fair. The contract's ETH balance is increased by the swap amount, and
* the corresponding token amount is deducted from the contract's balance and transferred to the user. This operation is shielded
* against reentrancy and can be performed only while the contract is in an active state.
*
* @param tokenTo The symbol of the token the user wants in exchange for their ETH.
* Note: The function is payable, allowing it to accept ETH directly from the transaction.
*/
function swapETHToToken(string memory tokenTo) public payable nonReentrant whenNotPaused {
require(msg.value > 0, "Amount of ETH must be greater than 0");
require(tokenList[tokenTo] != address(0), "Token not supported");
require(tokenDecimals[tokenTo] > 0, "Token decimals not set");
int256 priceETH = getLatestPrice("ETH");
int256 priceTo = getLatestPrice(tokenTo);
require(priceETH > 0, "Price ETH must be greater than zero");
require(priceTo > 0, "Price to must be greater than zero");
uint256 amountETH = msg.value;
uint256 amountTo = (amountETH * uint256(priceETH)) / uint256(priceTo);
amountTo = amountTo / 10 ** uint256(tokenDecimals[tokenTo]);
checkSlippage(tokenTo, amountTo);
require(tokenRegisteredBalances[tokenList[tokenTo]] >= amountTo, "Insufficient registered token balance for send");
registeredETHDeposit[address(this)] += amountETH;
tokenRegisteredBalances[tokenList[tokenTo]] -= amountTo;
require(IERC20(tokenList[tokenTo]).transfer(msg.sender, amountTo), "Failed to transfer tokens to sender");
emit EthereumSwappedToToken(msg.sender, address(0), tokenList[tokenTo], amountETH, amountTo);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"newBlockLimit","type":"uint256"}],"name":"BlockLimitChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"stablecoin","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"stablecoinAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"DefaultStablecoinSwappedToToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"eth","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"EthereumSwappedToToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"result","type":"bytes"}],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"newMaxSlippagePercent","type":"uint256"}],"name":"MaxSlippagePercentChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":false,"internalType":"address","name":"priceFeedAddress","type":"address"}],"name":"PriceFeedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":false,"internalType":"address","name":"priceFeedAddress","type":"address"}],"name":"PriceFeedRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"string","name":"stablecoinSymbol","type":"string"},{"indexed":false,"internalType":"address","name":"stablecoinAddress","type":"address"}],"name":"RegisteredStablecoinRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RegisteredTokenDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"RegisteredTokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RegisteredTokenWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"maxSlippagePercent","type":"uint256"}],"name":"SetupCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"string","name":"stablecoinSymbol","type":"string"},{"indexed":false,"internalType":"address","name":"stablecoinAddress","type":"address"}],"name":"StablecoinAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"}],"name":"TokenDecimalsReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":false,"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"TokenDecimalsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"tokenFrom","type":"address"},{"indexed":true,"internalType":"address","name":"tokenTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountFrom","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountTo","type":"uint256"}],"name":"TokensSwapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"tokenFrom","type":"address"},{"indexed":true,"internalType":"address","name":"stablecoin","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountFrom","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountStablecoin","type":"uint256"}],"name":"TokensSwappedToDefaultStablecoin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"tokenFrom","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountFrom","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountETH","type":"uint256"}],"name":"TokensSwappedToETH","type":"event"},{"inputs":[],"name":"TokenListDetails","outputs":[{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"address","name":"priceFeedAddress","type":"address"}],"name":"addPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"stablecoinSymbol","type":"string"},{"internalType":"address","name":"stablecoinAddress","type":"address"}],"name":"addSupportedStablecoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositRegisteredToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsSetup","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"name":"getLatestPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSlippagePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getRegisteredETHDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupportedStablecoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"name":"getTokenDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenRegisteredBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"name":"removePriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"stablecoinSymbol","type":"string"}],"name":"removeSupportedStablecoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"name":"removeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"name":"resetTokenDecimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setContractName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSlippagePercent","type":"uint256"}],"name":"setMaxSlippagePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"setTokenDecimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenFrom","type":"string"},{"internalType":"string","name":"tokenTo","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenTo","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapDefaultStablecoinToToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenTo","type":"string"}],"name":"swapETHToToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenFrom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapTokenToDefaultStablecoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenFrom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapTokenToETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawRegisteredToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561000f575f80fd5b506149a18061001d5f395ff3fe608060405260043610610212575f3560e01c806395aea9e31161011e578063ba0bba40116100a8578063e666e8271161006d578063e666e82714610638578063f14210a61461065a578063f5f5ba7214610679578063f6326fb31461069a578063f66a1b71146106a2575f80fd5b8063ba0bba4014610593578063c4091236146105a7578063d211d29d146105c6578063db904dfa146105e5578063e0d9cc5214610604575f80fd5b8063a451f602116100ee578063a451f602146104ed578063ac9650d81461050c578063b0b22c2c14610538578063b187bd2614610557578063b651772714610574575f80fd5b806395aea9e31461046857806396e947f3146104875780639e16ac18146104a65780639f40d0cd146104c5575f80fd5b806354f97fc81161019f578063756885121161016f57806375688512146103e457806375829def146104035780638456cb59146104225780638897cd4e146104365780638a1dfab214610455575f80fd5b806354f97fc8146103615780635d04be71146103805780636e9960c31461039f57806371625172146103d0575f80fd5b80630dc16e1f116101e55780630dc16e1f146102ce5780631cff79cd146102ed5780631f4559221461031a5780632dc53d52146103395780633f4ba83a1461034d575f80fd5b8063020e3c6414610216578063042d2b811461024c578063061a45ea1461028e5780630b5ee006146102af575b5f80fd5b348015610221575f80fd5b50610235610230366004613be4565b6106c1565b60405160ff90911681526020015b60405180910390f35b348015610257575f80fd5b50610280610266366004613c38565b6001600160a01b03165f9081526003602052604090205490565b604051908152602001610243565b348015610299575f80fd5b506102ad6102a8366004613c51565b61075a565b005b3480156102ba575f80fd5b506102ad6102c9366004613c9b565b610802565b3480156102d9575f80fd5b506102ad6102e8366004613c51565b6108fc565b3480156102f8575f80fd5b5061030c610307366004613d06565b610998565b604051610243929190613db0565b348015610325575f80fd5b506102ad610334366004613be4565b610b03565b348015610344575f80fd5b50600854610280565b348015610358575f80fd5b506102ad610d04565b34801561036c575f80fd5b506102ad61037b366004613dca565b610d8d565b34801561038b575f80fd5b506102ad61039a366004613be4565b61134c565b3480156103aa575f80fd5b506007546001600160a01b03165b6040516001600160a01b039091168152602001610243565b3480156103db575f80fd5b506103b86113e2565b3480156103ef575f80fd5b506102ad6103fe366004613dca565b61140f565b34801561040e575f80fd5b506102ad61041d366004613c38565b611610565b34801561042d575f80fd5b506102ad6116ea565b348015610441575f80fd5b506102ad610450366004613dca565b611750565b6102ad610463366004613be4565b611cb6565b348015610473575f80fd5b506102ad610482366004613dca565b6120b6565b348015610492575f80fd5b506102ad6104a1366004613dca565b612524565b3480156104b1575f80fd5b506102ad6104c0366004613be4565b612777565b3480156104d0575f80fd5b50600954610100900460ff165b6040519015158152602001610243565b3480156104f8575f80fd5b506102ad610507366004613e0b565b61287a565b348015610517575f80fd5b5061052b610526366004613e72565b612d90565b6040516102439190613ece565b348015610543575f80fd5b506102ad610552366004613c51565b612ede565b348015610562575f80fd5b5060095462010000900460ff166104dd565b34801561057f575f80fd5b506102ad61058e366004613f30565b612fc2565b34801561059e575f80fd5b506102ad61309a565b3480156105b2575f80fd5b506103b86105c1366004613be4565b61314b565b3480156105d1575f80fd5b506102ad6105e0366004613f47565b613209565b3480156105f0575f80fd5b506102ad6105ff366004613be4565b613303565b34801561060f575f80fd5b5061028061061e366004613c38565b6001600160a01b03165f9081526002602052604090205490565b348015610643575f80fd5b5061064c613406565b604051610243929190613f9a565b348015610665575f80fd5b506102ad610674366004613f30565b6135e7565b348015610684575f80fd5b5061068d613752565b604051610243919061403b565b6102ad6137e2565b3480156106ad575f80fd5b506102806106bc366004613be4565b6138d0565b5f806001836040516106d3919061404d565b9081526040519081900360200190205460ff16116107315760405162461bcd60e51b8152602060048201526016602482015275151bdad95b881cde5b589bdb081b9bdd08199bdd5b9960521b60448201526064015b60405180910390fd5b600182604051610741919061404d565b9081526040519081900360200190205460ff1692915050565b6007546001600160a01b031633146107845760405162461bcd60e51b815260040161072890614068565b80600683604051610795919061404d565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055600754909116907fab34b49b18f318eb4e6a66695a89a75e5c5a9f487cdd8e873fb28a86093424ad906107f690859085906140a9565b60405180910390a25050565b6007546001600160a01b0316331461082c5760405162461bcd60e51b815260040161072890614068565b60095462010000900460ff16156108555760405162461bcd60e51b8152600401610728906140d2565b600a60405161086491906141a5565b6040518091039020828260405161087c9291906141b0565b6040518091039020036108ea5760405162461bcd60e51b815260206004820152603060248201527f4e6577206e616d65206d75737420626520646966666572656e742066726f6d2060448201526f7468652063757272656e74206e616d6560801b6064820152608401610728565b600a6108f7828483614217565b505050565b6007546001600160a01b031633146109265760405162461bcd60e51b815260040161072890614068565b80600583604051610937919061404d565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055600754909116907f56a6384078cf12638a88549cfa205f6ffa35c02080d0003d704abcfb4118f6d1906107f690859085906140a9565b6007545f906060906001600160a01b031633146109c75760405162461bcd60e51b815260040161072890614068565b6001600160a01b038416610a165760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746172676574206164647265737360501b6044820152606401610728565b5f80856001600160a01b031685604051610a30919061404d565b5f604051808303815f865af19150503d805f8114610a69576040519150601f19603f3d011682016040523d82523d5f602084013e610a6e565b606091505b509150915081610ab35760405162461bcd60e51b815260206004820152601060248201526f115e1958dd5d1a5bdb8819985a5b195960821b6044820152606401610728565b856001600160a01b03167fc96720f35dd524e76ea92971ce13d08e9a17816bf3b0008a7083e6032354ebb58683604051610aee9291906142cb565b60405180910390a290925090505b9250929050565b6007546001600160a01b03163314610b2d5760405162461bcd60e51b815260040161072890614068565b5f600482604051610b3e919061404d565b908152604051908190036020019020546001600160a01b0316905080610b985760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606401610728565b600482604051610ba8919061404d565b90815260405190819003602001902080546001600160a01b03191690555f5b5f54811015610cc25782604051602001610be1919061404d565b604051602081830303815290604052805190602001205f8281548110610c0957610c096142f8565b905f5260205f2001604051602001610c2191906141a5565b6040516020818303038152906040528051906020012003610cba575f8054610c4b90600190614320565b81548110610c5b57610c5b6142f8565b905f5260205f20015f8281548110610c7557610c756142f8565b905f5260205f20019081610c899190614333565b505f805480610c9a57610c9a614402565b600190038181905f5260205f20015f610cb39190613aee565b9055610cc2565b600101610bc7565b506007546040516001600160a01b03909116907f19b683043270eb6b669d7c737605664dcc114eb222d5c6af4aaf913cf3939918906107f690859085906140a9565b6007546001600160a01b03163314610d2e5760405162461bcd60e51b815260040161072890614068565b60095462010000900460ff16610d7f5760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9858dd081a5cc81b9bdd081c185d5cd95960521b6044820152606401610728565b6009805462ff000019169055565b60095460ff1615610db05760405162461bcd60e51b815260040161072890614416565b6009805460ff19166001179081905562010000900460ff1615610de55760405162461bcd60e51b8152600401610728906140d2565b5f6006604051610df49061443e565b908152604051908190036020019020546001600160a01b031690508015801590610e4f57505f6001600160a01b0316600484604051610e33919061404d565b908152604051908190036020019020546001600160a01b031614155b610ea55760405162461bcd60e51b815260206004820152602160248201527f537461626c65636f696e206f7220746f6b656e206e6f7420737570706f7274656044820152601960fa1b6064820152608401610728565b5f6001604051610eb49061443e565b9081526040519081900360200190205460ff16118015610ef557505f600184604051610ee0919061404d565b9081526040519081900360200190205460ff16115b610f115760405162461bcd60e51b81526004016107289061445c565b5f6001604051610f209061443e565b90815260405190819003602001902054610f3e9060ff16600a61456c565b610f489084614577565b90505f610f7e604051806040016040528060128152602001712222a320aaa62a2fa9aa20a12622a1a7a4a760711b8152506138d0565b90505f610f8a866138d0565b90505f8213610fab5760405162461bcd60e51b81526004016107289061458e565b5f8113610fca5760405162461bcd60e51b8152600401610728906145d8565b5f81610fd68486614577565b610fe0919061461a565b9050600187604051610ff2919061404d565b908152604051908190036020019020546110109060ff16600a61456c565b61101a908261461a565b9050611026878261395d565b8060025f60048a60405161103a919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f205410156110805760405162461bcd60e51b815260040161072890614639565b6001600160a01b0385165f90815260026020526040812080548892906110a7908490614687565b925050819055508060025f60048a6040516110c2919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f90812080549091906110fb908490614320565b90915550506040516323b872dd60e01b81526001600160a01b038616906323b872dd9061113090339030908b9060040161469a565b6020604051808303815f875af115801561114c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061117091906146be565b6111ce5760405162461bcd60e51b815260206004820152602960248201527f4661696c656420746f207472616e7366657220737461626c65636f696e20667260448201526837b69039b2b73232b960b91b6064820152608401610728565b6004876040516111de919061404d565b9081526040519081900360200181205463a9059cbb60e01b8252336004830152602482018390526001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015611234573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125891906146be565b6112af5760405162461bcd60e51b815260206004820152602260248201527f4661696c656420746f207472616e7366657220746f6b656e20746f2073656e6460448201526132b960f11b6064820152608401610728565b6004876040516112bf919061404d565b908152604051908190036020018120546001600160a01b0316906006906112e59061443e565b908152604080519182900360209081018320548884529083018590526001600160a01b03169133917f2caf580882d3b6cd8363b8bfc5cf12ef330a9094151675ce8b65bb1df6620bde91015b60405180910390a450506009805460ff191690555050505050565b6007546001600160a01b031633146113765760405162461bcd60e51b815260040161072890614068565b600181604051611386919061404d565b908152604051908190036020018120805460ff191690556007546001600160a01b0316907fb0fec59d2bbf6b7a5185042e8171dd69f8b2c1870a1110a3edf6daf5c2ad6b5a906113d790849061403b565b60405180910390a250565b5f60066040516113f19061443e565b908152604051908190036020019020546001600160a01b0316919050565b6007546001600160a01b031633146114395760405162461bcd60e51b815260040161072890614068565b5f60048360405161144a919061404d565b908152604051908190036020019020546001600160a01b03169050806114b25760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616464726573732063616e6e6f74206265207a65726f000000006044820152606401610728565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd906114e29033903090879060040161469a565b6020604051808303815f875af11580156114fe573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152291906146be565b61157c5760405162461bcd60e51b815260206004820152602560248201527f4661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e6044820152641d1c9858dd60da1b6064820152608401610728565b5f60018460405161158d919061404d565b908152604051908190036020019020546115ab9060ff16600a61456c565b6115b59084614577565b90506115c18282613a97565b60075460405133916001600160a01b0316907ff38a3543e542beb8a2a4748b18bb39f73c76d90e88d93d0e22482034a29fb66a9061160290889088906146dd565b60405180910390a350505050565b6007546001600160a01b0316331461163a5760405162461bcd60e51b815260040161072890614068565b6001600160a01b03811661169c5760405162461bcd60e51b8152602060048201526024808201527f4e65772061646d696e2063616e6e6f7420626520746865207a65726f206164646044820152637265737360e01b6064820152608401610728565b600780546001600160a01b0319166001600160a01b0383169081179091556040518181527ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec6906020016113d7565b6007546001600160a01b031633146117145760405162461bcd60e51b815260040161072890614068565b60095462010000900460ff161561173d5760405162461bcd60e51b8152600401610728906140d2565b6009805462ff0000191662010000179055565b60095460ff16156117735760405162461bcd60e51b815260040161072890614416565b6009805460ff19166001179081905562010000900460ff16156117a85760405162461bcd60e51b8152600401610728906140d2565b5f60066040516117b79061443e565b908152604051908190036020018120546001600160a01b031691505f906004906117e290869061404d565b908152604051908190036020019020546001600160a01b03161480159061181157506001600160a01b03811615155b61186f5760405162461bcd60e51b815260206004820152602960248201527f546f6b656e206f722064656661756c7420737461626c65636f696e206e6f74206044820152681cdd5c1c1bdc9d195960ba1b6064820152608401610728565b60408051808201825260128152712222a320aaa62a2fa9aa20a12622a1a7a4a760711b602082015290515f906001906118a990879061404d565b9081526040519081900360200190205460ff161180156118ea57505f6001826040516118d5919061404d565b9081526040519081900360200190205460ff16115b6119065760405162461bcd60e51b81526004016107289061445c565b5f600185604051611917919061404d565b908152604051908190036020019020546119359060ff16600a61456c565b61193f9085614577565b90505f61194b866138d0565b90505f611957846138d0565b90505f82136119785760405162461bcd60e51b8152600401610728906146fe565b5f81136119975760405162461bcd60e51b81526004016107289061458e565b5f6001856040516119a8919061404d565b908152604051908190036020019020546119c69060ff16600a61456c565b826119d18587614577565b6119db919061461a565b6119e5919061461a565b90506119f1858261395d565b6001600160a01b0386165f90815260026020526040902054811115611a285760405162461bcd60e51b815260040161072890614639565b8660025f60048b604051611a3c919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f9081208054909190611a75908490614687565b90915550506001600160a01b0386165f9081526002602052604081208054839290611aa1908490614320565b9091555050604051600490611ab7908a9061404d565b908152604051908190036020018120546323b872dd60e01b82526001600160a01b0316906323b872dd90611af390339030908c9060040161469a565b6020604051808303815f875af1158015611b0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3391906146be565b611b4f5760405162461bcd60e51b815260040161072890614742565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0387169063a9059cbb906044016020604051808303815f875af1158015611b99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbd91906146be565b611c195760405162461bcd60e51b815260206004820152602760248201527f4661696c656420746f207472616e7366657220737461626c65636f696e20746f6044820152661039b2b73232b960c91b6064820152608401610728565b6006604051611c279061443e565b908152604051908190036020018120546001600160a01b031690600490611c4f908b9061404d565b908152604080519182900360209081018320548884529083018590526001600160a01b03169133917f340b064ebb1385106e514c3c621d1792907646d7a3ec01a20dee931f09677436910160405180910390a450506009805460ff19169055505050505050565b60095460ff1615611cd95760405162461bcd60e51b815260040161072890614416565b6009805460ff19166001179081905562010000900460ff1615611d0e5760405162461bcd60e51b8152600401610728906140d2565b5f3411611d695760405162461bcd60e51b8152602060048201526024808201527f416d6f756e74206f6620455448206d75737420626520677265617465722074686044820152630616e20360e41b6064820152608401610728565b5f6001600160a01b0316600482604051611d83919061404d565b908152604051908190036020019020546001600160a01b031603611db95760405162461bcd60e51b815260040161072890614787565b5f600182604051611dca919061404d565b9081526040519081900360200190205460ff1611611dfa5760405162461bcd60e51b81526004016107289061445c565b5f611e1f6040518060400160405280600381526020016208aa8960eb1b8152506138d0565b90505f611e2b836138d0565b90505f8213611e4c5760405162461bcd60e51b8152600401610728906147b4565b5f8113611e6b5760405162461bcd60e51b8152600401610728906145d8565b345f82611e788584614577565b611e82919061461a565b9050600185604051611e94919061404d565b90815260405190819003602001902054611eb29060ff16600a61456c565b611ebc908261461a565b9050611ec8858261395d565b8060025f600488604051611edc919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f20541015611f225760405162461bcd60e51b815260040161072890614639565b305f9081526003602052604081208054849290611f40908490614687565b925050819055508060025f600488604051611f5b919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f9081208054909190611f94908490614320565b9091555050604051600490611faa90879061404d565b9081526040519081900360200181205463a9059cbb60e01b8252336004830152602482018390526001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015612000573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061202491906146be565b6120405760405162461bcd60e51b8152600401610728906147f7565b600485604051612050919061404d565b908152604080519182900360209081018320548584529083018490526001600160a01b0316915f9133917fe6035c20cab4d5e8328910a0eae0e293df99cf8674d0a7fbebd6ee580c2cbcba910160405180910390a450506009805460ff19169055505050565b60095460ff16156120d95760405162461bcd60e51b815260040161072890614416565b6009805460ff19166001179081905562010000900460ff161561210e5760405162461bcd60e51b8152600401610728906140d2565b5f6001600160a01b0316600483604051612128919061404d565b908152604051908190036020019020546001600160a01b03160361215e5760405162461bcd60e51b815260040161072890614787565b5f60018360405161216f919061404d565b9081526040519081900360200190205460ff161161219f5760405162461bcd60e51b81526004016107289061445c565b5f6001836040516121b0919061404d565b908152604051908190036020019020546121ce9060ff16600a61456c565b6121d89083614577565b90505f6121e4846138d0565b90505f61220b6040518060400160405280600381526020016208aa8960eb1b8152506138d0565b90505f821361222c5760405162461bcd60e51b8152600401610728906146fe565b5f811361224b5760405162461bcd60e51b8152600401610728906147b4565b5f816122578486614577565b612261919061461a565b90506122886040518060400160405280600381526020016208aa8960eb1b8152508261395d565b305f908152600360205260409020548511156122fb5760405162461bcd60e51b815260206004820152602c60248201527f496e73756666696369656e74207265676973746572656420455448206465706f60448201526b1cda5d08199bdc881cd95b9960a21b6064820152608401610728565b8460025f60048960405161230f919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f9081208054909190612348908490614687565b9091555050305f908152600360205260408120805483929061236b908490614320565b909155505060405160049061238190889061404d565b908152604051908190036020018120546323b872dd60e01b82526001600160a01b0316906323b872dd906123bd90339030908a9060040161469a565b6020604051808303815f875af11580156123d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123fd91906146be565b6124195760405162461bcd60e51b815260040161072890614742565b6040515f90339083908381818185875af1925050503d805f8114612458576040519150601f19603f3d011682016040523d82523d5f602084013e61245d565b606091505b50509050806124ae5760405162461bcd60e51b815260206004820152601c60248201527f4661696c656420746f2073656e642045544820746f2073656e646572000000006044820152606401610728565b6004876040516124be919061404d565b908152604080519182900360209081018320548884529083018590526001600160a01b03169133917fcad30dc2d197d2b3a78edd54230921645efb2346fba9b44bf73eb55deb9fe0b1910160405180910390a350506009805460ff191690555050505050565b6007546001600160a01b0316331461254e5760405162461bcd60e51b815260040161072890614068565b5f60048360405161255f919061404d565b908152604051908190036020019020546001600160a01b03169050806125c75760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616464726573732063616e6e6f74206265207a65726f000000006044820152606401610728565b5f6001846040516125d8919061404d565b908152604051908190036020019020546125f69060ff16600a61456c565b6126009084614577565b6001600160a01b0383165f908152600260205260409020549091508111156126615760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610728565b61266b8282613ac7565b60075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018590529083169063a9059cbb906044016020604051808303815f875af11580156126bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126df91906146be565b6127365760405162461bcd60e51b815260206004820152602260248201527f4661696c656420746f207472616e7366657220746f6b656e7320746f2061646d60448201526134b760f11b6064820152608401610728565b60075460405133916001600160a01b0316907f62078e50b1946ffe178c6b7c4a9f20734ba073969a7887c7606f4a0fd6eaa4cc9061160290889088906146dd565b6007546001600160a01b031633146127a15760405162461bcd60e51b815260040161072890614068565b5f6006826040516127b2919061404d565b908152604051908190036020019020546001600160a01b03169050806128115760405162461bcd60e51b815260206004820152601460248201527314dd18589b1958dbda5b881b9bdd08199bdd5b9960621b6044820152606401610728565b600682604051612821919061404d565b90815260405190819003602001812080546001600160a01b03191690556007546001600160a01b0316907fcce4c948189d415a2b8c9f7c90d8c905104ccde5499ee07c834c17bb80c1891c906107f690859085906140a9565b60095460ff161561289d5760405162461bcd60e51b815260040161072890614416565b6009805460ff19166001179081905562010000900460ff16156128d25760405162461bcd60e51b8152600401610728906140d2565b5f6001600160a01b03166004846040516128ec919061404d565b908152604051908190036020019020546001600160a01b03161480159061294457505f6001600160a01b0316600483604051612928919061404d565b908152604051908190036020019020546001600160a01b031614155b6129605760405162461bcd60e51b815260040161072890614787565b5f600184604051612971919061404d565b9081526040519081900360200190205460ff161180156129b257505f60018360405161299d919061404d565b9081526040519081900360200190205460ff16115b6129ce5760405162461bcd60e51b81526004016107289061445c565b5f6001846040516129df919061404d565b908152604051908190036020019020546129fd9060ff16600a61456c565b612a079083614577565b90505f612a13856138d0565b90505f612a1f856138d0565b90505f8213612a405760405162461bcd60e51b8152600401610728906146fe565b5f8113612a5f5760405162461bcd60e51b8152600401610728906145d8565b5f600186604051612a70919061404d565b90815260405190819003602001902054612a8e9060ff16600a61456c565b82612a998587614577565b612aa3919061461a565b612aad919061461a565b9050612ab9868661395d565b8060025f600489604051612acd919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f20541015612b135760405162461bcd60e51b815260040161072890614639565b8460025f60048a604051612b27919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f9081208054909190612b60908490614687565b925050819055508060025f600489604051612b7b919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f9081208054909190612bb4908490614320565b9091555050604051600490612bca90899061404d565b908152604051908190036020018120546323b872dd60e01b82526001600160a01b0316906323b872dd90612c0690339030908a9060040161469a565b6020604051808303815f875af1158015612c22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c4691906146be565b612c625760405162461bcd60e51b815260040161072890614742565b600486604051612c72919061404d565b9081526040519081900360200181205463a9059cbb60e01b8252336004830152602482018390526001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015612cc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cec91906146be565b612d085760405162461bcd60e51b8152600401610728906147f7565b600486604051612d18919061404d565b908152604051908190036020018120546001600160a01b031690600490612d40908a9061404d565b908152604080519182900360209081018320548884529083018590526001600160a01b03169133917fad56699d0f375866eb895ed27203058a36a713382aaded78eb6b67da266d43329101611331565b6060816001600160401b03811115612daa57612daa613b40565b604051908082528060200260200182016040528015612ddd57816020015b6060815260200190600190039081612dc85790505b5090505f5b82811015612ed6575f8030868685818110612dff57612dff6142f8565b9050602002810190612e11919061483a565b604051612e1f9291906141b0565b5f60405180830381855af49150503d805f8114612e57576040519150601f19603f3d011682016040523d82523d5f602084013e612e5c565b606091505b509150915081612eae5760405162461bcd60e51b815260206004820152601d60248201527f4d756c746963616c6c2064656c656761746563616c6c206661696c65640000006044820152606401610728565b80848481518110612ec157612ec16142f8565b60209081029190910101525050600101612de2565b505b92915050565b6007546001600160a01b03163314612f085760405162461bcd60e51b815260040161072890614068565b80600483604051612f19919061404d565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555f80546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301612f80838261487c565b506007546040516001600160a01b03909116907f554547a049025c151fdca80e2e2e3902790abe58e73d549426039ec4f0ed3b35906107f690859085906140a9565b6007546001600160a01b03163314612fec5760405162461bcd60e51b815260040161072890614068565b6182358111156130565760405162461bcd60e51b815260206004820152602f60248201527f536c6970706167652070657263656e742063616e6e6f7420626520677265617460448201526e6572207468616e2033332e3333332560881b6064820152608401610728565b60088190556007546040518281526001600160a01b03909116907ffe448b46a6631d90be911affa7ba36599785e76e7be4e9a167403244c572c3fb906020016113d7565b600954610100900460ff16156130ea5760405162461bcd60e51b8152602060048201526015602482015274536574757020616c72656164792063616c6c65642160581b6044820152606401610728565b600780546001600160a01b03191633908117909155610bb860088190556040519081527f9e4bd02b115dd3cb5ad86085de76fc3f2d3f9ea0b557c054c2d9cbdce10390139060200160405180910390a26009805461ff001916610100179055565b5f806001600160a01b0316600483604051613166919061404d565b908152604051908190036020019020546001600160a01b0316036131da5760405162461bcd60e51b815260206004820152602560248201527f546f6b656e207769746820746869732073796d626f6c20646f6573206e6f7420604482015264195e1a5cdd60da1b6064820152608401610728565b6004826040516131ea919061404d565b908152604051908190036020019020546001600160a01b031692915050565b6007546001600160a01b031633146132335760405162461bcd60e51b815260040161072890614068565b60128160ff1611156132925760405162461bcd60e51b815260206004820152602260248201527f446563696d616c732063616e6e6f742062652067726561746572207468616e20604482015261062760f31b6064820152608401610728565b806001836040516132a3919061404d565b908152604051908190036020018120805460ff9390931660ff19909316929092179091556007546001600160a01b0316907fb647660985c65b132326df526467806263eab56d06a9287af50bde3c3092bd34906107f69085908590614930565b6007546001600160a01b0316331461332d5760405162461bcd60e51b815260040161072890614068565b5f60058260405161333e919061404d565b908152604051908190036020019020546001600160a01b031690508061339d5760405162461bcd60e51b8152602060048201526014602482015273141c9a58d94819995959081b9bdd08199bdd5b9960621b6044820152606401610728565b6005826040516133ad919061404d565b90815260405190819003602001812080546001600160a01b03191690556007546001600160a01b0316907f3f80cadc404fdb2cbb36543870c2be2303f46e4a6a64850a614a14b5f7a2bb2a906107f690859085906140a9565b5f5460609081906001600160401b0381111561342457613424613b40565b60405190808252806020026020018201604052801561345757816020015b60608152602001906001900390816134425790505b505f549092506001600160401b0381111561347457613474613b40565b60405190808252806020026020018201604052801561349d578160200160208202803683370190505b5090505f5b5f548110156135e2575f81815481106134bd576134bd6142f8565b905f5260205f200180546134d0906140fe565b80601f01602080910402602001604051908101604052809291908181526020018280546134fc906140fe565b80156135475780601f1061351e57610100808354040283529160200191613547565b820191905f5260205f20905b81548152906001019060200180831161352a57829003601f168201915b505050505083828151811061355e5761355e6142f8565b602002602001018190525060045f828154811061357d5761357d6142f8565b905f5260205f200160405161359291906141a5565b9081526040519081900360200190205482516001600160a01b03909116908390839081106135c2576135c26142f8565b6001600160a01b03909216602092830291909101909101526001016134a2565b509091565b6007546001600160a01b031633146136115760405162461bcd60e51b815260040161072890614068565b305f908152600360205260409020548111156136665760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610728565b305f9081526003602052604081208054839290613684908490614320565b90915550506040515f90339083908381818185875af1925050503d805f81146136c8576040519150601f19603f3d011682016040523d82523d5f602084013e6136cd565b606091505b50509050806137135760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610728565b6007546040518381526001600160a01b03909116907f94b2de810873337ed265c5f8cf98c9cffefa06b8607f9a2f1fbaebdfbcfbef1c906020016107f6565b6060600a8054613761906140fe565b80601f016020809104026020016040519081016040528092919081815260200182805461378d906140fe565b80156137d85780601f106137af576101008083540402835291602001916137d8565b820191905f5260205f20905b8154815290600101906020018083116137bb57829003601f168201915b5050505050905090565b6007546001600160a01b0316331461380c5760405162461bcd60e51b815260040161072890614068565b5f34116138695760405162461bcd60e51b815260206004820152602560248201527f4465706f73697420616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b6064820152608401610728565b305f9081526003602052604081208054349290613887908490614687565b90915550506007546040513481526001600160a01b03909116907f6c703791f399558807424f489ccd811c72b4ff0b74af547264fad7c646776df09060200160405180910390a2565b5f806005836040516138e2919061404d565b9081526040805160209281900383018120546350d25bcd60e01b825291516001600160a01b03909216935083926350d25bcd926004808401938290030181865afa158015613932573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139569190614954565b9392505050565b5f60018360405161396e919061404d565b9081526040519081900360200190205460ff161161399e5760405162461bcd60e51b81526004016107289061445c565b5f6139a8836138d0565b90505f670de0b6b3a76400006139be8385614577565b6139c8919061461a565b90506001846040516139da919061404d565b908152604051908190036020019020546139f89060ff16600a61456c565b613a02908261461a565b90505f6103e860085485613a169190614577565b613a20919061461a565b9050613a2c8185614320565b8210158015613a445750613a408185614687565b8211155b613a905760405162461bcd60e51b815260206004820152601760248201527f536c697070616765206c696d69742065786365656465640000000000000000006044820152606401610728565b5050505050565b6001600160a01b0382165f9081526002602052604081208054839290613abe908490614687565b90915550505050565b6001600160a01b0382165f9081526002602052604081208054839290613abe908490614320565b508054613afa906140fe565b5f825580601f10613b09575050565b601f0160209004905f5260205f2090810190613b259190613b28565b50565b5b80821115613b3c575f8155600101613b29565b5090565b634e487b7160e01b5f52604160045260245ffd5b5f6001600160401b0380841115613b6d57613b6d613b40565b604051601f8501601f19908116603f01168101908282118183101715613b9557613b95613b40565b81604052809350858152868686011115613bad575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f830112613bd5575f80fd5b61395683833560208501613b54565b5f60208284031215613bf4575f80fd5b81356001600160401b03811115613c09575f80fd5b613c1584828501613bc6565b949350505050565b80356001600160a01b0381168114613c33575f80fd5b919050565b5f60208284031215613c48575f80fd5b61395682613c1d565b5f8060408385031215613c62575f80fd5b82356001600160401b03811115613c77575f80fd5b613c8385828601613bc6565b925050613c9260208401613c1d565b90509250929050565b5f8060208385031215613cac575f80fd5b82356001600160401b0380821115613cc2575f80fd5b818501915085601f830112613cd5575f80fd5b813581811115613ce3575f80fd5b866020828501011115613cf4575f80fd5b60209290920196919550909350505050565b5f8060408385031215613d17575f80fd5b613d2083613c1d565b915060208301356001600160401b03811115613d3a575f80fd5b8301601f81018513613d4a575f80fd5b613d5985823560208401613b54565b9150509250929050565b5f5b83811015613d7d578181015183820152602001613d65565b50505f910152565b5f8151808452613d9c816020860160208601613d63565b601f01601f19169290920160200192915050565b8215158152604060208201525f613c156040830184613d85565b5f8060408385031215613ddb575f80fd5b82356001600160401b03811115613df0575f80fd5b613dfc85828601613bc6565b95602094909401359450505050565b5f805f60608486031215613e1d575f80fd5b83356001600160401b0380821115613e33575f80fd5b613e3f87838801613bc6565b94506020860135915080821115613e54575f80fd5b50613e6186828701613bc6565b925050604084013590509250925092565b5f8060208385031215613e83575f80fd5b82356001600160401b0380821115613e99575f80fd5b818501915085601f830112613eac575f80fd5b813581811115613eba575f80fd5b8660208260051b8501011115613cf4575f80fd5b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015613f2357603f19888603018452613f11858351613d85565b94509285019290850190600101613ef5565b5092979650505050505050565b5f60208284031215613f40575f80fd5b5035919050565b5f8060408385031215613f58575f80fd5b82356001600160401b03811115613f6d575f80fd5b613f7985828601613bc6565b925050602083013560ff81168114613f8f575f80fd5b809150509250929050565b5f604082016040835280855180835260608501915060608160051b860101925060208088015f5b83811015613fef57605f19888703018552613fdd868351613d85565b95509382019390820190600101613fc1565b5050858403818701528651808552878201948201935091505f5b8281101561402e5784516001600160a01b031684529381019392810192600101614009565b5091979650505050505050565b602081525f6139566020830184613d85565b5f825161405e818460208701613d63565b9190910192915050565b60208082526021908201527f4f6e6c792061646d696e2063616e2063616c6c20746869732066756e6374696f6040820152603760f91b606082015260800190565b604081525f6140bb6040830185613d85565b905060018060a01b03831660208301529392505050565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b600181811c9082168061411257607f821691505b60208210810361413057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8154614142816140fe565b6001828116801561415a576001811461416f5761419b565b60ff198416875282151583028701945061419b565b855f526020805f205f5b858110156141925781548a820152908401908201614179565b50505082870194505b5050505092915050565b5f6139568284614136565b818382375f9101908152919050565b601f8211156108f757805f5260205f20601f840160051c810160208510156141e45750805b601f840160051c820191505b81811015613a90575f81556001016141f0565b5f19600383901b1c191660019190911b1790565b6001600160401b0383111561422e5761422e613b40565b6142428361423c83546140fe565b836141bf565b5f601f84116001811461426e575f851561425c5750838201355b6142668682614203565b845550613a90565b5f83815260208120601f198716915b8281101561429d578685013582556020948501946001909201910161427d565b50868210156142b9575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b604081525f6142dd6040830185613d85565b82810360208401526142ef8185613d85565b95945050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115612ed857612ed861430c565b81810361433e575050565b61434882546140fe565b6001600160401b0381111561435f5761435f613b40565b6143738161436d84546140fe565b846141bf565b5f601f82116001811461439f575f831561438d5750848201545b6143978482614203565b855550613a90565b5f8581526020808220868352908220601f198616925b838110156143d557828601548255600195860195909101906020016143b5565b50858310156143f257818501545f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52603160045260245ffd5b6020808252600e908201526d1499595b9d1c985b9d0818d85b1b60921b604082015260600190565b712222a320aaa62a2fa9aa20a12622a1a7a4a760711b815260120190565b602080825260169082015275151bdad95b88191958da5b585b1cc81b9bdd081cd95d60521b604082015260600190565b600181815b808511156144c657815f19048211156144ac576144ac61430c565b808516156144b957918102915b93841c9390800290614491565b509250929050565b5f826144dc57506001612ed8565b816144e857505f612ed8565b81600181146144fe576002811461450857614524565b6001915050612ed8565b60ff8411156145195761451961430c565b50506001821b612ed8565b5060208310610133831016604e8410600b8410161715614547575081810a612ed8565b614551838361448c565b805f19048211156145645761456461430c565b029392505050565b5f61395683836144ce565b8082028115828204841417612ed857612ed861430c565b6020808252602a908201527f507269636520737461626c65636f696e206d7573742062652067726561746572604082015269207468616e207a65726f60b01b606082015260800190565b60208082526022908201527f507269636520746f206d7573742062652067726561746572207468616e207a65604082015261726f60f01b606082015260800190565b5f8261463457634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e73756666696369656e74207265676973746572656420746f6b656e20626160408201526d1b185b98d948199bdc881cd95b9960921b606082015260800190565b80820180821115612ed857612ed861430c565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f602082840312156146ce575f80fd5b81518015158114613956575f80fd5b604081525f6146ef6040830185613d85565b90508260208301529392505050565b60208082526024908201527f50726963652066726f6d206d7573742062652067726561746572207468616e206040820152637a65726f60e01b606082015260800190565b60208082526025908201527f4661696c656420746f207472616e7366657220746f6b656e732066726f6d207360408201526432b73232b960d91b606082015260800190565b602080825260139082015272151bdad95b881b9bdd081cdd5c1c1bdc9d1959606a1b604082015260600190565b60208082526023908201527f507269636520455448206d7573742062652067726561746572207468616e207a60408201526265726f60e81b606082015260800190565b60208082526023908201527f4661696c656420746f207472616e7366657220746f6b656e7320746f2073656e6040820152623232b960e91b606082015260800190565b5f808335601e1984360301811261484f575f80fd5b8301803591506001600160401b03821115614868575f80fd5b602001915036819003821315610afc575f80fd5b81516001600160401b0381111561489557614895613b40565b6148a38161436d84546140fe565b602080601f8311600181146148d1575f84156148bf5750858301515b6148c98582614203565b865550614928565b5f85815260208120601f198616915b828110156148ff578886015182559484019460019091019084016148e0565b508582101561491c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604081525f6149426040830185613d85565b905060ff831660208301529392505050565b5f60208284031215614964575f80fd5b505191905056fea26469706673582212209954a34651f671a5f8cb97f58a9a816fd3524d17bf6480ac49fa3933aeffc07c64736f6c63430008170033
Deployed Bytecode
0x608060405260043610610212575f3560e01c806395aea9e31161011e578063ba0bba40116100a8578063e666e8271161006d578063e666e82714610638578063f14210a61461065a578063f5f5ba7214610679578063f6326fb31461069a578063f66a1b71146106a2575f80fd5b8063ba0bba4014610593578063c4091236146105a7578063d211d29d146105c6578063db904dfa146105e5578063e0d9cc5214610604575f80fd5b8063a451f602116100ee578063a451f602146104ed578063ac9650d81461050c578063b0b22c2c14610538578063b187bd2614610557578063b651772714610574575f80fd5b806395aea9e31461046857806396e947f3146104875780639e16ac18146104a65780639f40d0cd146104c5575f80fd5b806354f97fc81161019f578063756885121161016f57806375688512146103e457806375829def146104035780638456cb59146104225780638897cd4e146104365780638a1dfab214610455575f80fd5b806354f97fc8146103615780635d04be71146103805780636e9960c31461039f57806371625172146103d0575f80fd5b80630dc16e1f116101e55780630dc16e1f146102ce5780631cff79cd146102ed5780631f4559221461031a5780632dc53d52146103395780633f4ba83a1461034d575f80fd5b8063020e3c6414610216578063042d2b811461024c578063061a45ea1461028e5780630b5ee006146102af575b5f80fd5b348015610221575f80fd5b50610235610230366004613be4565b6106c1565b60405160ff90911681526020015b60405180910390f35b348015610257575f80fd5b50610280610266366004613c38565b6001600160a01b03165f9081526003602052604090205490565b604051908152602001610243565b348015610299575f80fd5b506102ad6102a8366004613c51565b61075a565b005b3480156102ba575f80fd5b506102ad6102c9366004613c9b565b610802565b3480156102d9575f80fd5b506102ad6102e8366004613c51565b6108fc565b3480156102f8575f80fd5b5061030c610307366004613d06565b610998565b604051610243929190613db0565b348015610325575f80fd5b506102ad610334366004613be4565b610b03565b348015610344575f80fd5b50600854610280565b348015610358575f80fd5b506102ad610d04565b34801561036c575f80fd5b506102ad61037b366004613dca565b610d8d565b34801561038b575f80fd5b506102ad61039a366004613be4565b61134c565b3480156103aa575f80fd5b506007546001600160a01b03165b6040516001600160a01b039091168152602001610243565b3480156103db575f80fd5b506103b86113e2565b3480156103ef575f80fd5b506102ad6103fe366004613dca565b61140f565b34801561040e575f80fd5b506102ad61041d366004613c38565b611610565b34801561042d575f80fd5b506102ad6116ea565b348015610441575f80fd5b506102ad610450366004613dca565b611750565b6102ad610463366004613be4565b611cb6565b348015610473575f80fd5b506102ad610482366004613dca565b6120b6565b348015610492575f80fd5b506102ad6104a1366004613dca565b612524565b3480156104b1575f80fd5b506102ad6104c0366004613be4565b612777565b3480156104d0575f80fd5b50600954610100900460ff165b6040519015158152602001610243565b3480156104f8575f80fd5b506102ad610507366004613e0b565b61287a565b348015610517575f80fd5b5061052b610526366004613e72565b612d90565b6040516102439190613ece565b348015610543575f80fd5b506102ad610552366004613c51565b612ede565b348015610562575f80fd5b5060095462010000900460ff166104dd565b34801561057f575f80fd5b506102ad61058e366004613f30565b612fc2565b34801561059e575f80fd5b506102ad61309a565b3480156105b2575f80fd5b506103b86105c1366004613be4565b61314b565b3480156105d1575f80fd5b506102ad6105e0366004613f47565b613209565b3480156105f0575f80fd5b506102ad6105ff366004613be4565b613303565b34801561060f575f80fd5b5061028061061e366004613c38565b6001600160a01b03165f9081526002602052604090205490565b348015610643575f80fd5b5061064c613406565b604051610243929190613f9a565b348015610665575f80fd5b506102ad610674366004613f30565b6135e7565b348015610684575f80fd5b5061068d613752565b604051610243919061403b565b6102ad6137e2565b3480156106ad575f80fd5b506102806106bc366004613be4565b6138d0565b5f806001836040516106d3919061404d565b9081526040519081900360200190205460ff16116107315760405162461bcd60e51b8152602060048201526016602482015275151bdad95b881cde5b589bdb081b9bdd08199bdd5b9960521b60448201526064015b60405180910390fd5b600182604051610741919061404d565b9081526040519081900360200190205460ff1692915050565b6007546001600160a01b031633146107845760405162461bcd60e51b815260040161072890614068565b80600683604051610795919061404d565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055600754909116907fab34b49b18f318eb4e6a66695a89a75e5c5a9f487cdd8e873fb28a86093424ad906107f690859085906140a9565b60405180910390a25050565b6007546001600160a01b0316331461082c5760405162461bcd60e51b815260040161072890614068565b60095462010000900460ff16156108555760405162461bcd60e51b8152600401610728906140d2565b600a60405161086491906141a5565b6040518091039020828260405161087c9291906141b0565b6040518091039020036108ea5760405162461bcd60e51b815260206004820152603060248201527f4e6577206e616d65206d75737420626520646966666572656e742066726f6d2060448201526f7468652063757272656e74206e616d6560801b6064820152608401610728565b600a6108f7828483614217565b505050565b6007546001600160a01b031633146109265760405162461bcd60e51b815260040161072890614068565b80600583604051610937919061404d565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055600754909116907f56a6384078cf12638a88549cfa205f6ffa35c02080d0003d704abcfb4118f6d1906107f690859085906140a9565b6007545f906060906001600160a01b031633146109c75760405162461bcd60e51b815260040161072890614068565b6001600160a01b038416610a165760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746172676574206164647265737360501b6044820152606401610728565b5f80856001600160a01b031685604051610a30919061404d565b5f604051808303815f865af19150503d805f8114610a69576040519150601f19603f3d011682016040523d82523d5f602084013e610a6e565b606091505b509150915081610ab35760405162461bcd60e51b815260206004820152601060248201526f115e1958dd5d1a5bdb8819985a5b195960821b6044820152606401610728565b856001600160a01b03167fc96720f35dd524e76ea92971ce13d08e9a17816bf3b0008a7083e6032354ebb58683604051610aee9291906142cb565b60405180910390a290925090505b9250929050565b6007546001600160a01b03163314610b2d5760405162461bcd60e51b815260040161072890614068565b5f600482604051610b3e919061404d565b908152604051908190036020019020546001600160a01b0316905080610b985760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606401610728565b600482604051610ba8919061404d565b90815260405190819003602001902080546001600160a01b03191690555f5b5f54811015610cc25782604051602001610be1919061404d565b604051602081830303815290604052805190602001205f8281548110610c0957610c096142f8565b905f5260205f2001604051602001610c2191906141a5565b6040516020818303038152906040528051906020012003610cba575f8054610c4b90600190614320565b81548110610c5b57610c5b6142f8565b905f5260205f20015f8281548110610c7557610c756142f8565b905f5260205f20019081610c899190614333565b505f805480610c9a57610c9a614402565b600190038181905f5260205f20015f610cb39190613aee565b9055610cc2565b600101610bc7565b506007546040516001600160a01b03909116907f19b683043270eb6b669d7c737605664dcc114eb222d5c6af4aaf913cf3939918906107f690859085906140a9565b6007546001600160a01b03163314610d2e5760405162461bcd60e51b815260040161072890614068565b60095462010000900460ff16610d7f5760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9858dd081a5cc81b9bdd081c185d5cd95960521b6044820152606401610728565b6009805462ff000019169055565b60095460ff1615610db05760405162461bcd60e51b815260040161072890614416565b6009805460ff19166001179081905562010000900460ff1615610de55760405162461bcd60e51b8152600401610728906140d2565b5f6006604051610df49061443e565b908152604051908190036020019020546001600160a01b031690508015801590610e4f57505f6001600160a01b0316600484604051610e33919061404d565b908152604051908190036020019020546001600160a01b031614155b610ea55760405162461bcd60e51b815260206004820152602160248201527f537461626c65636f696e206f7220746f6b656e206e6f7420737570706f7274656044820152601960fa1b6064820152608401610728565b5f6001604051610eb49061443e565b9081526040519081900360200190205460ff16118015610ef557505f600184604051610ee0919061404d565b9081526040519081900360200190205460ff16115b610f115760405162461bcd60e51b81526004016107289061445c565b5f6001604051610f209061443e565b90815260405190819003602001902054610f3e9060ff16600a61456c565b610f489084614577565b90505f610f7e604051806040016040528060128152602001712222a320aaa62a2fa9aa20a12622a1a7a4a760711b8152506138d0565b90505f610f8a866138d0565b90505f8213610fab5760405162461bcd60e51b81526004016107289061458e565b5f8113610fca5760405162461bcd60e51b8152600401610728906145d8565b5f81610fd68486614577565b610fe0919061461a565b9050600187604051610ff2919061404d565b908152604051908190036020019020546110109060ff16600a61456c565b61101a908261461a565b9050611026878261395d565b8060025f60048a60405161103a919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f205410156110805760405162461bcd60e51b815260040161072890614639565b6001600160a01b0385165f90815260026020526040812080548892906110a7908490614687565b925050819055508060025f60048a6040516110c2919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f90812080549091906110fb908490614320565b90915550506040516323b872dd60e01b81526001600160a01b038616906323b872dd9061113090339030908b9060040161469a565b6020604051808303815f875af115801561114c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061117091906146be565b6111ce5760405162461bcd60e51b815260206004820152602960248201527f4661696c656420746f207472616e7366657220737461626c65636f696e20667260448201526837b69039b2b73232b960b91b6064820152608401610728565b6004876040516111de919061404d565b9081526040519081900360200181205463a9059cbb60e01b8252336004830152602482018390526001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015611234573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125891906146be565b6112af5760405162461bcd60e51b815260206004820152602260248201527f4661696c656420746f207472616e7366657220746f6b656e20746f2073656e6460448201526132b960f11b6064820152608401610728565b6004876040516112bf919061404d565b908152604051908190036020018120546001600160a01b0316906006906112e59061443e565b908152604080519182900360209081018320548884529083018590526001600160a01b03169133917f2caf580882d3b6cd8363b8bfc5cf12ef330a9094151675ce8b65bb1df6620bde91015b60405180910390a450506009805460ff191690555050505050565b6007546001600160a01b031633146113765760405162461bcd60e51b815260040161072890614068565b600181604051611386919061404d565b908152604051908190036020018120805460ff191690556007546001600160a01b0316907fb0fec59d2bbf6b7a5185042e8171dd69f8b2c1870a1110a3edf6daf5c2ad6b5a906113d790849061403b565b60405180910390a250565b5f60066040516113f19061443e565b908152604051908190036020019020546001600160a01b0316919050565b6007546001600160a01b031633146114395760405162461bcd60e51b815260040161072890614068565b5f60048360405161144a919061404d565b908152604051908190036020019020546001600160a01b03169050806114b25760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616464726573732063616e6e6f74206265207a65726f000000006044820152606401610728565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd906114e29033903090879060040161469a565b6020604051808303815f875af11580156114fe573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152291906146be565b61157c5760405162461bcd60e51b815260206004820152602560248201527f4661696c656420746f207472616e7366657220746f6b656e7320746f20636f6e6044820152641d1c9858dd60da1b6064820152608401610728565b5f60018460405161158d919061404d565b908152604051908190036020019020546115ab9060ff16600a61456c565b6115b59084614577565b90506115c18282613a97565b60075460405133916001600160a01b0316907ff38a3543e542beb8a2a4748b18bb39f73c76d90e88d93d0e22482034a29fb66a9061160290889088906146dd565b60405180910390a350505050565b6007546001600160a01b0316331461163a5760405162461bcd60e51b815260040161072890614068565b6001600160a01b03811661169c5760405162461bcd60e51b8152602060048201526024808201527f4e65772061646d696e2063616e6e6f7420626520746865207a65726f206164646044820152637265737360e01b6064820152608401610728565b600780546001600160a01b0319166001600160a01b0383169081179091556040518181527ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec6906020016113d7565b6007546001600160a01b031633146117145760405162461bcd60e51b815260040161072890614068565b60095462010000900460ff161561173d5760405162461bcd60e51b8152600401610728906140d2565b6009805462ff0000191662010000179055565b60095460ff16156117735760405162461bcd60e51b815260040161072890614416565b6009805460ff19166001179081905562010000900460ff16156117a85760405162461bcd60e51b8152600401610728906140d2565b5f60066040516117b79061443e565b908152604051908190036020018120546001600160a01b031691505f906004906117e290869061404d565b908152604051908190036020019020546001600160a01b03161480159061181157506001600160a01b03811615155b61186f5760405162461bcd60e51b815260206004820152602960248201527f546f6b656e206f722064656661756c7420737461626c65636f696e206e6f74206044820152681cdd5c1c1bdc9d195960ba1b6064820152608401610728565b60408051808201825260128152712222a320aaa62a2fa9aa20a12622a1a7a4a760711b602082015290515f906001906118a990879061404d565b9081526040519081900360200190205460ff161180156118ea57505f6001826040516118d5919061404d565b9081526040519081900360200190205460ff16115b6119065760405162461bcd60e51b81526004016107289061445c565b5f600185604051611917919061404d565b908152604051908190036020019020546119359060ff16600a61456c565b61193f9085614577565b90505f61194b866138d0565b90505f611957846138d0565b90505f82136119785760405162461bcd60e51b8152600401610728906146fe565b5f81136119975760405162461bcd60e51b81526004016107289061458e565b5f6001856040516119a8919061404d565b908152604051908190036020019020546119c69060ff16600a61456c565b826119d18587614577565b6119db919061461a565b6119e5919061461a565b90506119f1858261395d565b6001600160a01b0386165f90815260026020526040902054811115611a285760405162461bcd60e51b815260040161072890614639565b8660025f60048b604051611a3c919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f9081208054909190611a75908490614687565b90915550506001600160a01b0386165f9081526002602052604081208054839290611aa1908490614320565b9091555050604051600490611ab7908a9061404d565b908152604051908190036020018120546323b872dd60e01b82526001600160a01b0316906323b872dd90611af390339030908c9060040161469a565b6020604051808303815f875af1158015611b0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3391906146be565b611b4f5760405162461bcd60e51b815260040161072890614742565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0387169063a9059cbb906044016020604051808303815f875af1158015611b99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbd91906146be565b611c195760405162461bcd60e51b815260206004820152602760248201527f4661696c656420746f207472616e7366657220737461626c65636f696e20746f6044820152661039b2b73232b960c91b6064820152608401610728565b6006604051611c279061443e565b908152604051908190036020018120546001600160a01b031690600490611c4f908b9061404d565b908152604080519182900360209081018320548884529083018590526001600160a01b03169133917f340b064ebb1385106e514c3c621d1792907646d7a3ec01a20dee931f09677436910160405180910390a450506009805460ff19169055505050505050565b60095460ff1615611cd95760405162461bcd60e51b815260040161072890614416565b6009805460ff19166001179081905562010000900460ff1615611d0e5760405162461bcd60e51b8152600401610728906140d2565b5f3411611d695760405162461bcd60e51b8152602060048201526024808201527f416d6f756e74206f6620455448206d75737420626520677265617465722074686044820152630616e20360e41b6064820152608401610728565b5f6001600160a01b0316600482604051611d83919061404d565b908152604051908190036020019020546001600160a01b031603611db95760405162461bcd60e51b815260040161072890614787565b5f600182604051611dca919061404d565b9081526040519081900360200190205460ff1611611dfa5760405162461bcd60e51b81526004016107289061445c565b5f611e1f6040518060400160405280600381526020016208aa8960eb1b8152506138d0565b90505f611e2b836138d0565b90505f8213611e4c5760405162461bcd60e51b8152600401610728906147b4565b5f8113611e6b5760405162461bcd60e51b8152600401610728906145d8565b345f82611e788584614577565b611e82919061461a565b9050600185604051611e94919061404d565b90815260405190819003602001902054611eb29060ff16600a61456c565b611ebc908261461a565b9050611ec8858261395d565b8060025f600488604051611edc919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f20541015611f225760405162461bcd60e51b815260040161072890614639565b305f9081526003602052604081208054849290611f40908490614687565b925050819055508060025f600488604051611f5b919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f9081208054909190611f94908490614320565b9091555050604051600490611faa90879061404d565b9081526040519081900360200181205463a9059cbb60e01b8252336004830152602482018390526001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015612000573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061202491906146be565b6120405760405162461bcd60e51b8152600401610728906147f7565b600485604051612050919061404d565b908152604080519182900360209081018320548584529083018490526001600160a01b0316915f9133917fe6035c20cab4d5e8328910a0eae0e293df99cf8674d0a7fbebd6ee580c2cbcba910160405180910390a450506009805460ff19169055505050565b60095460ff16156120d95760405162461bcd60e51b815260040161072890614416565b6009805460ff19166001179081905562010000900460ff161561210e5760405162461bcd60e51b8152600401610728906140d2565b5f6001600160a01b0316600483604051612128919061404d565b908152604051908190036020019020546001600160a01b03160361215e5760405162461bcd60e51b815260040161072890614787565b5f60018360405161216f919061404d565b9081526040519081900360200190205460ff161161219f5760405162461bcd60e51b81526004016107289061445c565b5f6001836040516121b0919061404d565b908152604051908190036020019020546121ce9060ff16600a61456c565b6121d89083614577565b90505f6121e4846138d0565b90505f61220b6040518060400160405280600381526020016208aa8960eb1b8152506138d0565b90505f821361222c5760405162461bcd60e51b8152600401610728906146fe565b5f811361224b5760405162461bcd60e51b8152600401610728906147b4565b5f816122578486614577565b612261919061461a565b90506122886040518060400160405280600381526020016208aa8960eb1b8152508261395d565b305f908152600360205260409020548511156122fb5760405162461bcd60e51b815260206004820152602c60248201527f496e73756666696369656e74207265676973746572656420455448206465706f60448201526b1cda5d08199bdc881cd95b9960a21b6064820152608401610728565b8460025f60048960405161230f919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f9081208054909190612348908490614687565b9091555050305f908152600360205260408120805483929061236b908490614320565b909155505060405160049061238190889061404d565b908152604051908190036020018120546323b872dd60e01b82526001600160a01b0316906323b872dd906123bd90339030908a9060040161469a565b6020604051808303815f875af11580156123d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123fd91906146be565b6124195760405162461bcd60e51b815260040161072890614742565b6040515f90339083908381818185875af1925050503d805f8114612458576040519150601f19603f3d011682016040523d82523d5f602084013e61245d565b606091505b50509050806124ae5760405162461bcd60e51b815260206004820152601c60248201527f4661696c656420746f2073656e642045544820746f2073656e646572000000006044820152606401610728565b6004876040516124be919061404d565b908152604080519182900360209081018320548884529083018590526001600160a01b03169133917fcad30dc2d197d2b3a78edd54230921645efb2346fba9b44bf73eb55deb9fe0b1910160405180910390a350506009805460ff191690555050505050565b6007546001600160a01b0316331461254e5760405162461bcd60e51b815260040161072890614068565b5f60048360405161255f919061404d565b908152604051908190036020019020546001600160a01b03169050806125c75760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616464726573732063616e6e6f74206265207a65726f000000006044820152606401610728565b5f6001846040516125d8919061404d565b908152604051908190036020019020546125f69060ff16600a61456c565b6126009084614577565b6001600160a01b0383165f908152600260205260409020549091508111156126615760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610728565b61266b8282613ac7565b60075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018590529083169063a9059cbb906044016020604051808303815f875af11580156126bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126df91906146be565b6127365760405162461bcd60e51b815260206004820152602260248201527f4661696c656420746f207472616e7366657220746f6b656e7320746f2061646d60448201526134b760f11b6064820152608401610728565b60075460405133916001600160a01b0316907f62078e50b1946ffe178c6b7c4a9f20734ba073969a7887c7606f4a0fd6eaa4cc9061160290889088906146dd565b6007546001600160a01b031633146127a15760405162461bcd60e51b815260040161072890614068565b5f6006826040516127b2919061404d565b908152604051908190036020019020546001600160a01b03169050806128115760405162461bcd60e51b815260206004820152601460248201527314dd18589b1958dbda5b881b9bdd08199bdd5b9960621b6044820152606401610728565b600682604051612821919061404d565b90815260405190819003602001812080546001600160a01b03191690556007546001600160a01b0316907fcce4c948189d415a2b8c9f7c90d8c905104ccde5499ee07c834c17bb80c1891c906107f690859085906140a9565b60095460ff161561289d5760405162461bcd60e51b815260040161072890614416565b6009805460ff19166001179081905562010000900460ff16156128d25760405162461bcd60e51b8152600401610728906140d2565b5f6001600160a01b03166004846040516128ec919061404d565b908152604051908190036020019020546001600160a01b03161480159061294457505f6001600160a01b0316600483604051612928919061404d565b908152604051908190036020019020546001600160a01b031614155b6129605760405162461bcd60e51b815260040161072890614787565b5f600184604051612971919061404d565b9081526040519081900360200190205460ff161180156129b257505f60018360405161299d919061404d565b9081526040519081900360200190205460ff16115b6129ce5760405162461bcd60e51b81526004016107289061445c565b5f6001846040516129df919061404d565b908152604051908190036020019020546129fd9060ff16600a61456c565b612a079083614577565b90505f612a13856138d0565b90505f612a1f856138d0565b90505f8213612a405760405162461bcd60e51b8152600401610728906146fe565b5f8113612a5f5760405162461bcd60e51b8152600401610728906145d8565b5f600186604051612a70919061404d565b90815260405190819003602001902054612a8e9060ff16600a61456c565b82612a998587614577565b612aa3919061461a565b612aad919061461a565b9050612ab9868661395d565b8060025f600489604051612acd919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f20541015612b135760405162461bcd60e51b815260040161072890614639565b8460025f60048a604051612b27919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f9081208054909190612b60908490614687565b925050819055508060025f600489604051612b7b919061404d565b9081526040805160209281900383019020546001600160a01b0316835290820192909252015f9081208054909190612bb4908490614320565b9091555050604051600490612bca90899061404d565b908152604051908190036020018120546323b872dd60e01b82526001600160a01b0316906323b872dd90612c0690339030908a9060040161469a565b6020604051808303815f875af1158015612c22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c4691906146be565b612c625760405162461bcd60e51b815260040161072890614742565b600486604051612c72919061404d565b9081526040519081900360200181205463a9059cbb60e01b8252336004830152602482018390526001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015612cc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cec91906146be565b612d085760405162461bcd60e51b8152600401610728906147f7565b600486604051612d18919061404d565b908152604051908190036020018120546001600160a01b031690600490612d40908a9061404d565b908152604080519182900360209081018320548884529083018590526001600160a01b03169133917fad56699d0f375866eb895ed27203058a36a713382aaded78eb6b67da266d43329101611331565b6060816001600160401b03811115612daa57612daa613b40565b604051908082528060200260200182016040528015612ddd57816020015b6060815260200190600190039081612dc85790505b5090505f5b82811015612ed6575f8030868685818110612dff57612dff6142f8565b9050602002810190612e11919061483a565b604051612e1f9291906141b0565b5f60405180830381855af49150503d805f8114612e57576040519150601f19603f3d011682016040523d82523d5f602084013e612e5c565b606091505b509150915081612eae5760405162461bcd60e51b815260206004820152601d60248201527f4d756c746963616c6c2064656c656761746563616c6c206661696c65640000006044820152606401610728565b80848481518110612ec157612ec16142f8565b60209081029190910101525050600101612de2565b505b92915050565b6007546001600160a01b03163314612f085760405162461bcd60e51b815260040161072890614068565b80600483604051612f19919061404d565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555f80546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301612f80838261487c565b506007546040516001600160a01b03909116907f554547a049025c151fdca80e2e2e3902790abe58e73d549426039ec4f0ed3b35906107f690859085906140a9565b6007546001600160a01b03163314612fec5760405162461bcd60e51b815260040161072890614068565b6182358111156130565760405162461bcd60e51b815260206004820152602f60248201527f536c6970706167652070657263656e742063616e6e6f7420626520677265617460448201526e6572207468616e2033332e3333332560881b6064820152608401610728565b60088190556007546040518281526001600160a01b03909116907ffe448b46a6631d90be911affa7ba36599785e76e7be4e9a167403244c572c3fb906020016113d7565b600954610100900460ff16156130ea5760405162461bcd60e51b8152602060048201526015602482015274536574757020616c72656164792063616c6c65642160581b6044820152606401610728565b600780546001600160a01b03191633908117909155610bb860088190556040519081527f9e4bd02b115dd3cb5ad86085de76fc3f2d3f9ea0b557c054c2d9cbdce10390139060200160405180910390a26009805461ff001916610100179055565b5f806001600160a01b0316600483604051613166919061404d565b908152604051908190036020019020546001600160a01b0316036131da5760405162461bcd60e51b815260206004820152602560248201527f546f6b656e207769746820746869732073796d626f6c20646f6573206e6f7420604482015264195e1a5cdd60da1b6064820152608401610728565b6004826040516131ea919061404d565b908152604051908190036020019020546001600160a01b031692915050565b6007546001600160a01b031633146132335760405162461bcd60e51b815260040161072890614068565b60128160ff1611156132925760405162461bcd60e51b815260206004820152602260248201527f446563696d616c732063616e6e6f742062652067726561746572207468616e20604482015261062760f31b6064820152608401610728565b806001836040516132a3919061404d565b908152604051908190036020018120805460ff9390931660ff19909316929092179091556007546001600160a01b0316907fb647660985c65b132326df526467806263eab56d06a9287af50bde3c3092bd34906107f69085908590614930565b6007546001600160a01b0316331461332d5760405162461bcd60e51b815260040161072890614068565b5f60058260405161333e919061404d565b908152604051908190036020019020546001600160a01b031690508061339d5760405162461bcd60e51b8152602060048201526014602482015273141c9a58d94819995959081b9bdd08199bdd5b9960621b6044820152606401610728565b6005826040516133ad919061404d565b90815260405190819003602001812080546001600160a01b03191690556007546001600160a01b0316907f3f80cadc404fdb2cbb36543870c2be2303f46e4a6a64850a614a14b5f7a2bb2a906107f690859085906140a9565b5f5460609081906001600160401b0381111561342457613424613b40565b60405190808252806020026020018201604052801561345757816020015b60608152602001906001900390816134425790505b505f549092506001600160401b0381111561347457613474613b40565b60405190808252806020026020018201604052801561349d578160200160208202803683370190505b5090505f5b5f548110156135e2575f81815481106134bd576134bd6142f8565b905f5260205f200180546134d0906140fe565b80601f01602080910402602001604051908101604052809291908181526020018280546134fc906140fe565b80156135475780601f1061351e57610100808354040283529160200191613547565b820191905f5260205f20905b81548152906001019060200180831161352a57829003601f168201915b505050505083828151811061355e5761355e6142f8565b602002602001018190525060045f828154811061357d5761357d6142f8565b905f5260205f200160405161359291906141a5565b9081526040519081900360200190205482516001600160a01b03909116908390839081106135c2576135c26142f8565b6001600160a01b03909216602092830291909101909101526001016134a2565b509091565b6007546001600160a01b031633146136115760405162461bcd60e51b815260040161072890614068565b305f908152600360205260409020548111156136665760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610728565b305f9081526003602052604081208054839290613684908490614320565b90915550506040515f90339083908381818185875af1925050503d805f81146136c8576040519150601f19603f3d011682016040523d82523d5f602084013e6136cd565b606091505b50509050806137135760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610728565b6007546040518381526001600160a01b03909116907f94b2de810873337ed265c5f8cf98c9cffefa06b8607f9a2f1fbaebdfbcfbef1c906020016107f6565b6060600a8054613761906140fe565b80601f016020809104026020016040519081016040528092919081815260200182805461378d906140fe565b80156137d85780601f106137af576101008083540402835291602001916137d8565b820191905f5260205f20905b8154815290600101906020018083116137bb57829003601f168201915b5050505050905090565b6007546001600160a01b0316331461380c5760405162461bcd60e51b815260040161072890614068565b5f34116138695760405162461bcd60e51b815260206004820152602560248201527f4465706f73697420616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b6064820152608401610728565b305f9081526003602052604081208054349290613887908490614687565b90915550506007546040513481526001600160a01b03909116907f6c703791f399558807424f489ccd811c72b4ff0b74af547264fad7c646776df09060200160405180910390a2565b5f806005836040516138e2919061404d565b9081526040805160209281900383018120546350d25bcd60e01b825291516001600160a01b03909216935083926350d25bcd926004808401938290030181865afa158015613932573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139569190614954565b9392505050565b5f60018360405161396e919061404d565b9081526040519081900360200190205460ff161161399e5760405162461bcd60e51b81526004016107289061445c565b5f6139a8836138d0565b90505f670de0b6b3a76400006139be8385614577565b6139c8919061461a565b90506001846040516139da919061404d565b908152604051908190036020019020546139f89060ff16600a61456c565b613a02908261461a565b90505f6103e860085485613a169190614577565b613a20919061461a565b9050613a2c8185614320565b8210158015613a445750613a408185614687565b8211155b613a905760405162461bcd60e51b815260206004820152601760248201527f536c697070616765206c696d69742065786365656465640000000000000000006044820152606401610728565b5050505050565b6001600160a01b0382165f9081526002602052604081208054839290613abe908490614687565b90915550505050565b6001600160a01b0382165f9081526002602052604081208054839290613abe908490614320565b508054613afa906140fe565b5f825580601f10613b09575050565b601f0160209004905f5260205f2090810190613b259190613b28565b50565b5b80821115613b3c575f8155600101613b29565b5090565b634e487b7160e01b5f52604160045260245ffd5b5f6001600160401b0380841115613b6d57613b6d613b40565b604051601f8501601f19908116603f01168101908282118183101715613b9557613b95613b40565b81604052809350858152868686011115613bad575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f830112613bd5575f80fd5b61395683833560208501613b54565b5f60208284031215613bf4575f80fd5b81356001600160401b03811115613c09575f80fd5b613c1584828501613bc6565b949350505050565b80356001600160a01b0381168114613c33575f80fd5b919050565b5f60208284031215613c48575f80fd5b61395682613c1d565b5f8060408385031215613c62575f80fd5b82356001600160401b03811115613c77575f80fd5b613c8385828601613bc6565b925050613c9260208401613c1d565b90509250929050565b5f8060208385031215613cac575f80fd5b82356001600160401b0380821115613cc2575f80fd5b818501915085601f830112613cd5575f80fd5b813581811115613ce3575f80fd5b866020828501011115613cf4575f80fd5b60209290920196919550909350505050565b5f8060408385031215613d17575f80fd5b613d2083613c1d565b915060208301356001600160401b03811115613d3a575f80fd5b8301601f81018513613d4a575f80fd5b613d5985823560208401613b54565b9150509250929050565b5f5b83811015613d7d578181015183820152602001613d65565b50505f910152565b5f8151808452613d9c816020860160208601613d63565b601f01601f19169290920160200192915050565b8215158152604060208201525f613c156040830184613d85565b5f8060408385031215613ddb575f80fd5b82356001600160401b03811115613df0575f80fd5b613dfc85828601613bc6565b95602094909401359450505050565b5f805f60608486031215613e1d575f80fd5b83356001600160401b0380821115613e33575f80fd5b613e3f87838801613bc6565b94506020860135915080821115613e54575f80fd5b50613e6186828701613bc6565b925050604084013590509250925092565b5f8060208385031215613e83575f80fd5b82356001600160401b0380821115613e99575f80fd5b818501915085601f830112613eac575f80fd5b813581811115613eba575f80fd5b8660208260051b8501011115613cf4575f80fd5b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015613f2357603f19888603018452613f11858351613d85565b94509285019290850190600101613ef5565b5092979650505050505050565b5f60208284031215613f40575f80fd5b5035919050565b5f8060408385031215613f58575f80fd5b82356001600160401b03811115613f6d575f80fd5b613f7985828601613bc6565b925050602083013560ff81168114613f8f575f80fd5b809150509250929050565b5f604082016040835280855180835260608501915060608160051b860101925060208088015f5b83811015613fef57605f19888703018552613fdd868351613d85565b95509382019390820190600101613fc1565b5050858403818701528651808552878201948201935091505f5b8281101561402e5784516001600160a01b031684529381019392810192600101614009565b5091979650505050505050565b602081525f6139566020830184613d85565b5f825161405e818460208701613d63565b9190910192915050565b60208082526021908201527f4f6e6c792061646d696e2063616e2063616c6c20746869732066756e6374696f6040820152603760f91b606082015260800190565b604081525f6140bb6040830185613d85565b905060018060a01b03831660208301529392505050565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b600181811c9082168061411257607f821691505b60208210810361413057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8154614142816140fe565b6001828116801561415a576001811461416f5761419b565b60ff198416875282151583028701945061419b565b855f526020805f205f5b858110156141925781548a820152908401908201614179565b50505082870194505b5050505092915050565b5f6139568284614136565b818382375f9101908152919050565b601f8211156108f757805f5260205f20601f840160051c810160208510156141e45750805b601f840160051c820191505b81811015613a90575f81556001016141f0565b5f19600383901b1c191660019190911b1790565b6001600160401b0383111561422e5761422e613b40565b6142428361423c83546140fe565b836141bf565b5f601f84116001811461426e575f851561425c5750838201355b6142668682614203565b845550613a90565b5f83815260208120601f198716915b8281101561429d578685013582556020948501946001909201910161427d565b50868210156142b9575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b604081525f6142dd6040830185613d85565b82810360208401526142ef8185613d85565b95945050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115612ed857612ed861430c565b81810361433e575050565b61434882546140fe565b6001600160401b0381111561435f5761435f613b40565b6143738161436d84546140fe565b846141bf565b5f601f82116001811461439f575f831561438d5750848201545b6143978482614203565b855550613a90565b5f8581526020808220868352908220601f198616925b838110156143d557828601548255600195860195909101906020016143b5565b50858310156143f257818501545f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52603160045260245ffd5b6020808252600e908201526d1499595b9d1c985b9d0818d85b1b60921b604082015260600190565b712222a320aaa62a2fa9aa20a12622a1a7a4a760711b815260120190565b602080825260169082015275151bdad95b88191958da5b585b1cc81b9bdd081cd95d60521b604082015260600190565b600181815b808511156144c657815f19048211156144ac576144ac61430c565b808516156144b957918102915b93841c9390800290614491565b509250929050565b5f826144dc57506001612ed8565b816144e857505f612ed8565b81600181146144fe576002811461450857614524565b6001915050612ed8565b60ff8411156145195761451961430c565b50506001821b612ed8565b5060208310610133831016604e8410600b8410161715614547575081810a612ed8565b614551838361448c565b805f19048211156145645761456461430c565b029392505050565b5f61395683836144ce565b8082028115828204841417612ed857612ed861430c565b6020808252602a908201527f507269636520737461626c65636f696e206d7573742062652067726561746572604082015269207468616e207a65726f60b01b606082015260800190565b60208082526022908201527f507269636520746f206d7573742062652067726561746572207468616e207a65604082015261726f60f01b606082015260800190565b5f8261463457634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e73756666696369656e74207265676973746572656420746f6b656e20626160408201526d1b185b98d948199bdc881cd95b9960921b606082015260800190565b80820180821115612ed857612ed861430c565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f602082840312156146ce575f80fd5b81518015158114613956575f80fd5b604081525f6146ef6040830185613d85565b90508260208301529392505050565b60208082526024908201527f50726963652066726f6d206d7573742062652067726561746572207468616e206040820152637a65726f60e01b606082015260800190565b60208082526025908201527f4661696c656420746f207472616e7366657220746f6b656e732066726f6d207360408201526432b73232b960d91b606082015260800190565b602080825260139082015272151bdad95b881b9bdd081cdd5c1c1bdc9d1959606a1b604082015260600190565b60208082526023908201527f507269636520455448206d7573742062652067726561746572207468616e207a60408201526265726f60e81b606082015260800190565b60208082526023908201527f4661696c656420746f207472616e7366657220746f6b656e7320746f2073656e6040820152623232b960e91b606082015260800190565b5f808335601e1984360301811261484f575f80fd5b8301803591506001600160401b03821115614868575f80fd5b602001915036819003821315610afc575f80fd5b81516001600160401b0381111561489557614895613b40565b6148a38161436d84546140fe565b602080601f8311600181146148d1575f84156148bf5750858301515b6148c98582614203565b865550614928565b5f85815260208120601f198616915b828110156148ff578886015182559484019460019091019084016148e0565b508582101561491c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604081525f6149426040830185613d85565b905060ff831660208301529392505050565b5f60208284031215614964575f80fd5b505191905056fea26469706673582212209954a34651f671a5f8cb97f58a9a816fd3524d17bf6480ac49fa3933aeffc07c64736f6c63430008170033
Deployed Bytecode Sourcemap
1126:45958:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17746:209;;;;;;;;;;-1:-1:-1;17746:209:0;;;;;:::i;:::-;;:::i;:::-;;;1509:4:1;1497:17;;;1479:36;;1467:2;1452:18;17746:209:0;;;;;;;;18777:132;;;;;;;;;;-1:-1:-1;18777:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;18872:29:0;18848:4;18872:29;;;:20;:29;;;;;;;18777:132;;;;2041:25:1;;;2029:2;2014:18;18777:132:0;1895:177:1;24778:259:0;;;;;;;;;;-1:-1:-1;24778:259:0;;;;;:::i;:::-;;:::i;:::-;;15282:307;;;;;;;;;;-1:-1:-1;15282:307:0;;;;;:::i;:::-;;:::i;24294:224::-;;;;;;;;;;-1:-1:-1;24294:224:0;;;;;:::i;:::-;;:::i;21689:366::-;;;;;;;;;;-1:-1:-1;21689:366:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;26165:1113::-;;;;;;;;;;-1:-1:-1;26165:1113:0;;;;;:::i;:::-;;:::i;16149:104::-;;;;;;;;;;-1:-1:-1;16227:18:0;;16149:104;;14678:122;;;;;;;;;;;;;:::i;43113:1695::-;;;;;;;;;;-1:-1:-1;43113:1695:0;;;;;:::i;:::-;;:::i;28480:178::-;;;;;;;;;;-1:-1:-1;28480:178:0;;;;;:::i;:::-;;:::i;17052:81::-;;;;;;;;;;-1:-1:-1;17120:5:0;;-1:-1:-1;;;;;17120:5:0;17052:81;;;-1:-1:-1;;;;;4996:32:1;;;4978:51;;4966:2;4951:18;17052:81:0;4832:203:1;18114:131:0;;;;;;;;;;;;;:::i;28887:588::-;;;;;;;;;;-1:-1:-1;28887:588:0;;;;;:::i;:::-;;:::i;15774:224::-;;;;;;;;;;-1:-1:-1;15774:224:0;;;;;:::i;:::-;;:::i;14499:118::-;;;;;;;;;;;;;:::i;37985:1819::-;;;;;;;;;;-1:-1:-1;37985:1819:0;;;;;:::i;:::-;;:::i;45807:1274::-;;;;;;:::i;:::-;;:::i;40758:1338::-;;;;;;;;;;-1:-1:-1;40758:1338:0;;;;;:::i;:::-;;:::i;30064:659::-;;;;;;;;;;-1:-1:-1;30064:659:0;;;;;:::i;:::-;;:::i;27947:385::-;;;;;;;;;;-1:-1:-1;27947:385:0;;;;;:::i;:::-;;:::i;16427:82::-;;;;;;;;;;-1:-1:-1;16494:7:0;;;;;;;16427:82;;;5205:14:1;;5198:22;5180:41;;5168:2;5153:18;16427:82:0;5040:187:1;35509:1482:0;;;;;;;;;;-1:-1:-1;35509:1482:0;;;;;:::i;:::-;;:::i;22766:413::-;;;;;;;;;;-1:-1:-1;22766:413:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23771:241::-;;;;;;;;;;-1:-1:-1;23771:241:0;;;;;:::i;:::-;;:::i;16609:80::-;;;;;;;;;;-1:-1:-1;16674:7:0;;;;;;;16609:80;;21048:301;;;;;;;;;;-1:-1:-1;21048:301:0;;;;;:::i;:::-;;:::i;15000:164::-;;;;;;;;;;;;;:::i;17320:227::-;;;;;;;;;;-1:-1:-1;17320:227:0;;;;;:::i;:::-;;:::i;25223:276::-;;;;;;;;;;-1:-1:-1;25223:276:0;;;;;:::i;:::-;;:::i;27450:329::-;;;;;;;;;;-1:-1:-1;27450:329:0;;;;;:::i;:::-;;:::i;18439:133::-;;;;;;;;;;-1:-1:-1;18439:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;18534:30:0;18510:4;18534:30;;;:23;:30;;;;;;;18439:133;19239:431;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;34081:354::-;;;;;;;;;;-1:-1:-1;34081:354:0;;;;;:::i;:::-;;:::i;16819:101::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32322:234::-;;;:::i;20660:204::-;;;;;;;;;;-1:-1:-1;20660:204:0;;;;;:::i;:::-;;:::i;17746:209::-;17820:5;17875:1;17846:13;17860:11;17846:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:30;17838:65;;;;-1:-1:-1;;;17838:65:0;;10215:2:1;17838:65:0;;;10197:21:1;10254:2;10234:18;;;10227:30;-1:-1:-1;;;10273:18:1;;;10266:52;10335:18;;17838:65:0;;;;;;;;;17921:13;17935:11;17921:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;17746:209;-1:-1:-1;;17746:209:0:o;24778:259::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;24937:17:::1;24897:19;24917:16;24897:37;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:57;;-1:-1:-1;;;;;24897:57:0;;::::1;-1:-1:-1::0;;;;;;24897:57:0;;::::1;;::::0;;24986:5:::1;::::0;;;::::1;::::0;24970:59:::1;::::0;::::1;::::0;24993:16;;25011:17;;24970:59:::1;:::i;:::-;;;;;;;;24778:259:::0;;:::o;15282:307::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;14046:7:::1;::::0;;;::::1;;;14045:8;14037:39;;;;-1:-1:-1::0;;;14037:39:0::1;;;;;;;:::i;:::-;15423:12:::2;15407:30;;;;;;:::i;:::-;;;;;;;;15396:5;;15380:23;;;;;;;:::i;:::-;;;;;;;;:57:::0;15372:118:::2;;;::::0;-1:-1:-1;;;15372:118:0;;13364:2:1;15372:118:0::2;::::0;::::2;13346:21:1::0;13403:2;13383:18;;;13376:30;13442:34;13422:18;;;13415:62;-1:-1:-1;;;13493:18:1;;;13486:46;13549:19;;15372:118:0::2;13162:412:1::0;15372:118:0::2;15561:12;:20;15576:5:::0;;15561:12;:20:::2;:::i;:::-;;15282:307:::0;;:::o;24294:224::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;24426:16:::1;24397:13;24411:11;24397:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:45;;-1:-1:-1;;;;;24397:45:0;;::::1;-1:-1:-1::0;;;;;;24397:45:0;;::::1;;::::0;;24473:5:::1;::::0;;;::::1;::::0;24458:52:::1;::::0;::::1;::::0;24480:11;;24493:16;;24458:52:::1;:::i;21689:366::-:0;13352:5;;21767:4;;21773:12;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21806:20:0;::::1;21798:55;;;::::0;-1:-1:-1;;;21798:55:0;;15681:2:1;21798:55:0::1;::::0;::::1;15663:21:1::0;15720:2;15700:18;;;15693:30;-1:-1:-1;;;15739:18:1;;;15732:52;15801:18;;21798:55:0::1;15479:346:1::0;21798:55:0::1;21865:12;21879:19:::0;21902:6:::1;-1:-1:-1::0;;;;;21902:11:0::1;21914:4;21902:17;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21864:55;;;;21938:7;21930:36;;;::::0;-1:-1:-1;;;21930:36:0;;16324:2:1;21930:36:0::1;::::0;::::1;16306:21:1::0;16363:2;16343:18;;;16336:30;-1:-1:-1;;;16382:18:1;;;16375:46;16438:18;;21930:36:0::1;16122:340:1::0;21930:36:0::1;21991:6;-1:-1:-1::0;;;;;21982:30:0::1;;21999:4;22005:6;21982:30;;;;;;;:::i;:::-;;;;;;;;22031:7:::0;;-1:-1:-1;22040:6:0;-1:-1:-1;13406:1:0::1;21689:366:::0;;;;;:::o;26165:1113::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;26337:20:::1;26360:9;26370:11;26360:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;-1:-1:-1;;;;;26360:22:0::1;::::0;-1:-1:-1;26360:22:0;26393:54:::1;;;::::0;-1:-1:-1;;;26393:54:0;;17051:2:1;26393:54:0::1;::::0;::::1;17033:21:1::0;17090:2;17070:18;;;17063:30;-1:-1:-1;;;17109:18:1;;;17102:45;17164:18;;26393:54:0::1;16849:339:1::0;26393:54:0::1;26531:9;26541:11;26531:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;26524:29;;-1:-1:-1;;;;;;26524:29:0::1;::::0;;26531:22:::1;26655:487;26676:12;:19:::0;26672:23;::::1;26655:487;;;26796:11;26779:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;26769:40;;;;;;26748:12;26761:1;26748:15;;;;;;;;:::i;:::-;;;;;;;;26731:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;26721:44;;;;;;:88:::0;26717:414:::1;;26942:12;26955:19:::0;;:23:::1;::::0;26977:1:::1;::::0;26955:23:::1;:::i;:::-;26942:37;;;;;;;;:::i;:::-;;;;;;;;26924:12;26937:1;26924:15;;;;;;;;:::i;:::-;;;;;;;;:55;;;;;;:::i;:::-;;27073:12;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;27110:5;;26717:414;26697:3;;26655:487;;;-1:-1:-1::0;27237:5:0::1;::::0;27214:56:::1;::::0;-1:-1:-1;;;;;27237:5:0;;::::1;::::0;27214:56:::1;::::0;::::1;::::0;27244:11;;27257:12;;27214:56:::1;:::i;14678:122::-:0;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;14314:7:::1;::::0;;;::::1;;;14306:42;;;::::0;-1:-1:-1;;;14306:42:0;;19567:2:1;14306:42:0::1;::::0;::::1;19549:21:1::0;19606:2;19586:18;;;19579:30;-1:-1:-1;;;19625:18:1;;;19618:52;19687:18;;14306:42:0::1;19365:346:1::0;14306:42:0::1;14736:7:::2;:15:::0;;-1:-1:-1;;14736:15:0::2;::::0;;14678:122::o;43113:1695::-;13814:6;;;;13813:7;13805:34;;;;-1:-1:-1;;;13805:34:0;;;;;;;:::i;:::-;13850:6;:13;;-1:-1:-1;;13850:13:0;13859:4;13850:13;;;;;14046:7;;::::1;13850:13:::0;14046:7:::1;14045:8;14037:39;;;;-1:-1:-1::0;;;14037:39:0::1;;;;;;;:::i;:::-;43232:25:::2;43260:19;:41;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;43260:41:0::2;::::0;-1:-1:-1;43320:31:0;;;::::2;::::0;:67:::2;;;43385:1;-1:-1:-1::0;;;;;43355:32:0::2;:9;43365:7;43355:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;43355:18:0::2;:32;;43320:67;43312:113;;;::::0;-1:-1:-1;;;43312:113:0;;20535:2:1;43312:113:0::2;::::0;::::2;20517:21:1::0;20574:2;20554:18;;;20547:30;20613:34;20593:18;;;20586:62;-1:-1:-1;;;20664:18:1;;;20657:31;20705:19;;43312:113:0::2;20333:397:1::0;43312:113:0::2;43482:1;43444:13;:35;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;::::2;;:39;:69:::0;::::2;;;;43512:1;43487:13;43501:7;43487:22;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;::::2;;:26;43444:69;43436:104;;;;-1:-1:-1::0;;;43436:104:0::2;;;;;;;:::i;:::-;43553:26;43605:13;:35;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;43591:50:::2;::::0;43605:35:::2;;43591:2;:50;:::i;:::-;43582:59;::::0;:6;:59:::2;:::i;:::-;43553:88;;43654:22;43679:36;;;;;;;;;;;;;;-1:-1:-1::0;;;43679:36:0::2;;::::0;:14:::2;:36::i;:::-;43654:61;;43726:14;43743:23;43758:7;43743:14;:23::i;:::-;43726:40;;43805:1;43787:15;:19;43779:74;;;;-1:-1:-1::0;;;43779:74:0::2;;;;;;;:::i;:::-;43882:1;43872:7;:11;43864:58;;;;-1:-1:-1::0;;;43864:58:0::2;;;;;;;:::i;:::-;43935:16;44012:7:::0;43955:45:::2;43984:15:::0;43955:18;:45:::2;:::i;:::-;43954:66;;;;:::i;:::-;43935:85;;44067:13;44081:7;44067:22;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;44053:37:::2;::::0;44067:22:::2;;44053:2;:37;:::i;:::-;44042:48;::::0;:8;:48:::2;:::i;:::-;44031:59;;44103:32;44117:7;44126:8;44103:13;:32::i;:::-;44203:8;44156:23;:43;44180:9;44190:7;44180:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;44180:18:0::2;44156:43:::0;;;;::::2;::::0;;;;;-1:-1:-1;44156:43:0;;:55:::2;;44148:114;;;;-1:-1:-1::0;;;44148:114:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44275:42:0;::::2;;::::0;;;:23:::2;:42;::::0;;;;:52;;44321:6;;44275:42;:52:::2;::::0;44321:6;;44275:52:::2;:::i;:::-;;;;;;;;44385:8;44338:23;:43;44362:9;44372:7;44362:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;44362:18:0::2;44338:43:::0;;;;::::2;::::0;;;;;-1:-1:-1;44338:43:0;;;:55;;:43;;-1:-1:-1;44338:55:0::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;;44414:73:0::2;::::0;-1:-1:-1;;;44414:73:0;;-1:-1:-1;;;;;44414:38:0;::::2;::::0;::::2;::::0;:73:::2;::::0;44453:10:::2;::::0;44473:4:::2;::::0;44480:6;;44414:73:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44406:127;;;::::0;-1:-1:-1;;;44406:127:0;;25072:2:1;44406:127:0::2;::::0;::::2;25054:21:1::0;25111:2;25091:18;;;25084:30;25150:34;25130:18;;;25123:62;-1:-1:-1;;;25201:18:1;;;25194:39;25250:19;;44406:127:0::2;24870:405:1::0;44406:127:0::2;44559:9;44569:7;44559:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;44552:57:0;;44588:10:::2;44552:57;::::0;::::2;25454:51:1::0;25521:18;;;25514:34;;;-1:-1:-1;;;;;44559:18:0::2;::::0;44552:35:::2;::::0;25427:18:1;;44552:57:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44544:104;;;::::0;-1:-1:-1;;;44544:104:0;;25761:2:1;44544:104:0::2;::::0;::::2;25743:21:1::0;25800:2;25780:18;;;25773:30;25839:34;25819:18;;;25812:62;-1:-1:-1;;;25890:18:1;;;25883:32;25932:19;;44544:104:0::2;25559:398:1::0;44544:104:0::2;44751:9;44761:7;44751:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;44751:18:0::2;::::0;44708:19:::2;::::0;:41:::2;::::0;::::2;:::i;:::-;::::0;;;::::2;::::0;;;;;;::::2;::::0;;;;;;26136:25:1;;;26177:18;;;26170:34;;;-1:-1:-1;;;;;44708:41:0::2;::::0;44696:10:::2;::::0;44664:136:::2;::::0;26109:18:1;44664:136:0::2;;;;;;;;-1:-1:-1::0;;13886:6:0;:14;;-1:-1:-1;;13886:14:0;;;-1:-1:-1;;;;;43113:1695:0:o;28480:178::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;28570:13:::1;28584:11;28570:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;28563:33;;-1:-1:-1;;28563:33:0::1;::::0;;28631:5:::1;::::0;-1:-1:-1;;;;;28631:5:0::1;::::0;28612:38:::1;::::0;::::1;::::0;28638:11;;28612:38:::1;:::i;:::-;;;;;;;;28480:178:::0;:::o;18114:131::-;18169:7;18196:19;:41;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;18196:41:0;;18114:131;-1:-1:-1;18114:131:0:o;28887:588::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;28987:20:::1;29010:9;29020:11;29010:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;-1:-1:-1;;;;;29010:22:0::1;::::0;-1:-1:-1;29010:22:0;29043:67:::1;;;::::0;-1:-1:-1;;;29043:67:0;;26417:2:1;29043:67:0::1;::::0;::::1;26399:21:1::0;26456:2;26436:18;;;26429:30;26495;26475:18;;;26468:58;26543:18;;29043:67:0::1;26215:352:1::0;29043:67:0::1;29129:68;::::0;-1:-1:-1;;;29129:68:0;;-1:-1:-1;;;;;29129:33:0;::::1;::::0;::::1;::::0;:68:::1;::::0;29163:10:::1;::::0;29183:4:::1;::::0;29190:6;;29129:68:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29121:118;;;::::0;-1:-1:-1;;;29121:118:0;;26774:2:1;29121:118:0::1;::::0;::::1;26756:21:1::0;26813:2;26793:18;;;26786:30;26852:34;26832:18;;;26825:62;-1:-1:-1;;;26903:18:1;;;26896:35;26948:19;;29121:118:0::1;26572:401:1::0;29121:118:0::1;29250:17;29291:13;29305:11;29291:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;29279:39:::1;::::0;29291:26:::1;;29279:2;:39;:::i;:::-;29270:48;::::0;:6;:48:::1;:::i;:::-;29250:68;;29329:58;29360:12;29374;29329:30;:58::i;:::-;29428:5;::::0;29403:64:::1;::::0;29448:10:::1;::::0;-1:-1:-1;;;;;29428:5:0::1;::::0;29403:64:::1;::::0;::::1;::::0;29435:11;;29460:6;;29403:64:::1;:::i;:::-;;;;;;;;28976:499;;28887:588:::0;;:::o;15774:224::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15851:22:0;::::1;15843:71;;;::::0;-1:-1:-1;;;15843:71:0;;27475:2:1;15843:71:0::1;::::0;::::1;27457:21:1::0;27514:2;27494:18;;;27487:30;27553:34;27533:18;;;27526:62;-1:-1:-1;;;27604:18:1;;;27597:34;27648:19;;15843:71:0::1;27273:400:1::0;15843:71:0::1;15925:5;:16:::0;;-1:-1:-1;;;;;;15925:16:0::1;-1:-1:-1::0;;;;;15925:16:0;::::1;::::0;;::::1;::::0;;;15957:33:::1;::::0;4978:51:1;;;15957:33:0::1;::::0;4966:2:1;4951:18;15957:33:0::1;4832:203:1::0;14499:118:0;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;14046:7:::1;::::0;;;::::1;;;14045:8;14037:39;;;;-1:-1:-1::0;;;14037:39:0::1;;;;;;;:::i;:::-;14558:7:::2;:14:::0;;-1:-1:-1;;14558:14:0::2;::::0;::::2;::::0;;14499:118::o;37985:1819::-;13814:6;;;;13813:7;13805:34;;;;-1:-1:-1;;;13805:34:0;;;;;;;:::i;:::-;13850:6;:13;;-1:-1:-1;;13850:13:0;13859:4;13850:13;;;;;14046:7;;::::1;13850:13:::0;14046:7:::1;14045:8;14037:39;;;;-1:-1:-1::0;;;14037:39:0::1;;;;;;;:::i;:::-;38106:25:::2;38134:19;:41;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;38134:41:0::2;::::0;-1:-1:-1;38134:41:0::2;::::0;38194:9:::2;::::0;:20:::2;::::0;38204:9;;38194:20:::2;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;38194:20:0::2;:34;::::0;::::2;::::0;:69:::2;;-1:-1:-1::0;;;;;;38232:31:0;::::2;::::0;::::2;38194:69;38186:123;;;::::0;-1:-1:-1;;;38186:123:0;;27880:2:1;38186:123:0::2;::::0;::::2;27862:21:1::0;27919:2;27899:18;;;27892:30;27958:34;27938:18;;;27931:62;-1:-1:-1;;;28009:18:1;;;28002:39;28058:19;;38186:123:0::2;27678:405:1::0;38186:123:0::2;38322:53;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;38322:53:0::2;::::0;::::2;::::0;38396:24;;38322:30:::2;::::0;38396:13:::2;::::0;:24:::2;::::0;38410:9;;38396:24:::2;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;::::2;;:28;:67:::0;::::2;;;;38462:1;38428:13;38442:16;38428:31;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;::::2;;:35;38396:67;38388:102;;;;-1:-1:-1::0;;;38388:102:0::2;;;;;;;:::i;:::-;38503:26;38555:13;38569:9;38555:24;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;38541:39:::2;::::0;38555:24:::2;;38541:2;:39;:::i;:::-;38532:48;::::0;:6;:48:::2;:::i;:::-;38503:77;;38593:16;38612:25;38627:9;38612:14;:25::i;:::-;38593:44;;38648:22;38673:32;38688:16;38673:14;:32::i;:::-;38648:57;;38738:1;38726:9;:13;38718:62;;;;-1:-1:-1::0;;;38718:62:0::2;;;;;;;:::i;:::-;38817:1;38799:15;:19;38791:74;;;;-1:-1:-1::0;;;38791:74:0::2;;;;;;;:::i;:::-;38878:24;38990:13;39004:16;38990:31;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;38976:46:::2;::::0;38990:31:::2;;38976:2;:46;:::i;:::-;38957:15:::0;38906:39:::2;38935:9:::0;38906:18;:39:::2;:::i;:::-;38905:68;;;;:::i;:::-;:117;;;;:::i;:::-;38878:144;;39039:49;39053:16;39071;39039:13;:49::i;:::-;-1:-1:-1::0;;;;;39113:42:0;::::2;;::::0;;;:23:::2;:42;::::0;;;;;:62;-1:-1:-1;39113:62:0::2;39105:121;;;;-1:-1:-1::0;;;39105:121:0::2;;;;;;;:::i;:::-;39288:6;39239:23;:45;39263:9;39273;39263:20;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;39263:20:0::2;39239:45:::0;;;;::::2;::::0;;;;;-1:-1:-1;39239:45:0;;;:55;;:45;;-1:-1:-1;39239:55:0::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;39305:42:0;::::2;;::::0;;;:23:::2;:42;::::0;;;;:62;;39351:16;;39305:42;:62:::2;::::0;39351:16;;39305:62:::2;:::i;:::-;::::0;;;-1:-1:-1;;39395:20:0::2;::::0;:9:::2;::::0;:20:::2;::::0;39405:9;;39395:20:::2;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;39388:76:0;;-1:-1:-1;;;;;39395:20:0::2;::::0;39388:41:::2;::::0;:76:::2;::::0;39430:10:::2;::::0;39450:4:::2;::::0;39457:6;;39388:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39380:126;;;;-1:-1:-1::0;;;39380:126:0::2;;;;;;;:::i;:::-;39525:64;::::0;-1:-1:-1;;;39525:64:0;;39560:10:::2;39525:64;::::0;::::2;25454:51:1::0;25521:18;;;25514:34;;;-1:-1:-1;;;;;39525:34:0;::::2;::::0;::::2;::::0;25427:18:1;;39525:64:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39517:116;;;::::0;-1:-1:-1;;;39517:116:0;;29101:2:1;39517:116:0::2;::::0;::::2;29083:21:1::0;29140:2;29120:18;;;29113:30;29179:34;29159:18;;;29152:62;-1:-1:-1;;;29230:18:1;;;29223:37;29277:19;;39517:116:0::2;28899:403:1::0;39517:116:0::2;39716:19;:41;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;39716:41:0::2;::::0;39694:9:::2;::::0;:20:::2;::::0;39704:9;;39694:20:::2;:::i;:::-;::::0;;;::::2;::::0;;;;;;::::2;::::0;;;;;;26136:25:1;;;26177:18;;;26170:34;;;-1:-1:-1;;;;;39694:20:0::2;::::0;39682:10:::2;::::0;39649:147:::2;::::0;26109:18:1;39649:147:0::2;;;;;;;-1:-1:-1::0;;13886:6:0;:14;;-1:-1:-1;;13886:14:0;;;-1:-1:-1;;;;;;37985:1819:0:o;45807:1274::-;13814:6;;;;13813:7;13805:34;;;;-1:-1:-1;;;13805:34:0;;;;;;;:::i;:::-;13850:6;:13;;-1:-1:-1;;13850:13:0;13859:4;13850:13;;;;;14046:7;;::::1;13850:13:::0;14046:7:::1;14045:8;14037:39;;;;-1:-1:-1::0;;;14037:39:0::1;;;;;;;:::i;:::-;45927:1:::2;45915:9;:13;45907:62;;;::::0;-1:-1:-1;;;45907:62:0;;29509:2:1;45907:62:0::2;::::0;::::2;29491:21:1::0;29548:2;29528:18;;;29521:30;29587:34;29567:18;;;29560:62;-1:-1:-1;;;29638:18:1;;;29631:34;29682:19;;45907:62:0::2;29307:400:1::0;45907:62:0::2;46018:1;-1:-1:-1::0;;;;;45988:32:0::2;:9;45998:7;45988:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;45988:18:0::2;:32:::0;45980:64:::2;;;;-1:-1:-1::0;;;45980:64:0::2;;;;;;;:::i;:::-;46088:1;46063:13;46077:7;46063:22;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;::::2;;:26;46055:61;;;;-1:-1:-1::0;;;46055:61:0::2;;;;;;;:::i;:::-;46129:15;46147:21;;;;;;;;;;;;;;-1:-1:-1::0;;;46147:21:0::2;;::::0;:14:::2;:21::i;:::-;46129:39;;46179:14;46196:23;46211:7;46196:14;:23::i;:::-;46179:40;;46251:1;46240:8;:12;46232:60;;;;-1:-1:-1::0;;;46232:60:0::2;;;;;;;:::i;:::-;46321:1;46311:7;:11;46303:58;;;;-1:-1:-1::0;;;46303:58:0::2;;;;;;;:::i;:::-;46394:9;46374:17;46475:7:::0;46434:29:::2;46454:8:::0;46394:9;46434:29:::2;:::i;:::-;46433:50;;;;:::i;:::-;46414:69;;46530:13;46544:7;46530:22;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;46516:37:::2;::::0;46530:22:::2;;46516:2;:37;:::i;:::-;46505:48;::::0;:8;:48:::2;:::i;:::-;46494:59;;46566:32;46580:7;46589:8;46566:13;:32::i;:::-;46666:8;46619:23;:43;46643:9;46653:7;46643:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;46643:18:0::2;46619:43:::0;;;;::::2;::::0;;;;;-1:-1:-1;46619:43:0;;:55:::2;;46611:114;;;;-1:-1:-1::0;;;46611:114:0::2;;;;;;;:::i;:::-;46767:4;46738:35;::::0;;;:20:::2;:35;::::0;;;;:48;;46777:9;;46738:35;:48:::2;::::0;46777:9;;46738:48:::2;:::i;:::-;;;;;;;;46844:8;46797:23;:43;46821:9;46831:7;46821:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;46821:18:0::2;46797:43:::0;;;;::::2;::::0;;;;;-1:-1:-1;46797:43:0;;;:55;;:43;;-1:-1:-1;46797:55:0::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;;46880:18:0::2;::::0;:9:::2;::::0;:18:::2;::::0;46890:7;;46880:18:::2;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;46873:57:0;;46909:10:::2;46873:57;::::0;::::2;25454:51:1::0;25521:18;;;25514:34;;;-1:-1:-1;;;;;46880:18:0::2;::::0;46873:35:::2;::::0;25427:18:1;;46873:57:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46865:105;;;;-1:-1:-1::0;;;46865:105:0::2;;;;;;;:::i;:::-;47033:9;47043:7;47033:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;;::::2;::::0;;;;;;26136:25:1;;;26177:18;;;26170:34;;;-1:-1:-1;;;;;47033:18:0::2;::::0;-1:-1:-1;;47009:10:0::2;::::0;46986:87:::2;::::0;26109:18:1;46986:87:0::2;;;;;;;-1:-1:-1::0;;13886:6:0;:14;;-1:-1:-1;;13886:14:0;;;-1:-1:-1;;;45807:1274:0:o;40758:1338::-;13814:6;;;;13813:7;13805:34;;;;-1:-1:-1;;;13805:34:0;;;;;;;:::i;:::-;13850:6;:13;;-1:-1:-1;;13850:13:0;13859:4;13850:13;;;;;14046:7;;::::1;13850:13:::0;14046:7:::1;14045:8;14037:39;;;;-1:-1:-1::0;;;14037:39:0::1;;;;;;;:::i;:::-;40905:1:::2;-1:-1:-1::0;;;;;40873:34:0::2;:9;40883;40873:20;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;40873:20:0::2;:34:::0;40865:66:::2;;;;-1:-1:-1::0;;;40865:66:0::2;;;;;;;:::i;:::-;40977:1;40950:13;40964:9;40950:24;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;::::2;;:28;40942:63;;;;-1:-1:-1::0;;;40942:63:0::2;;;;;;;:::i;:::-;41018:26;41070:13;41084:9;41070:24;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;41056:39:::2;::::0;41070:24:::2;;41056:2;:39;:::i;:::-;41047:48;::::0;:6;:48:::2;:::i;:::-;41018:77;;41108:16;41127:25;41142:9;41127:14;:25::i;:::-;41108:44;;41163:15;41181:21;;;;;;;;;;;;;;-1:-1:-1::0;;;41181:21:0::2;;::::0;:14:::2;:21::i;:::-;41163:39;;41235:1;41223:9;:13;41215:62;;;;-1:-1:-1::0;;;41215:62:0::2;;;;;;;:::i;:::-;41307:1;41296:8;:12;41288:60;;;;-1:-1:-1::0;;;41288:60:0::2;;;;;;;:::i;:::-;41361:17;41433:8:::0;41382:39:::2;41411:9:::0;41382:18;:39:::2;:::i;:::-;41381:61;;;;:::i;:::-;41361:81;;41455:31;;;;;;;;;;;;;;-1:-1:-1::0;;;41455:31:0::2;;::::0;41476:9:::2;41455:13;:31::i;:::-;41536:4;41507:35;::::0;;;:20:::2;:35;::::0;;;;;:45;-1:-1:-1;41507:45:0::2;41499:102;;;::::0;-1:-1:-1;;;41499:102:0;;31070:2:1;41499:102:0::2;::::0;::::2;31052:21:1::0;31109:2;31089:18;;;31082:30;31148:34;31128:18;;;31121:62;-1:-1:-1;;;31199:18:1;;;31192:42;31251:19;;41499:102:0::2;30868:408:1::0;41499:102:0::2;41663:6;41614:23;:45;41638:9;41648;41638:20;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;41638:20:0::2;41614:45:::0;;;;::::2;::::0;;;;;-1:-1:-1;41614:45:0;;;:55;;:45;;-1:-1:-1;41614:55:0::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;;41709:4:0::2;41680:35;::::0;;;:20:::2;:35;::::0;;;;:48;;41719:9;;41680:35;:48:::2;::::0;41719:9;;41680:48:::2;:::i;:::-;::::0;;;-1:-1:-1;;41756:20:0::2;::::0;:9:::2;::::0;:20:::2;::::0;41766:9;;41756:20:::2;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;41749:76:0;;-1:-1:-1;;;;;41756:20:0::2;::::0;41749:41:::2;::::0;:76:::2;::::0;41791:10:::2;::::0;41811:4:::2;::::0;41818:6;;41749:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41741:126;;;;-1:-1:-1::0;;;41741:126:0::2;;;;;;;:::i;:::-;41896:37;::::0;41881:9:::2;::::0;41896:10:::2;::::0;41919:9;;41881;41896:37;41881:9;41896:37;41919:9;41896:10;:37:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41880:53;;;41952:4;41944:45;;;::::0;-1:-1:-1;;;41944:45:0;;31693:2:1;41944:45:0::2;::::0;::::2;31675:21:1::0;31732:2;31712:18;;;31705:30;31771;31751:18;;;31744:58;31819:18;;41944:45:0::2;31491:352:1::0;41944:45:0::2;42036:9;42046;42036:20;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;;::::2;::::0;;;;;;26136:25:1;;;26177:18;;;26170:34;;;-1:-1:-1;;;;;42036:20:0::2;::::0;42024:10:::2;::::0;42005:83:::2;::::0;26109:18:1;42005:83:0::2;;;;;;;-1:-1:-1::0;;13886:6:0;:14;;-1:-1:-1;;13886:14:0;;;-1:-1:-1;;;;;40758:1338:0:o;30064:659::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;30165:20:::1;30188:9;30198:11;30188:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;-1:-1:-1;;;;;30188:22:0::1;::::0;-1:-1:-1;30188:22:0;30221:67:::1;;;::::0;-1:-1:-1;;;30221:67:0;;26417:2:1;30221:67:0::1;::::0;::::1;26399:21:1::0;26456:2;26436:18;;;26429:30;26495;26475:18;;;26468:58;26543:18;;30221:67:0::1;26215:352:1::0;30221:67:0::1;30299:17;30340:13;30354:11;30340:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;30328:39:::1;::::0;30340:26:::1;;30328:2;:39;:::i;:::-;30319:48;::::0;:6;:48:::1;:::i;:::-;-1:-1:-1::0;;;;;30386:37:0;::::1;;::::0;;;:23:::1;:37;::::0;;;;;30299:68;;-1:-1:-1;30386:53:0;-1:-1:-1;30386:53:0::1;30378:86;;;::::0;-1:-1:-1;;;30378:86:0;;32050:2:1;30378:86:0::1;::::0;::::1;32032:21:1::0;32089:2;32069:18;;;32062:30;-1:-1:-1;;;32108:18:1;;;32101:50;32168:18;;30378:86:0::1;31848:344:1::0;30378:86:0::1;30475:58;30506:12;30520;30475:30;:58::i;:::-;30582:5;::::0;30552:44:::1;::::0;-1:-1:-1;;;30552:44:0;;-1:-1:-1;;;;;30582:5:0;;::::1;30552:44;::::0;::::1;25454:51:1::0;25521:18;;;25514:34;;;30552:29:0;;::::1;::::0;::::1;::::0;25427:18:1;;30552:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30544:91;;;::::0;-1:-1:-1;;;30544:91:0;;32399:2:1;30544:91:0::1;::::0;::::1;32381:21:1::0;32438:2;32418:18;;;32411:30;32477:34;32457:18;;;32450:62;-1:-1:-1;;;32528:18:1;;;32521:32;32570:19;;30544:91:0::1;32197:398:1::0;30544:91:0::1;30676:5;::::0;30651:64:::1;::::0;30696:10:::1;::::0;-1:-1:-1;;;;;30676:5:0::1;::::0;30651:64:::1;::::0;::::1;::::0;30683:11;;30708:6;;30651:64:::1;:::i;27947:385::-:0;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;28042:25:::1;28070:19;28090:16;28070:37;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;-1:-1:-1;;;;;28070:37:0::1;::::0;-1:-1:-1;28070:37:0;28118:64:::1;;;::::0;-1:-1:-1;;;28118:64:0;;32802:2:1;28118:64:0::1;::::0;::::1;32784:21:1::0;32841:2;32821:18;;;32814:30;-1:-1:-1;;;32860:18:1;;;32853:50;32920:18;;28118:64:0::1;32600:344:1::0;28118:64:0::1;28200:19;28220:16;28200:37;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;28193:44;;-1:-1:-1;;;;;;28193:44:0::1;::::0;;28281:5:::1;::::0;-1:-1:-1;;;;;28281:5:0::1;::::0;28253:71:::1;::::0;::::1;::::0;28288:16;;28306:17;;28253:71:::1;:::i;35509:1482::-:0;13814:6;;;;13813:7;13805:34;;;;-1:-1:-1;;;13805:34:0;;;;;;;:::i;:::-;13850:6;:13;;-1:-1:-1;;13850:13:0;13859:4;13850:13;;;;;14046:7;;::::1;13850:13:::0;14046:7:::1;14045:8;14037:39;;;;-1:-1:-1::0;;;14037:39:0::1;;;;;;;:::i;:::-;35669:1:::2;-1:-1:-1::0;;;;;35637:34:0::2;:9;35647;35637:20;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;35637:20:0::2;:34;::::0;::::2;::::0;:70:::2;;;35705:1;-1:-1:-1::0;;;;;35675:32:0::2;:9;35685:7;35675:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;35675:18:0::2;:32;;35637:70;35629:102;;;;-1:-1:-1::0;;;35629:102:0::2;;;;;;;:::i;:::-;35777:1;35750:13;35764:9;35750:24;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;::::2;;:28;:58:::0;::::2;;;;35807:1;35782:13;35796:7;35782:22;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;::::2;;:26;35750:58;35742:93;;;;-1:-1:-1::0;;;35742:93:0::2;;;;;;;:::i;:::-;35848:26;35900:13;35914:9;35900:24;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;35886:39:::2;::::0;35900:24:::2;;35886:2;:39;:::i;:::-;35877:48;::::0;:6;:48:::2;:::i;:::-;35848:77;;35938:16;35957:25;35972:9;35957:14;:25::i;:::-;35938:44;;35993:14;36010:23;36025:7;36010:14;:23::i;:::-;35993:40;;36066:1;36054:9;:13;36046:62;;;;-1:-1:-1::0;;;36046:62:0::2;;;;;;;:::i;:::-;36137:1;36127:7;:11;36119:58;;;;-1:-1:-1::0;;;36119:58:0::2;;;;;;;:::i;:::-;36190:16;36286:13;36300:7;36286:22;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;36272:37:::2;::::0;36286:22:::2;;36272:2;:37;:::i;:::-;36261:7:::0;36210:39:::2;36239:9:::0;36210:18;:39:::2;:::i;:::-;36209:60;;;;:::i;:::-;:100;;;;:::i;:::-;36190:119;;36322:30;36336:7;36345:6;36322:13;:30::i;:::-;36420:8;36373:23;:43;36397:9;36407:7;36397:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;36397:18:0::2;36373:43:::0;;;;::::2;::::0;;;;;-1:-1:-1;36373:43:0;;:55:::2;;36365:114;;;;-1:-1:-1::0;;;36365:114:0::2;;;;;;;:::i;:::-;36541:6;36492:23;:45;36516:9;36526;36516:20;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;36516:20:0::2;36492:45:::0;;;;::::2;::::0;;;;;-1:-1:-1;36492:45:0;;;:55;;:45;;-1:-1:-1;36492:55:0::2;::::0;;;::::2;:::i;:::-;;;;;;;;36607:8;36560:23;:43;36584:9;36594:7;36584:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;36584:18:0::2;36560:43:::0;;;;::::2;::::0;;;;;-1:-1:-1;36560:43:0;;;:55;;:43;;-1:-1:-1;36560:55:0::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;;36643:20:0::2;::::0;:9:::2;::::0;:20:::2;::::0;36653:9;;36643:20:::2;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;36636:76:0;;-1:-1:-1;;;;;36643:20:0::2;::::0;36636:41:::2;::::0;:76:::2;::::0;36678:10:::2;::::0;36698:4:::2;::::0;36705:6;;36636:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36628:126;;;;-1:-1:-1::0;;;36628:126:0::2;;;;;;;:::i;:::-;36780:9;36790:7;36780:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;36773:57:0;;36809:10:::2;36773:57;::::0;::::2;25454:51:1::0;25521:18;;;25514:34;;;-1:-1:-1;;;;;36780:18:0::2;::::0;36773:35:::2;::::0;25427:18:1;;36773:57:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36765:105;;;;-1:-1:-1::0;;;36765:105:0::2;;;;;;;:::i;:::-;36934:9;36944:7;36934:18;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;36934:18:0::2;::::0;36912:9:::2;::::0;:20:::2;::::0;36922:9;;36912:20:::2;:::i;:::-;::::0;;;::::2;::::0;;;;;;::::2;::::0;;;;;;26136:25:1;;;26177:18;;;26170:34;;;-1:-1:-1;;;;;36912:20:0::2;::::0;36900:10:::2;::::0;36886:97:::2;::::0;26109:18:1;36886:97:0::2;25962:248:1::0;22766:413:0;22826:22;22883:4;-1:-1:-1;;;;;22871:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22861:34;;22913:6;22908:237;22925:15;;;22908:237;;;22963:12;;23008:4;23027;;23032:1;23027:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;23000:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22962:73;;;;23058:7;23050:49;;;;-1:-1:-1;;;23050:49:0;;33677:2:1;23050:49:0;;;33659:21:1;33716:2;33696:18;;;33689:30;33755:31;33735:18;;;33728:59;33804:18;;23050:49:0;33475:353:1;23050:49:0;23127:6;23114:7;23122:1;23114:10;;;;;;;;:::i;:::-;;;;;;;;;;:19;-1:-1:-1;;22942:3:0;;22908:237;;;;22766:413;;;;;:::o;23771:241::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;23891:12:::1;23866:9;23876:11;23866:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:37;;-1:-1:-1;;;;;23866:37:0;;;::::1;-1:-1:-1::0;;;;;;23866:37:0;;::::1;::::0;;;::::1;::::0;;:22:::1;23914:30:::0;;23866:37;23914:30;::::1;::::0;;;;;;::::1;;23932:11:::0;23914:30;::::1;:::i;:::-;-1:-1:-1::0;23971:5:0::1;::::0;23960:44:::1;::::0;-1:-1:-1;;;;;23971:5:0;;::::1;::::0;23960:44:::1;::::0;::::1;::::0;23978:11;;23991:12;;23960:44:::1;:::i;21048:301::-:0;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;21164:5:::1;21141:19;:28;;21133:88;;;::::0;-1:-1:-1;;;21133:88:0;;35388:2:1;21133:88:0::1;::::0;::::1;35370:21:1::0;35427:2;35407:18;;;35400:30;35466:34;35446:18;;;35439:62;-1:-1:-1;;;35517:18:1;;;35510:45;35572:19;;21133:88:0::1;35186:411:1::0;21133:88:0::1;21232:18;:40:::0;;;21314:5:::1;::::0;21288:53:::1;::::0;2041:25:1;;;-1:-1:-1;;;;;21314:5:0;;::::1;::::0;21288:53:::1;::::0;2029:2:1;2014:18;21288:53:0::1;1895:177:1::0;15000:164:0;13577:7;;;;;;;13576:8;13568:42;;;;-1:-1:-1;;;13568:42:0;;35804:2:1;13568:42:0;;;35786:21:1;35843:2;35823:18;;;35816:30;-1:-1:-1;;;35862:18:1;;;35855:51;35923:18;;13568:42:0;35602:345:1;13568:42:0;15045:5:::1;:18:::0;;-1:-1:-1;;;;;;15045:18:0::1;15053:10;15045:18:::0;;::::1;::::0;;;15095:4:::1;15074:18;:25:::0;;;15115:41:::1;::::0;2041:25:1;;;15115:41:0::1;::::0;2029:2:1;2014:18;15115:41:0::1;;;;;;;13633:7:::0;:14;;-1:-1:-1;;13633:14:0;;;;;15000:164::o;17320:227::-;17393:7;17455:1;-1:-1:-1;;;;;17421:36:0;:9;17431:11;17421:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;17421:22:0;:36;17413:86;;;;-1:-1:-1;;;17413:86:0;;36154:2:1;17413:86:0;;;36136:21:1;36193:2;36173:18;;;36166:30;36232:34;36212:18;;;36205:62;-1:-1:-1;;;36283:18:1;;;36276:35;36328:19;;17413:86:0;35952:401:1;17413:86:0;17517:9;17527:11;17517:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;17517:22:0;;17320:227;-1:-1:-1;;17320:227:0:o;25223:276::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;25340:2:::1;25328:8;:14;;;;25320:61;;;::::0;-1:-1:-1;;;25320:61:0;;36560:2:1;25320:61:0::1;::::0;::::1;36542:21:1::0;36599:2;36579:18;;;36572:30;36638:34;36618:18;;;36611:62;-1:-1:-1;;;36689:18:1;;;36682:32;36731:19;;25320:61:0::1;36358:398:1::0;25320:61:0::1;25421:8;25392:13;25406:11;25392:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:37;;::::1;::::0;;;::::1;-1:-1:-1::0;;25392:37:0;;::::1;::::0;;;::::1;::::0;;;25462:5:::1;::::0;-1:-1:-1;;;;;25462:5:0::1;::::0;25445:46:::1;::::0;::::1;::::0;25469:11;;25482:8;;25445:46:::1;:::i;27450:329::-:0;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;27530:24:::1;27557:13;27571:11;27557:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;-1:-1:-1;;;;;27557:26:0::1;::::0;-1:-1:-1;27557:26:0;27594:63:::1;;;::::0;-1:-1:-1;;;27594:63:0;;37265:2:1;27594:63:0::1;::::0;::::1;37247:21:1::0;37304:2;37284:18;;;37277:30;-1:-1:-1;;;37323:18:1;;;37316:50;37383:18;;27594:63:0::1;37063:344:1::0;27594:63:0::1;27675:13;27689:11;27675:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;27668:33;;-1:-1:-1;;;;;;27668:33:0::1;::::0;;27734:5:::1;::::0;-1:-1:-1;;;;;27734:5:0::1;::::0;27717:54:::1;::::0;::::1;::::0;27741:11;;27754:16;;27717:54:::1;:::i;19239:431::-:0;19375:12;:19;19288:23;;;;-1:-1:-1;;;;;19362:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19432:12:0;:19;19352:43;;-1:-1:-1;;;;;;19418:34:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19418:34:0;;19406:46;;19470:6;19465:158;19486:12;:19;19482:23;;19465:158;;;19540:12;19553:1;19540:15;;;;;;;;:::i;:::-;;;;;;;;19527:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;19535:1;19527:10;;;;;;;;:::i;:::-;;;;;;:28;;;;19585:9;19595:12;19608:1;19595:15;;;;;;;;:::i;:::-;;;;;;;;19585:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;19570:12;;-1:-1:-1;;;;;19585:26:0;;;;19570:9;;19580:1;;19570:12;;;;;;:::i;:::-;-1:-1:-1;;;;;19570:41:0;;;:12;;;;;;;;;;;:41;19507:3;;19465:158;;;;19239:431;;:::o;34081:354::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;34190:4:::1;34161:35;::::0;;;:20:::1;:35;::::0;;;;;34151:45;::::1;;34143:78;;;::::0;-1:-1:-1;;;34143:78:0;;32050:2:1;34143:78:0::1;::::0;::::1;32032:21:1::0;32089:2;32069:18;;;32062:30;-1:-1:-1;;;32108:18:1;;;32101:50;32168:18;;34143:78:0::1;31848:344:1::0;34143:78:0::1;34261:4;34232:35;::::0;;;:20:::1;:35;::::0;;;;:45;;34271:6;;34232:35;:45:::1;::::0;34271:6;;34232:45:::1;:::i;:::-;::::0;;;-1:-1:-1;;34304:34:0::1;::::0;34289:9:::1;::::0;34304:10:::1;::::0;34327:6;;34289:9;34304:34;34289:9;34304:34;34327:6;34304:10;:34:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34288:50;;;34357:4;34349:35;;;::::0;-1:-1:-1;;;34349:35:0;;37614:2:1;34349:35:0::1;::::0;::::1;37596:21:1::0;37653:2;37633:18;;;37626:30;-1:-1:-1;;;37672:18:1;;;37665:48;37730:18;;34349:35:0::1;37412:342:1::0;34349:35:0::1;34413:5;::::0;34400:27:::1;::::0;2041:25:1;;;-1:-1:-1;;;;;34413:5:0;;::::1;::::0;34400:27:::1;::::0;2029:2:1;2014:18;34400:27:0::1;1895:177:1::0;16819:101:0;16867:13;16900:12;16893:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16819:101;:::o;32322:234::-;13352:5;;-1:-1:-1;;;;;13352:5:0;13338:10;:19;13330:65;;;;-1:-1:-1;;;13330:65:0;;;;;;;:::i;:::-;32400:1:::1;32388:9;:13;32380:63;;;::::0;-1:-1:-1;;;32380:63:0;;37961:2:1;32380:63:0::1;::::0;::::1;37943:21:1::0;38000:2;37980:18;;;37973:30;38039:34;38019:18;;;38012:62;-1:-1:-1;;;38090:18:1;;;38083:35;38135:19;;32380:63:0::1;37759:401:1::0;32380:63:0::1;32483:4;32454:35;::::0;;;:20:::1;:35;::::0;;;;:48;;32493:9:::1;::::0;32454:35;:48:::1;::::0;32493:9;;32454:48:::1;:::i;:::-;::::0;;;-1:-1:-1;;32531:5:0::1;::::0;32518:30:::1;::::0;32538:9:::1;2041:25:1::0;;-1:-1:-1;;;;;32531:5:0;;::::1;::::0;32518:30:::1;::::0;2029:2:1;2014:18;32518:30:0::1;;;;;;;32322:234::o:0;20660:204::-;20732:6;20751:21;20787:13;20801:11;20787:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;20832:24:0;;;;-1:-1:-1;;;;;20787:26:0;;;;-1:-1:-1;20787:26:0;;20832:22;;:24;;;;;;;;;;20787:26;20832:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20825:31;20660:204;-1:-1:-1;;;20660:204:0:o;19882:579::-;20006:1;19977:13;19991:11;19977:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:30;19969:65;;;;-1:-1:-1;;;19969:65:0;;;;;;;:::i;:::-;20051:18;20072:27;20087:11;20072:14;:27::i;:::-;20051:48;-1:-1:-1;20110:20:0;20167:4;20134:29;20051:48;20134:6;:29;:::i;:::-;20133:38;;;;:::i;:::-;20110:61;;20226:13;20240:11;20226:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;20212:41;;20226:26;;20212:2;:41;:::i;:::-;20197:56;;:12;:56;:::i;:::-;20182:71;;20266:19;20320:4;20298:18;;20289:6;:27;;;;:::i;:::-;20288:36;;;;:::i;:::-;20266:58;-1:-1:-1;20359:23:0;20266:58;20359:6;:23;:::i;:::-;20343:12;:39;;:82;;;;-1:-1:-1;20402:23:0;20411:14;20402:6;:23;:::i;:::-;20386:12;:39;;20343:82;20335:118;;;;-1:-1:-1;;;20335:118:0;;38555:2:1;20335:118:0;;;38537:21:1;38594:2;38574:18;;;38567:30;38633:25;38613:18;;;38606:53;38676:18;;20335:118:0;38353:347:1;20335:118:0;19958:503;;;19882:579;;:::o;29698:135::-;-1:-1:-1;;;;;29785:30:0;;;;;;:23;:30;;;;;:40;;29819:6;;29785:30;:40;;29819:6;;29785:40;:::i;:::-;;;;-1:-1:-1;;;;29698:135:0:o;30946:::-;-1:-1:-1;;;;;31033:30:0;;;;;;:23;:30;;;;;:40;;31067:6;;31033:30;:40;;31067:6;;31033:40;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:632;211:5;-1:-1:-1;;;;;282:2:1;274:6;271:14;268:40;;;288:18;;:::i;:::-;363:2;357:9;331:2;417:15;;-1:-1:-1;;413:24:1;;;439:2;409:33;405:42;393:55;;;463:18;;;483:22;;;460:46;457:72;;;509:18;;:::i;:::-;549:10;545:2;538:22;578:6;569:15;;608:6;600;593:22;648:3;639:6;634:3;630:16;627:25;624:45;;;665:1;662;655:12;624:45;715:6;710:3;703:4;695:6;691:17;678:44;770:1;763:4;754:6;746;742:19;738:30;731:41;;;;146:632;;;;;:::o;783:222::-;826:5;879:3;872:4;864:6;860:17;856:27;846:55;;897:1;894;887:12;846:55;919:80;995:3;986:6;973:20;966:4;958:6;954:17;919:80;:::i;1010:322::-;1079:6;1132:2;1120:9;1111:7;1107:23;1103:32;1100:52;;;1148:1;1145;1138:12;1100:52;1188:9;1175:23;-1:-1:-1;;;;;1213:6:1;1210:30;1207:50;;;1253:1;1250;1243:12;1207:50;1276;1318:7;1309:6;1298:9;1294:22;1276:50;:::i;:::-;1266:60;1010:322;-1:-1:-1;;;;1010:322:1:o;1526:173::-;1594:20;;-1:-1:-1;;;;;1643:31:1;;1633:42;;1623:70;;1689:1;1686;1679:12;1623:70;1526:173;;;:::o;1704:186::-;1763:6;1816:2;1804:9;1795:7;1791:23;1787:32;1784:52;;;1832:1;1829;1822:12;1784:52;1855:29;1874:9;1855:29;:::i;2077:396::-;2155:6;2163;2216:2;2204:9;2195:7;2191:23;2187:32;2184:52;;;2232:1;2229;2222:12;2184:52;2272:9;2259:23;-1:-1:-1;;;;;2297:6:1;2294:30;2291:50;;;2337:1;2334;2327:12;2291:50;2360;2402:7;2393:6;2382:9;2378:22;2360:50;:::i;:::-;2350:60;;;2429:38;2463:2;2452:9;2448:18;2429:38;:::i;:::-;2419:48;;2077:396;;;;;:::o;2478:592::-;2549:6;2557;2610:2;2598:9;2589:7;2585:23;2581:32;2578:52;;;2626:1;2623;2616:12;2578:52;2666:9;2653:23;-1:-1:-1;;;;;2736:2:1;2728:6;2725:14;2722:34;;;2752:1;2749;2742:12;2722:34;2790:6;2779:9;2775:22;2765:32;;2835:7;2828:4;2824:2;2820:13;2816:27;2806:55;;2857:1;2854;2847:12;2806:55;2897:2;2884:16;2923:2;2915:6;2912:14;2909:34;;;2939:1;2936;2929:12;2909:34;2984:7;2979:2;2970:6;2966:2;2962:15;2958:24;2955:37;2952:57;;;3005:1;3002;2995:12;2952:57;3036:2;3028:11;;;;;3058:6;;-1:-1:-1;2478:592:1;;-1:-1:-1;;;;2478:592:1:o;3075:524::-;3152:6;3160;3213:2;3201:9;3192:7;3188:23;3184:32;3181:52;;;3229:1;3226;3219:12;3181:52;3252:29;3271:9;3252:29;:::i;:::-;3242:39;;3332:2;3321:9;3317:18;3304:32;-1:-1:-1;;;;;3351:6:1;3348:30;3345:50;;;3391:1;3388;3381:12;3345:50;3414:22;;3467:4;3459:13;;3455:27;-1:-1:-1;3445:55:1;;3496:1;3493;3486:12;3445:55;3519:74;3585:7;3580:2;3567:16;3562:2;3558;3554:11;3519:74;:::i;:::-;3509:84;;;3075:524;;;;;:::o;3604:250::-;3689:1;3699:113;3713:6;3710:1;3707:13;3699:113;;;3789:11;;;3783:18;3770:11;;;3763:39;3735:2;3728:10;3699:113;;;-1:-1:-1;;3846:1:1;3828:16;;3821:27;3604:250::o;3859:270::-;3900:3;3938:5;3932:12;3965:6;3960:3;3953:19;3981:76;4050:6;4043:4;4038:3;4034:14;4027:4;4020:5;4016:16;3981:76;:::i;:::-;4111:2;4090:15;-1:-1:-1;;4086:29:1;4077:39;;;;4118:4;4073:50;;3859:270;-1:-1:-1;;3859:270:1:o;4134:298::-;4317:6;4310:14;4303:22;4292:9;4285:41;4362:2;4357;4346:9;4342:18;4335:30;4266:4;4382:44;4422:2;4411:9;4407:18;4399:6;4382:44;:::i;4437:390::-;4515:6;4523;4576:2;4564:9;4555:7;4551:23;4547:32;4544:52;;;4592:1;4589;4582:12;4544:52;4632:9;4619:23;-1:-1:-1;;;;;4657:6:1;4654:30;4651:50;;;4697:1;4694;4687:12;4651:50;4720;4762:7;4753:6;4742:9;4738:22;4720:50;:::i;:::-;4710:60;4817:2;4802:18;;;;4789:32;;-1:-1:-1;;;;4437:390:1:o;5232:611::-;5329:6;5337;5345;5398:2;5386:9;5377:7;5373:23;5369:32;5366:52;;;5414:1;5411;5404:12;5366:52;5454:9;5441:23;-1:-1:-1;;;;;5524:2:1;5516:6;5513:14;5510:34;;;5540:1;5537;5530:12;5510:34;5563:50;5605:7;5596:6;5585:9;5581:22;5563:50;:::i;:::-;5553:60;;5666:2;5655:9;5651:18;5638:32;5622:48;;5695:2;5685:8;5682:16;5679:36;;;5711:1;5708;5701:12;5679:36;;5734:52;5778:7;5767:8;5756:9;5752:24;5734:52;:::i;:::-;5724:62;;;5833:2;5822:9;5818:18;5805:32;5795:42;;5232:611;;;;;:::o;5848:626::-;5945:6;5953;6006:2;5994:9;5985:7;5981:23;5977:32;5974:52;;;6022:1;6019;6012:12;5974:52;6062:9;6049:23;-1:-1:-1;;;;;6132:2:1;6124:6;6121:14;6118:34;;;6148:1;6145;6138:12;6118:34;6186:6;6175:9;6171:22;6161:32;;6231:7;6224:4;6220:2;6216:13;6212:27;6202:55;;6253:1;6250;6243:12;6202:55;6293:2;6280:16;6319:2;6311:6;6308:14;6305:34;;;6335:1;6332;6325:12;6305:34;6388:7;6383:2;6373:6;6370:1;6366:14;6362:2;6358:23;6354:32;6351:45;6348:65;;;6409:1;6406;6399:12;6479:800;6639:4;6668:2;6708;6697:9;6693:18;6738:2;6727:9;6720:21;6761:6;6796;6790:13;6827:6;6819;6812:22;6865:2;6854:9;6850:18;6843:25;;6927:2;6917:6;6914:1;6910:14;6899:9;6895:30;6891:39;6877:53;;6965:2;6957:6;6953:15;6986:1;6996:254;7010:6;7007:1;7004:13;6996:254;;;7103:2;7099:7;7087:9;7079:6;7075:22;7071:36;7066:3;7059:49;7131:39;7163:6;7154;7148:13;7131:39;:::i;:::-;7121:49;-1:-1:-1;7228:12:1;;;;7193:15;;;;7032:1;7025:9;6996:254;;;-1:-1:-1;7267:6:1;;6479:800;-1:-1:-1;;;;;;;6479:800:1:o;7284:180::-;7343:6;7396:2;7384:9;7375:7;7371:23;7367:32;7364:52;;;7412:1;7409;7402:12;7364:52;-1:-1:-1;7435:23:1;;7284:180;-1:-1:-1;7284:180:1:o;7469:479::-;7545:6;7553;7606:2;7594:9;7585:7;7581:23;7577:32;7574:52;;;7622:1;7619;7612:12;7574:52;7662:9;7649:23;-1:-1:-1;;;;;7687:6:1;7684:30;7681:50;;;7727:1;7724;7717:12;7681:50;7750;7792:7;7783:6;7772:9;7768:22;7750:50;:::i;:::-;7740:60;;;7850:2;7839:9;7835:18;7822:32;7894:4;7887:5;7883:16;7876:5;7873:27;7863:55;;7914:1;7911;7904:12;7863:55;7937:5;7927:15;;;7469:479;;;;;:::o;7953:1357::-;8193:4;8241:2;8230:9;8226:18;8271:2;8260:9;8253:21;8294:6;8329;8323:13;8360:6;8352;8345:22;8398:2;8387:9;8383:18;8376:25;;8460:2;8450:6;8447:1;8443:14;8432:9;8428:30;8424:39;8410:53;;8482:4;8521:2;8513:6;8509:15;8542:1;8552:254;8566:6;8563:1;8560:13;8552:254;;;8659:2;8655:7;8643:9;8635:6;8631:22;8627:36;8622:3;8615:49;8687:39;8719:6;8710;8704:13;8687:39;:::i;:::-;8677:49;-1:-1:-1;8784:12:1;;;;8749:15;;;;8588:1;8581:9;8552:254;;;-1:-1:-1;;8842:22:1;;;8822:18;;;8815:50;8918:13;;8940:24;;;9022:15;;;;8982;;;-1:-1:-1;8918:13:1;-1:-1:-1;9057:1:1;9067:215;9083:8;9078:3;9075:17;9067:215;;;9156:15;;-1:-1:-1;;;;;9152:41:1;9138:56;;9255:17;;;;9216:14;;;;9190:1;9102:11;9067:215;;;-1:-1:-1;9299:5:1;;7953:1357;-1:-1:-1;;;;;;;7953:1357:1:o;9315:219::-;9464:2;9453:9;9446:21;9427:4;9484:44;9524:2;9513:9;9509:18;9501:6;9484:44;:::i;9719:289::-;9850:3;9888:6;9882:13;9904:66;9963:6;9958:3;9951:4;9943:6;9939:17;9904:66;:::i;:::-;9986:16;;;;;9719:289;-1:-1:-1;;9719:289:1:o;10364:397::-;10566:2;10548:21;;;10605:2;10585:18;;;10578:30;10644:34;10639:2;10624:18;;10617:62;-1:-1:-1;;;10710:2:1;10695:18;;10688:31;10751:3;10736:19;;10364:397::o;10766:316::-;10943:2;10932:9;10925:21;10906:4;10963:44;11003:2;10992:9;10988:18;10980:6;10963:44;:::i;:::-;10955:52;;11072:1;11068;11063:3;11059:11;11055:19;11047:6;11043:32;11038:2;11027:9;11023:18;11016:60;10766:316;;;;;:::o;11087:342::-;11289:2;11271:21;;;11328:2;11308:18;;;11301:30;-1:-1:-1;;;11362:2:1;11347:18;;11340:48;11420:2;11405:18;;11087:342::o;11434:380::-;11513:1;11509:12;;;;11556;;;11577:61;;11631:4;11623:6;11619:17;11609:27;;11577:61;11684:2;11676:6;11673:14;11653:18;11650:38;11647:161;;11730:10;11725:3;11721:20;11718:1;11711:31;11765:4;11762:1;11755:15;11793:4;11790:1;11783:15;11647:161;;11434:380;;;:::o;11948:726::-;12001:3;12042:5;12036:12;12071:36;12097:9;12071:36;:::i;:::-;12126:1;12143:17;;;12169:133;;;;12316:1;12311:357;;;;12136:532;;12169:133;-1:-1:-1;;12202:24:1;;12190:37;;12275:14;;12268:22;12256:35;;12247:45;;;-1:-1:-1;12169:133:1;;12311:357;12342:5;12339:1;12332:16;12371:4;12416;12413:1;12403:18;12443:1;12457:165;12471:6;12468:1;12465:13;12457:165;;;12549:14;;12536:11;;;12529:35;12592:16;;;;12486:10;;12457:165;;;12461:3;;;12651:6;12646:3;12642:16;12635:23;;12136:532;;;;;11948:726;;;;:::o;12679:202::-;12809:3;12834:41;12871:3;12863:6;12834:41;:::i;12886:271::-;13069:6;13061;13056:3;13043:33;13025:3;13095:16;;13120:13;;;13095:16;12886:271;-1:-1:-1;12886:271:1:o;13579:518::-;13681:2;13676:3;13673:11;13670:421;;;13717:5;13714:1;13707:16;13761:4;13758:1;13748:18;13831:2;13819:10;13815:19;13812:1;13808:27;13802:4;13798:38;13867:4;13855:10;13852:20;13849:47;;;-1:-1:-1;13890:4:1;13849:47;13945:2;13940:3;13936:12;13933:1;13929:20;13923:4;13919:31;13909:41;;14000:81;14018:2;14011:5;14008:13;14000:81;;;14077:1;14063:16;;14044:1;14033:13;14000:81;;14102:166;-1:-1:-1;;14230:1:1;14226:11;;;14222:24;14218:29;14208:40;14254:1;14250:11;;;;14205:57;;14102:166::o;14273:1201::-;-1:-1:-1;;;;;14392:3:1;14389:27;14386:53;;;14419:18;;:::i;:::-;14448:94;14538:3;14498:38;14530:4;14524:11;14498:38;:::i;:::-;14492:4;14448:94;:::i;:::-;14568:1;14593:2;14588:3;14585:11;14610:1;14605:611;;;;15260:1;15277:3;15274:93;;;-1:-1:-1;15333:19:1;;;15320:33;15274:93;15393:64;15453:3;15446:5;15393:64;:::i;:::-;15387:4;15380:78;;14578:890;;14605:611;11895:1;11888:14;;;11932:4;11919:18;;-1:-1:-1;;14641:17:1;;;14759:229;14773:7;14770:1;14767:14;14759:229;;;14862:19;;;14849:33;14834:49;;14969:4;14954:20;;;;14922:1;14910:14;;;;14789:12;14759:229;;;14763:3;15016;15007:7;15004:16;15001:159;;;15140:1;15136:6;15130:3;15124;15121:1;15117:11;15113:21;15109:34;15105:39;15092:9;15087:3;15083:19;15070:33;15066:79;15058:6;15051:95;15001:159;;;15203:1;15197:3;15194:1;15190:11;15186:19;15180:4;15173:33;14578:890;;14273:1201;;;:::o;16467:377::-;16660:2;16649:9;16642:21;16623:4;16686:44;16726:2;16715:9;16711:18;16703:6;16686:44;:::i;:::-;16778:9;16770:6;16766:22;16761:2;16750:9;16746:18;16739:50;16806:32;16831:6;16823;16806:32;:::i;:::-;16798:40;16467:377;-1:-1:-1;;;;;16467:377:1:o;17193:127::-;17254:10;17249:3;17245:20;17242:1;17235:31;17285:4;17282:1;17275:15;17309:4;17306:1;17299:15;17530:127;17591:10;17586:3;17582:20;17579:1;17572:31;17622:4;17619:1;17612:15;17646:4;17643:1;17636:15;17662:128;17729:9;;;17750:11;;;17747:37;;;17764:18;;:::i;17795:1433::-;17914:3;17908:4;17905:13;17902:26;;17921:5;;17795:1433::o;17902:26::-;17951:37;17983:3;17977:10;17951:37;:::i;:::-;-1:-1:-1;;;;;18003:6:1;18000:30;17997:56;;;18033:18;;:::i;:::-;18062:97;18152:6;18112:38;18144:4;18138:11;18112:38;:::i;:::-;18106:4;18062:97;:::i;:::-;18185:1;18213:2;18205:6;18202:14;18230:1;18225:746;;;;19015:1;19032:6;19029:89;;;-1:-1:-1;19084:19:1;;;19078:26;19029:89;19144:67;19204:6;19197:5;19144:67;:::i;:::-;19138:4;19131:81;;18195:1027;;18225:746;11895:1;11888:14;;;11932:4;11919:18;;;11888:14;;;11919:18;;;-1:-1:-1;;18261:20:1;;;18445:251;18459:7;18456:1;18453:14;18445:251;;;18541:21;;;18535:28;18520:44;;18591:1;18664:18;;;;18619:15;;;;18482:4;18475:12;18445:251;;;18449:3;18724:6;18715:7;18712:19;18709:203;;;18785:21;;;18779:28;-1:-1:-1;;18870:1:1;18866:14;;;18882:3;18862:24;18858:37;18854:42;18839:58;18824:74;;18709:203;-1:-1:-1;;;;;18958:1:1;18942:14;;;18938:22;18925:36;;-1:-1:-1;17795:1433:1:o;19233:127::-;19294:10;19289:3;19285:20;19282:1;19275:31;19325:4;19322:1;19315:15;19349:4;19346:1;19339:15;19716:338;19918:2;19900:21;;;19957:2;19937:18;;;19930:30;-1:-1:-1;;;19991:2:1;19976:18;;19969:44;20045:2;20030:18;;19716:338::o;20059:269::-;-1:-1:-1;;;20261:33:1;;20319:2;20310:12;;20059:269::o;20735:346::-;20937:2;20919:21;;;20976:2;20956:18;;;20949:30;-1:-1:-1;;;21010:2:1;20995:18;;20988:52;21072:2;21057:18;;20735:346::o;21086:416::-;21175:1;21212:5;21175:1;21226:270;21247:7;21237:8;21234:21;21226:270;;;21306:4;21302:1;21298:6;21294:17;21288:4;21285:27;21282:53;;;21315:18;;:::i;:::-;21365:7;21355:8;21351:22;21348:55;;;21385:16;;;;21348:55;21464:22;;;;21424:15;;;;21226:270;;;21230:3;21086:416;;;;;:::o;21507:806::-;21556:5;21586:8;21576:80;;-1:-1:-1;21627:1:1;21641:5;;21576:80;21675:4;21665:76;;-1:-1:-1;21712:1:1;21726:5;;21665:76;21757:4;21775:1;21770:59;;;;21843:1;21838:130;;;;21750:218;;21770:59;21800:1;21791:10;;21814:5;;;21838:130;21875:3;21865:8;21862:17;21859:43;;;21882:18;;:::i;:::-;-1:-1:-1;;21938:1:1;21924:16;;21953:5;;21750:218;;22052:2;22042:8;22039:16;22033:3;22027:4;22024:13;22020:36;22014:2;22004:8;22001:16;21996:2;21990:4;21987:12;21983:35;21980:77;21977:159;;;-1:-1:-1;22089:19:1;;;22121:5;;21977:159;22168:34;22193:8;22187:4;22168:34;:::i;:::-;22238:6;22234:1;22230:6;22226:19;22217:7;22214:32;22211:58;;;22249:18;;:::i;:::-;22287:20;;21507:806;-1:-1:-1;;;21507:806:1:o;22318:131::-;22378:5;22407:36;22434:8;22428:4;22407:36;:::i;22454:168::-;22527:9;;;22558;;22575:15;;;22569:22;;22555:37;22545:71;;22596:18;;:::i;22627:406::-;22829:2;22811:21;;;22868:2;22848:18;;;22841:30;22907:34;22902:2;22887:18;;22880:62;-1:-1:-1;;;22973:2:1;22958:18;;22951:40;23023:3;23008:19;;22627:406::o;23038:398::-;23240:2;23222:21;;;23279:2;23259:18;;;23252:30;23318:34;23313:2;23298:18;;23291:62;-1:-1:-1;;;23384:2:1;23369:18;;23362:32;23426:3;23411:19;;23038:398::o;23441:217::-;23481:1;23507;23497:132;;23551:10;23546:3;23542:20;23539:1;23532:31;23586:4;23583:1;23576:15;23614:4;23611:1;23604:15;23497:132;-1:-1:-1;23643:9:1;;23441:217::o;23663:410::-;23865:2;23847:21;;;23904:2;23884:18;;;23877:30;23943:34;23938:2;23923:18;;23916:62;-1:-1:-1;;;24009:2:1;23994:18;;23987:44;24063:3;24048:19;;23663:410::o;24078:125::-;24143:9;;;24164:10;;;24161:36;;;24177:18;;:::i;24208:375::-;-1:-1:-1;;;;;24466:15:1;;;24448:34;;24518:15;;;;24513:2;24498:18;;24491:43;24565:2;24550:18;;24543:34;;;;24398:2;24383:18;;24208:375::o;24588:277::-;24655:6;24708:2;24696:9;24687:7;24683:23;24679:32;24676:52;;;24724:1;24721;24714:12;24676:52;24756:9;24750:16;24809:5;24802:13;24795:21;24788:5;24785:32;24775:60;;24831:1;24828;24821:12;26978:290;27155:2;27144:9;27137:21;27118:4;27175:44;27215:2;27204:9;27200:18;27192:6;27175:44;:::i;:::-;27167:52;;27255:6;27250:2;27239:9;27235:18;27228:34;26978:290;;;;;:::o;28088:400::-;28290:2;28272:21;;;28329:2;28309:18;;;28302:30;28368:34;28363:2;28348:18;;28341:62;-1:-1:-1;;;28434:2:1;28419:18;;28412:34;28478:3;28463:19;;28088:400::o;28493:401::-;28695:2;28677:21;;;28734:2;28714:18;;;28707:30;28773:34;28768:2;28753:18;;28746:62;-1:-1:-1;;;28839:2:1;28824:18;;28817:35;28884:3;28869:19;;28493:401::o;29712:343::-;29914:2;29896:21;;;29953:2;29933:18;;;29926:30;-1:-1:-1;;;29987:2:1;29972:18;;29965:49;30046:2;30031:18;;29712:343::o;30060:399::-;30262:2;30244:21;;;30301:2;30281:18;;;30274:30;30340:34;30335:2;30320:18;;30313:62;-1:-1:-1;;;30406:2:1;30391:18;;30384:33;30449:3;30434:19;;30060:399::o;30464:::-;30666:2;30648:21;;;30705:2;30685:18;;;30678:30;30744:34;30739:2;30724:18;;30717:62;-1:-1:-1;;;30810:2:1;30795:18;;30788:33;30853:3;30838:19;;30464:399::o;32949:521::-;33026:4;33032:6;33092:11;33079:25;33186:2;33182:7;33171:8;33155:14;33151:29;33147:43;33127:18;33123:68;33113:96;;33205:1;33202;33195:12;33113:96;33232:33;;33284:20;;;-1:-1:-1;;;;;;33316:30:1;;33313:50;;;33359:1;33356;33349:12;33313:50;33392:4;33380:17;;-1:-1:-1;33423:14:1;33419:27;;;33409:38;;33406:58;;;33460:1;33457;33450:12;33833:1348;33959:3;33953:10;-1:-1:-1;;;;;33978:6:1;33975:30;33972:56;;;34008:18;;:::i;:::-;34037:97;34127:6;34087:38;34119:4;34113:11;34087:38;:::i;34037:97::-;34189:4;;34246:2;34235:14;;34263:1;34258:666;;;;34968:1;34985:6;34982:89;;;-1:-1:-1;35037:19:1;;;35031:26;34982:89;35097:67;35157:6;35150:5;35097:67;:::i;:::-;35091:4;35084:81;;34228:947;;34258:666;11895:1;11888:14;;;11932:4;11919:18;;-1:-1:-1;;34294:20:1;;;34415:236;34429:7;34426:1;34423:14;34415:236;;;34518:19;;;34512:26;34497:42;;34610:27;;;;34578:1;34566:14;;;;34445:19;;34415:236;;;34419:3;34679:6;34670:7;34667:19;34664:201;;;34740:19;;;34734:26;-1:-1:-1;;34823:1:1;34819:14;;;34835:3;34815:24;34811:37;34807:42;34792:58;34777:74;;34664:201;;;34911:1;34902:6;34899:1;34895:14;34891:22;34885:4;34878:36;34228:947;;;;;33833:1348;;:::o;36761:297::-;36934:2;36923:9;36916:21;36897:4;36954:44;36994:2;36983:9;36979:18;36971:6;36954:44;:::i;:::-;36946:52;;37046:4;37038:6;37034:17;37029:2;37018:9;37014:18;37007:45;36761:297;;;;;:::o;38165:183::-;38234:6;38287:2;38275:9;38266:7;38262:23;38258:32;38255:52;;;38303:1;38300;38293:12;38255:52;-1:-1:-1;38326:16:1;;38165:183;-1:-1:-1;38165:183:1:o
Swarm Source
ipfs://9954a34651f671a5f8cb97f58a9a816fd3524d17bf6480ac49fa3933aeffc07c
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.