Overview
Max Total Supply
100,000,000 URQA
Holders
3,353 (0.00%)
Transfers
-
1
Market
Price
$0.00 @ 0.000000 ETH (+5.50%)
Onchain Market Cap
$89,934.00
Circulating Supply Market Cap
$36,529.00
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
| # | Exchange | Pair | Price | 24H Volume | % Volume |
|---|
Contract Name:
URQAToken
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-03-31
*/
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/utils/Context.sol
pragma solidity ^0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The defaut value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overloaded;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
_approve(sender, _msgSender(), currentAllowance - amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
// File: contracts/OwnershipAgreement.sol
pragma solidity >=0.7.0 <0.9.0;
/// @title Creates an Ownership Agreement, with an optional Operator role
/// @author Dr. Jonathan Shahen at UREEQA
/// @notice TODO
/// @dev Maximum number of Owners is set to 255 (unit8.MAX_VALUE)
contract OwnershipAgreement {
/*
* Storage
*/
enum ResolutionType {
None, // This indicates that the resolution hasn't been set (default value)
AddOwner,
RemoveOwner,
ReplaceOwner,
AddOperator,
RemoveOperator,
ReplaceOperator,
UpdateThreshold,
UpdateTransactionLimit,
Pause,
Unpause,
Custom
}
struct Resolution {
// Has the resolution already been passed
bool passed;
// The type of resolution
ResolutionType resType;
// The old address, can be address(0). oldAddress and newAddress cannot both equal address(0).
address oldAddress;
// The new address, can be address(0). oldAddress and newAddress cannot both equal address(0).
address newAddress;
}
using EnumerableSet for EnumerableSet.AddressSet;
// Set of owners
// NOTE: we utilize a set, so we can enumerate the owners and so that the list only contains one instance of an account
// NOTE: address(0) is not a valid owner
EnumerableSet.AddressSet private _owners;
// Value to indicate if the smart contract is paused
bool private _paused;
// An address, usually controlled by a computer, that performs regular/automated operations within the smart contract
// NOTE: address(0) is not a valid operator
EnumerableSet.AddressSet private _operators;
// Limit the number of operators
uint160 public operatorLimit = 1;
// The number of owners it takes to come to an agreement
uint160 public ownerAgreementThreshold = 1;
// Limit per Transaction to impose
// A limit of zero means no limit imposed
uint256 public transactionLimit = 0;
// Stores each vote for each resolution number (int)
mapping(address => mapping(uint256 => bool)) public ownerVotes;
// The next available resolution number
uint256 public nextResolution = 1;
mapping(address => uint256) lastOwnerResolutionNumber;
// Stores the resolutions
mapping(uint256 => Resolution) public resolutions;
// ////////////////////////////////////////////////////
// EVENTS
// ////////////////////////////////////////////////////
event OwnerAddition(address owner);
event OwnerRemoval(address owner);
event OwnerReplacement(address oldOwner, address newOwner);
event OperatorAddition(address newOperator);
event OperatorRemoval(address oldOperator);
event OperatorReplacement(address oldOperator, address newOperator);
event UpdateThreshold(uint160 newThreshold);
event UpdateNumberOfOperators(uint160 newOperators);
event UpdateTransactionLimit(uint256 newLimit);
/// @dev Emitted when the pause is triggered by `account`.
event Paused(address account);
/// @dev Emitted when the pause is lifted by `account`.
event Unpaused(address account);
// ////////////////////////////////////////////////////
// MODIFIERS
// ////////////////////////////////////////////////////
function isValidAddress(address newAddr) public pure {
require(newAddr != address(0), "Invaild Address");
}
modifier onlyOperators() {
isValidAddress(msg.sender);
require(
EnumerableSet.contains(_operators, msg.sender) == true,
"Only the operator can run this function."
);
_;
}
modifier onlyOwners() {
isValidAddress(msg.sender);
require(
EnumerableSet.contains(_owners, msg.sender) == true,
"Only an owner can run this function."
);
_;
}
modifier onlyOwnersOrOperator() {
isValidAddress(msg.sender);
require(
EnumerableSet.contains(_operators, msg.sender) == true ||
EnumerableSet.contains(_owners, msg.sender) == true,
"Only an owner or the operator can run this function."
);
_;
}
modifier ownerExists(address owner) {
require(
EnumerableSet.contains(_owners, owner) == true,
"Owner does not exists."
);
_;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
* Requirements: The contract must not be paused.
*/
modifier whenNotPaused() {
require(!_paused, "Smart Contract is paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
* Requirements: The contract must be paused.
*/
modifier whenPaused() {
require(_paused, "Smart Contract is not paused");
_;
}
/// @dev Modifier to make a function callable only when the amount is within the transaction limit
modifier withinLimit(uint256 amount) {
require(transactionLimit == 0 || amount <= transactionLimit, "Amount is over the transaction limit");
_;
}
// ////////////////////////////////////////////////////
// CONSTRUCTOR
// ////////////////////////////////////////////////////
constructor() {
_addOwner(msg.sender);
_paused = false;
}
// ////////////////////////////////////////////////////
// VIEW FUNCTIONS
// ////////////////////////////////////////////////////
/// @dev Returns list of owners.
/// @return List of owner addresses.
function getOwners() public view returns (address[] memory) {
uint256 len = EnumerableSet.length(_owners);
address[] memory o = new address[](len);
for (uint256 i = 0; i < len; i++) {
o[i] = EnumerableSet.at(_owners, i);
}
return o;
}
/// @dev Returns the number of owners.
/// @return Number of owners.
function getNumberOfOwners() public view returns (uint8) {
return uint8(EnumerableSet.length(_owners));
}
/// @dev Returns list of owners.
/// @return List of owner addresses.
function getOperators() public view returns (address[] memory) {
uint256 len = EnumerableSet.length(_operators);
address[] memory o = new address[](len);
for (uint256 i = 0; i < len; i++) {
o[i] = EnumerableSet.at(_operators, i);
}
return o;
}
/// @dev Returns the number of operators.
/// @return Number of operators.
function getNumberOfOperators() public view returns (uint8) {
return uint8(EnumerableSet.length(_operators));
}
/// @dev How many owners does it take to approve a resolution
/// @return minimum number of owner votes
function getVoteThreshold() public view returns (uint160) {
return ownerAgreementThreshold;
}
/// @dev Returns the maximum amount a transaction can contain
/// @return maximum amount or zero is no limit
function getTransactionLimit() public view returns (uint256) {
return transactionLimit;
}
/// @dev Returns the next available resolution.
/// @return The next available resolution number
function getNextResolutionNumber() public view returns (uint256) {
return nextResolution;
}
/// @dev Returns the next available resolution.
/// @return The next available resolution number
function getLastOwnerResolutionNumber(address owner) public view returns (uint256) {
return lastOwnerResolutionNumber[owner];
}
/// @dev Returns true if the contract is paused, and false otherwise.
function paused() public view returns (bool) {
return _paused;
}
/// @dev Helper function to fail if resolution number is already in use.
function resolutionAlreadyUsed(uint256 resNum) public view {
require(
// atleast one of the address must not be equal to address(0)
!(resolutions[resNum].oldAddress != address(0) ||
resolutions[resNum].newAddress != address(0)),
"Resolution is already in use."
);
}
function isResolutionPassed(uint256 resNum) public view returns (bool) {
return resolutions[resNum].passed;
}
function canResolutionPass(uint256 resNum) public view returns (bool) {
uint256 voteCount = 0;
uint256 len = EnumerableSet.length(_owners);
for (uint256 i = 0; i < len; i++) {
if (ownerVotes[EnumerableSet.at(_owners, i)][resNum] == true) {
voteCount++;
}
}
return voteCount >= ownerAgreementThreshold;
}
// ////////////////////////////////////////////////////
// PUBLIC FUNCTIONS
// ////////////////////////////////////////////////////
/// @notice Vote Yes on a Resolution.
/// @dev The owner who tips the agreement threshold will pay the gas for performing the resolution.
/// @return TRUE if the resolution passed
function voteResolution(uint256 resNum) public onlyOwners() returns (bool) {
ownerVotes[msg.sender][resNum] = true;
// If the reolution has already passed, then do nothing
if (isResolutionPassed(resNum)) {
return true;
}
// If the resolution can now be passed, then do so
if (canResolutionPass(resNum)) {
_performResolution(resNum);
return true;
}
// The resolution cannot be passed yet
return false;
}
/// @dev Create a resolution to add an owner. Performs addition if threshold is 1 or zero.
function createResolutionAddOwner(address newOwner) public onlyOwners() {
isValidAddress(newOwner);
require(!EnumerableSet.contains(_owners, newOwner),"newOwner already exists.");
createResolution(ResolutionType.AddOwner, address(0), newOwner);
}
/// @dev Create a resolution to remove an owner. Performs removal if threshold is 1 or zero.
/// @dev Updates the threshold to keep it less than or equal to the number of new owners
function createResolutionRemoveOwner(address owner) public onlyOwners() {
isValidAddress(owner);
require(getNumberOfOwners() > 1, "Must always be one owner");
require(EnumerableSet.contains(_owners, owner),"owner is not an owner.");
createResolution(ResolutionType.RemoveOwner, owner, address(0));
}
/// @dev Create a resolution to repalce an owner. Performs replacement if threshold is 1 or zero.
function createResolutionReplaceOwner(address oldOwner, address newOwner)
public
onlyOwners()
{
isValidAddress(oldOwner);
isValidAddress(newOwner);
require(EnumerableSet.contains(_owners, oldOwner),"oldOwner is not an owner.");
require(!EnumerableSet.contains(_owners, newOwner),"newOwner already exists.");
createResolution(ResolutionType.ReplaceOwner, oldOwner, newOwner);
}
/// @dev Create a resolution to add an operator. Performs addition if threshold is 1 or zero.
function createResolutionAddOperator(address newOperator) public onlyOwners() {
isValidAddress(newOperator);
require(!EnumerableSet.contains(_operators, newOperator),"newOperator already exists.");
createResolution(ResolutionType.AddOperator, address(0), newOperator);
}
/// @dev Create a resolution to remove the operator. Performs removal if threshold is 1 or zero.
function createResolutionRemoveOperator(address operator) public onlyOwners() {
require(EnumerableSet.contains(_operators, operator),"operator is not an Operator.");
createResolution(ResolutionType.RemoveOperator, operator, address(0));
}
/// @dev Create a resolution to replace the operator account. Performs replacement if threshold is 1 or zero.
function createResolutionReplaceOperator(address oldOperator, address newOperator)
public
onlyOwners()
{
isValidAddress(oldOperator);
isValidAddress(newOperator);
require(EnumerableSet.contains(_operators, oldOperator),"oldOperator is not an Operator.");
require(!EnumerableSet.contains(_operators, newOperator),"newOperator already exists.");
createResolution(ResolutionType.ReplaceOperator, oldOperator, newOperator);
}
/// @dev Create a resolution to update the transaction limit. Performs update if threshold is 1 or zero.
function createResolutionUpdateTransactionLimit(uint160 newLimit)
public
onlyOwners()
{
createResolution(ResolutionType.UpdateTransactionLimit, address(0), address(newLimit));
}
/// @dev Create a resolution to update the owner agreement threshold. Performs update if threshold is 1 or zero.
function createResolutionUpdateThreshold(uint160 threshold)
public
onlyOwners()
{
createResolution(ResolutionType.UpdateThreshold, address(0), address(threshold));
}
/// @dev Pause the contract. Does not require owner agreement.
function pause() public onlyOwners() {
_pause();
}
/// @dev Create a resolution to unpause the contract. Performs update if threshold is 1 or zero.
function createResolutionUnpause() public onlyOwners() {
createResolution(ResolutionType.Unpause, address(1), address(1));
}
// ////////////////////////////////////////////////////
// INTERNAL FUNCTIONS
// ////////////////////////////////////////////////////
/// @dev Create a resolution and check if we can call perofrm the resolution with 1 vote.
function createResolution(ResolutionType resType, address oldAddress, address newAddress) internal {
uint256 resNum = nextResolution;
nextResolution++;
resolutionAlreadyUsed(resNum);
resolutions[resNum].resType = resType;
resolutions[resNum].oldAddress = oldAddress;
resolutions[resNum].newAddress = newAddress;
ownerVotes[msg.sender][resNum] = true;
lastOwnerResolutionNumber[msg.sender] = resNum;
// Check if agreement is already reached
if (ownerAgreementThreshold <= 1) {
_performResolution(resNum);
}
}
/// @dev Performs the resolution and then marks it as passed. No checks prevent it from performing the resolutions.
function _performResolution(uint256 resNum) internal {
if (resolutions[resNum].resType == ResolutionType.AddOwner) {
_addOwner(resolutions[resNum].newAddress);
} else if (resolutions[resNum].resType == ResolutionType.RemoveOwner) {
_removeOwner(resolutions[resNum].oldAddress);
} else if (resolutions[resNum].resType == ResolutionType.ReplaceOwner) {
_replaceOwner(
resolutions[resNum].oldAddress,
resolutions[resNum].newAddress
);
} else if (
resolutions[resNum].resType == ResolutionType.AddOperator
) {
_addOperator(resolutions[resNum].newAddress);
} else if (
resolutions[resNum].resType == ResolutionType.RemoveOperator
) {
_removeOperator(resolutions[resNum].oldAddress);
} else if (
resolutions[resNum].resType == ResolutionType.ReplaceOperator
) {
_replaceOperator(resolutions[resNum].oldAddress,resolutions[resNum].newAddress);
} else if (
resolutions[resNum].resType == ResolutionType.UpdateTransactionLimit
) {
_updateTransactionLimit(uint160(resolutions[resNum].newAddress));
} else if (
resolutions[resNum].resType == ResolutionType.UpdateThreshold
) {
_updateThreshold(uint160(resolutions[resNum].newAddress));
} else if (
resolutions[resNum].resType == ResolutionType.Pause
) {
_pause();
} else if (
resolutions[resNum].resType == ResolutionType.Unpause
) {
_unpause();
}
resolutions[resNum].passed = true;
}
/// @dev
function _addOwner(address owner) internal {
EnumerableSet.add(_owners, owner);
emit OwnerAddition(owner);
}
/// @dev
function _removeOwner(address owner) internal {
EnumerableSet.remove(_owners, owner);
emit OwnerRemoval(owner);
uint8 numOwners = getNumberOfOwners();
if(ownerAgreementThreshold > numOwners) {
_updateThreshold(numOwners);
}
}
/// @dev
function _replaceOwner(address oldOwner, address newOwner) internal {
EnumerableSet.remove(_owners, oldOwner);
EnumerableSet.add(_owners, newOwner);
emit OwnerReplacement(oldOwner, newOwner);
}
/// @dev
function _addOperator(address operator) internal {
EnumerableSet.add(_operators, operator);
emit OperatorAddition(operator);
}
/// @dev
function _removeOperator(address operator) internal {
EnumerableSet.remove(_operators, operator);
emit OperatorRemoval(operator);
}
/// @dev
function _replaceOperator(address oldOperator, address newOperator) internal {
emit OperatorReplacement(oldOperator, newOperator);
EnumerableSet.remove(_operators, oldOperator);
EnumerableSet.add(_operators, newOperator);
}
/// @dev Internal function to update and emit the new transaction limit
function _updateTransactionLimit(uint256 newLimit) internal {
emit UpdateTransactionLimit(newLimit);
transactionLimit = newLimit;
}
/// @dev Internal function to update and emit the new voting threshold
function _updateThreshold(uint160 threshold) internal {
require(threshold <= getNumberOfOwners(), "Unable to set threshold above the number of owners");
emit UpdateThreshold(threshold);
ownerAgreementThreshold = threshold;
}
/// @dev Internal function to update and emit the new voting threshold
function _updateNumberOfOperators(uint160 numOperators) internal {
require(numOperators >= getNumberOfOperators(), "Unable to set number of Operators below the number of operators");
emit UpdateNumberOfOperators(numOperators);
operatorLimit = numOperators;
}
/**
* @dev Triggers stopped state.
*
* Requirements: The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(msg.sender);
}
/**
* @dev Returns to normal state.
*
* Requirements: The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(msg.sender);
}
}
// File: contracts/URQAToken.sol
pragma solidity >=0.7.0 <0.9.0;
/// @title UREEQA's URQA Token
/// @author Dr. Jonathan Shahen at UREEQA
contract URQAToken is OwnershipAgreement, ERC20 {
constructor() ERC20("UREEQA Token", "URQA") {
// Total Supply: 100 million
_mint(msg.sender, 100_000_000e18);
}
/**
* @dev Batch transfer to reduce gas fees. Utilizes SafeMath and self.transfer
*
* Requirements:
*
* - `recipients` cannot contain the zero address.
* - the caller must have a balance of at least SUM `amounts`.
*/
function batchTransfer(address[] memory recipients, uint256[] memory amounts) public returns (bool) {
for(uint256 i=0; i< amounts.length; i++) {
transfer(recipients[i], amounts[i]);
}
return true;
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
super._beforeTokenTransfer(from, to, amount);
require(!paused(), "Cannot complete token transfer while Contract is Paused");
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOperator","type":"address"}],"name":"OperatorRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorReplacement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerReplacement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint160","name":"newOperators","type":"uint160"}],"name":"UpdateNumberOfOperators","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint160","name":"newThreshold","type":"uint160"}],"name":"UpdateThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"UpdateTransactionLimit","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"canResolutionPass","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"createResolutionAddOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"createResolutionAddOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"createResolutionRemoveOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"createResolutionRemoveOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldOperator","type":"address"},{"internalType":"address","name":"newOperator","type":"address"}],"name":"createResolutionReplaceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldOwner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"createResolutionReplaceOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createResolutionUnpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"threshold","type":"uint160"}],"name":"createResolutionUpdateThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"newLimit","type":"uint160"}],"name":"createResolutionUpdateTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getLastOwnerResolutionNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextResolutionNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfOperators","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfOwners","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoteThreshold","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"isResolutionPassed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddr","type":"address"}],"name":"isValidAddress","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextResolution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorLimit","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAgreementThreshold","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerVotes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"resolutionAlreadyUsed","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"resolutions","outputs":[{"internalType":"bool","name":"passed","type":"bool"},{"internalType":"enum OwnershipAgreement.ResolutionType","name":"resType","type":"uint8"},{"internalType":"address","name":"oldAddress","type":"address"},{"internalType":"address","name":"newAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"voteResolution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526005805460016001600160a01b03199182168117909255600680549091168217905560006007556009553480156200003b57600080fd5b506040518060400160405280600c81526020016b2aa922a2a8a0902a37b5b2b760a11b815250604051806040016040528060048152602001635552514160e01b8152506200008f33620000ea60201b60201c565b6002805460ff191690558151620000ae90600f906020850190620002ea565b508051620000c4906010906020840190620002ea565b505050620000e4336a52b7d2dcc80cd2e40000006200013f60201b60201c565b620004a3565b620001026000826200021360201b620010a21760201c565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d8160405162000134919062000390565b60405180910390a150565b6001600160a01b038216620001715760405162461bcd60e51b8152600401620001689062000401565b60405180910390fd5b6200017f6000838362000233565b80600e600082825462000193919062000441565b90915550506001600160a01b0382166000908152600c602052604081208054839290620001c290849062000441565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200020790859062000438565b60405180910390a35050565b60006200022a836001600160a01b0384166200027a565b90505b92915050565b6200024b8383836200027560201b620010be1760201c565b62000255620002c9565b15620002755760405162461bcd60e51b81526004016200016890620003a4565b505050565b6000620002888383620002d2565b620002c0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200022d565b5060006200022d565b60025460ff1690565b60009081526001919091016020526040902054151590565b828054620002f89062000466565b90600052602060002090601f0160209004810192826200031c576000855562000367565b82601f106200033757805160ff191683800117855562000367565b8280016001018555821562000367579182015b82811115620003675782518255916020019190600101906200034a565b506200037592915062000379565b5090565b5b808211156200037557600081556001016200037a565b6001600160a01b0391909116815260200190565b60208082526037908201527f43616e6e6f7420636f6d706c65746520746f6b656e207472616e73666572207760408201527f68696c6520436f6e747261637420697320506175736564000000000000000000606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b600082198211156200046157634e487b7160e01b81526011600452602481fd5b500190565b6002810460018216806200047b57607f821691505b602082108114156200049d57634e487b7160e01b600052602260045260246000fd5b50919050565b61271c80620004b36000396000f3fe608060405234801561001057600080fd5b506004361061025d5760003560e01c80637ad8ed1e11610146578063a9059cbb116100c3578063c3743cff11610087578063c3743cff146104dd578063ccc19752146104e5578063dd62ed3e146104ed578063dee80c0f14610500578063f1376a9814610508578063f19605d61461051b5761025d565b8063a9059cbb14610494578063b85e5b74146104a7578063b8d95d7e146104af578063baa98fbd146104c2578063c0d795de146104ca5761025d565b806390e4ed591161010a57806390e4ed591461044657806395d89b411461044e578063a0e67e2b14610456578063a457c2d71461045e578063a4b7f5ce146104715761025d565b80637ad8ed1e146103fd5780638456cb591461041057806384be5ea91461041857806385a1a60b1461042b57806388d695b2146104335761025d565b806326eb2735116101df5780633a008949116101a35780633a0089491461039f5780635c975abb146103a75780635e7d907f146103af578063654079ba146103c45780636cc8bcff146103d757806370a08231146103ea5761025d565b806326eb27351461033c57806327a099d81461034f5780632e33e1e314610364578063313ce56714610377578063395093511461038c5761025d565b806312c290cb1161022657806312c290cb146102e857806312c44515146102fb57806318160ddd1461030e578063203365661461031657806323b872dd146103295761025d565b80623f07fa14610262578063037af12c14610277578063053a04f1146102a057806306fdde03146102c0578063095ea7b3146102d5575b600080fd5b610275610270366004611da1565b610523565b005b61028a610285366004611da1565b610555565b60405161029791906125bb565b60405180910390f35b6102b36102ae366004611f20565b610574565b6040516102979190611fb3565b6102c8610589565b604051610297919061200a565b6102b36102e3366004611e35565b61061b565b6102756102f6366004611da1565b610639565b610275610309366004611da1565b6106ac565b61028a6106ee565b610275610324366004611dbd565b6106f4565b6102b3610337366004611df5565b61079a565b61027561034a366004611da1565b610831565b6103576108cd565b6040516102979190611f66565b610275610372366004611da1565b610999565b61037f610a0c565b60405161029791906125c4565b6102b361039a366004611e35565b610a11565b61028a610a60565b6102b3610a66565b6103b7610a6f565b6040516102979190611f38565b6102b36103d2366004611e35565b610a7e565b6102756103e5366004611f20565b610a9e565b61028a6103f8366004611da1565b610aff565b61027561040b366004611da1565b610b1a565b610275610b5c565b610275610426366004611dbd565b610b9b565b61037f610c3d565b6102b3610441366004611e60565b610c4e565b6103b7610cd0565b6102c8610cdf565b610357610cee565b6102b361046c366004611e35565b610db3565b61048461047f366004611f20565b610e24565b6040516102979493929190611fbe565b6102b36104a2366004611e35565b610e5f565b61037f610e73565b6102756104bd366004611da1565b610e7f565b610275610ee8565b6102b36104d8366004611f20565b610f2a565b61028a610fbd565b61028a610fc3565b61028a6104fb366004611dbd565b610fc9565b6103b7610ff4565b6102b3610516366004611f20565b611003565b61028a61109c565b6001600160a01b0381166105525760405162461bcd60e51b815260040161054990612482565b60405180910390fd5b50565b6001600160a01b0381166000908152600a60205260409020545b919050565b6000908152600b602052604090205460ff1690565b6060600f80546105989061264f565b80601f01602080910402602001604051908101604052809291908181526020018280546105c49061264f565b80156106115780601f106105e657610100808354040283529160200191610611565b820191906000526020600020905b8154815290600101906020018083116105f457829003601f168201915b5050505050905090565b600061062f6106286110c3565b84846110c7565b5060015b92915050565b61064233610523565b61064d60003361117b565b151560011461066e5760405162461bcd60e51b815260040161054990612407565b61067781610523565b61068260038261117b565b1561069f5760405162461bcd60e51b8152600401610549906122cf565b6105526004600083611190565b6106b533610523565b6106c060003361117b565b15156001146106e15760405162461bcd60e51b815260040161054990612407565b6105526007600083611190565b600e5490565b6106fd33610523565b61070860003361117b565b15156001146107295760405162461bcd60e51b815260040161054990612407565b61073282610523565b61073b81610523565b61074660038361117b565b6107625760405162461bcd60e51b8152600401610549906121ad565b61076d60038261117b565b1561078a5760405162461bcd60e51b8152600401610549906122cf565b61079660068383611190565b5050565b60006107a7848484611285565b6001600160a01b0384166000908152600d60205260408120816107c86110c3565b6001600160a01b03166001600160a01b031681526020019081526020016000205490508281101561080b5760405162461bcd60e51b815260040161054990612336565b610826856108176110c3565b6108218685612638565b6110c7565b506001949350505050565b61083a33610523565b61084560003361117b565b15156001146108665760405162461bcd60e51b815260040161054990612407565b61086f81610523565b6001610879610e73565b60ff16116108995760405162461bcd60e51b815260040161054990612134565b6108a460008261117b565b6108c05760405162461bcd60e51b815260040161054990612306565b6105526002826000611190565b606060006108db60036113ad565b905060008167ffffffffffffffff81111561090657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561092f578160200160208202803683370190505b50905060005b82811015610992576109486003826113b8565b82828151811061096857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528061098a8161268a565b915050610935565b5091505090565b6109a233610523565b6109ad60003361117b565b15156001146109ce5760405162461bcd60e51b815260040161054990612407565b6109d781610523565b6109e260008261117b565b156109ff5760405162461bcd60e51b81526004016105499061222a565b6105526001600083611190565b601290565b600061062f610a1e6110c3565b8484600d6000610a2c6110c3565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546108219190612620565b60095490565b60025460ff1690565b6006546001600160a01b031690565b600860209081526000928352604080842090915290825290205460ff1681565b6000818152600b60205260409020546201000090046001600160a01b0316151580610ae257506000818152600b60205260409020600101546001600160a01b031615155b156105525760405162461bcd60e51b81526004016105499061253f565b6001600160a01b03166000908152600c602052604090205490565b610b2333610523565b610b2e60003361117b565b1515600114610b4f5760405162461bcd60e51b815260040161054990612407565b6105526008600083611190565b610b6533610523565b610b7060003361117b565b1515600114610b915760405162461bcd60e51b815260040161054990612407565b610b996113c4565b565b610ba433610523565b610baf60003361117b565b1515600114610bd05760405162461bcd60e51b815260040161054990612407565b610bd982610523565b610be281610523565b610bed60008361117b565b610c095760405162461bcd60e51b815260040161054990612261565b610c1460008261117b565b15610c315760405162461bcd60e51b81526004016105499061222a565b61079660038383611190565b6000610c4960036113ad565b905090565b6000805b8251811015610cc657610cb3848281518110610c7e57634e487b7160e01b600052603260045260246000fd5b6020026020010151848381518110610ca657634e487b7160e01b600052603260045260246000fd5b6020026020010151610e5f565b5080610cbe8161268a565b915050610c52565b5060019392505050565b6005546001600160a01b031681565b6060601080546105989061264f565b60606000610cfc60006113ad565b905060008167ffffffffffffffff811115610d2757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d50578160200160208202803683370190505b50905060005b8281101561099257610d696000826113b8565b828281518110610d8957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280610dab8161268a565b915050610d56565b600080600d6000610dc26110c3565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610e0e5760405162461bcd60e51b815260040161054990612576565b610cc6610e196110c3565b856108218685612638565b600b602052600090815260409020805460019091015460ff808316926101008104909116916001600160a01b03620100009092048216911684565b600061062f610e6c6110c3565b8484611285565b6000610c4960006113ad565b610e8833610523565b610e9360003361117b565b1515600114610eb45760405162461bcd60e51b815260040161054990612407565b610ebf60038261117b565b610edb5760405162461bcd60e51b8152600401610549906124ab565b6105526005826000611190565b610ef133610523565b610efc60003361117b565b1515600114610f1d5760405162461bcd60e51b815260040161054990612407565b610b99600a600180611190565b60008080610f37816113ad565b905060005b81811015610fa75760086000610f536000846113b8565b6001600160a01b031681526020808201929092526040908101600090812088825290925290205460ff16151560011415610f955782610f918161268a565b9350505b80610f9f8161268a565b915050610f3c565b50506006546001600160a01b0316111592915050565b60075490565b60095481565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b6006546001600160a01b031681565b600061100e33610523565b61101960003361117b565b151560011461103a5760405162461bcd60e51b815260040161054990612407565b3360009081526008602090815260408083208584529091529020805460ff1916600117905561106882610574565b156110755750600161056f565b61107e82610f2a565b156110945761108c8261142e565b50600161056f565b506000919050565b60075481565b60006110b7836001600160a01b038416611820565b9392505050565b505050565b3390565b6001600160a01b0383166110ed5760405162461bcd60e51b8152600401610549906123c3565b6001600160a01b0382166111135760405162461bcd60e51b81526004016105499061216b565b6001600160a01b038084166000818152600d602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061116e9085906125bb565b60405180910390a3505050565b60006110b7836001600160a01b03841661186a565b6009805490819060006111a28361268a565b91905055506111b081610a9e565b6000818152600b602081905260409091208054869261ff0019909116906101009084908111156111f057634e487b7160e01b600052602160045260246000fd5b02179055506000818152600b60209081526040808320805462010000600160b01b031916620100006001600160a01b0389811691909102919091178255600191820180546001600160a01b03191688831617905533808652600885528386208787528552838620805460ff1916841790558552600a9093529220839055600654161161127f5761127f8161142e565b50505050565b6001600160a01b0383166112ab5760405162461bcd60e51b81526004016105499061237e565b6001600160a01b0382166112d15760405162461bcd60e51b81526004016105499061209f565b6112dc838383611882565b6001600160a01b0383166000908152600c6020526040902054818110156113155760405162461bcd60e51b8152600401610549906121e4565b61131f8282612638565b6001600160a01b038086166000908152600c60205260408082209390935590851681529081208054849290611355908490612620565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161139f91906125bb565b60405180910390a350505050565b6000610633826118b2565b60006110b783836118b6565b60025460ff16156113e75760405162461bcd60e51b81526004016105499061244b565b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890611424903390611f38565b60405180910390a1565b60016000828152600b6020819052604090912054610100900460ff169081111561146857634e487b7160e01b600052602160045260246000fd5b1415611497576000818152600b6020526040902060010154611492906001600160a01b031661190f565b611805565b60026000828152600b6020819052604090912054610100900460ff16908111156114d157634e487b7160e01b600052602160045260246000fd5b14156114fe576000818152600b6020526040902054611492906201000090046001600160a01b0316611955565b60036000828152600b6020819052604090912054610100900460ff169081111561153857634e487b7160e01b600052602160045260246000fd5b1415611570576000818152600b602052604090208054600190910154611492916001600160a01b0362010000909104811691166119c9565b60046000828152600b6020819052604090912054610100900460ff16908111156115aa57634e487b7160e01b600052602160045260246000fd5b14156115d4576000818152600b6020526040902060010154611492906001600160a01b0316611a1e565b60056000828152600b6020819052604090912054610100900460ff169081111561160e57634e487b7160e01b600052602160045260246000fd5b141561163b576000818152600b6020526040902054611492906201000090046001600160a01b0316611a59565b60066000828152600b6020819052604090912054610100900460ff169081111561167557634e487b7160e01b600052602160045260246000fd5b14156116ad576000818152600b602052604090208054600190910154611492916001600160a01b036201000090910481169116611a94565b60086000828152600b6020819052604090912054610100900460ff16908111156116e757634e487b7160e01b600052602160045260246000fd5b1415611711576000818152600b6020526040902060010154611492906001600160a01b0316611ae4565b60076000828152600b6020819052604090912054610100900460ff169081111561174b57634e487b7160e01b600052602160045260246000fd5b1415611775576000818152600b6020526040902060010154611492906001600160a01b0316611b20565b60096000828152600b6020819052604090912054610100900460ff16908111156117af57634e487b7160e01b600052602160045260246000fd5b14156117bd576114926113c4565b600a6000828152600b6020819052604090912054610100900460ff16908111156117f757634e487b7160e01b600052602160045260246000fd5b141561180557611805611bac565b6000908152600b60205260409020805460ff19166001179055565b600061182c838361186a565b61186257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610633565b506000610633565b60009081526001919091016020526040902054151590565b61188d8383836110be565b611895610a66565b156110be5760405162461bcd60e51b8152600401610549906124e2565b5490565b815460009082106118d95760405162461bcd60e51b81526004016105499061205d565b8260000182815481106118fc57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b61191a6000826110a2565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d8160405161194a9190611f38565b60405180910390a150565b611960600082611c08565b507f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90816040516119909190611f38565b60405180910390a160006119a2610e73565b60065490915060ff82166001600160a01b039091161115610796576107968160ff16611b20565b6119d4600083611c08565b506119e06000826110a2565b507f1b82188083c6040dda91df3d142280a20fa00e5a433eb921fdbf2e4ad1db45e58282604051611a12929190611f4c565b60405180910390a15050565b611a296003826110a2565b507fe96a56aa17dd8ae64ac3a51347e8e8a03d52f1cb2acdf8ed49b20d55662ebecc8160405161194a9190611f38565b611a64600382611c08565b507f108286147377add4f5f7bcdd7b6104dc6bdac3443e499142a612d418aa0be1548160405161194a9190611f38565b7f409833df5b08419a3bd86d34683f91767845e813a29d30d8a4338fba95158d8a8282604051611ac5929190611f4c565b60405180910390a1611ad8600383611c08565b506110be6003826110a2565b7f5ba74490711ccc5e81b24b40b8c5d2bd282981e4bc080dd8789bb10c1dfc2ea981604051611b1391906125bb565b60405180910390a1600755565b611b28610e73565b60ff16816001600160a01b03161115611b535760405162461bcd60e51b8152600401610549906120e2565b7f52ca658c4a059b2955bf70b065638aaa67f124556851d788a113d7c213f9ac9881604051611b829190611f38565b60405180910390a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b60025460ff16611bce5760405162461bcd60e51b815260040161054990612298565b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90611424903390611f38565b60006110b7836001600160a01b03841660008181526001830160205260408120548015611d2b576000611c3c600183612638565b8554909150600090611c5090600190612638565b90506000866000018281548110611c7757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611ca857634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611cbf836001612620565b60008281526001890160205260409020558654879080611cef57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610633565b6000915050610633565b600082601f830112611d45578081fd5b81356020611d5a611d55836125fc565b6125d2565b8281528181019085830183850287018401881015611d76578586fd5b855b85811015611d9457813584529284019290840190600101611d78565b5090979650505050505050565b600060208284031215611db2578081fd5b81356110b7816126d1565b60008060408385031215611dcf578081fd5b8235611dda816126d1565b91506020830135611dea816126d1565b809150509250929050565b600080600060608486031215611e09578081fd5b8335611e14816126d1565b92506020840135611e24816126d1565b929592945050506040919091013590565b60008060408385031215611e47578182fd5b8235611e52816126d1565b946020939093013593505050565b60008060408385031215611e72578182fd5b823567ffffffffffffffff80821115611e89578384fd5b818501915085601f830112611e9c578384fd5b81356020611eac611d55836125fc565b82815281810190858301838502870184018b1015611ec8578889fd5b8896505b84871015611ef3578035611edf816126d1565b835260019690960195918301918301611ecc565b5096505086013592505080821115611f09578283fd5b50611f1685828601611d35565b9150509250929050565b600060208284031215611f31578081fd5b5035919050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611fa75783516001600160a01b031683529284019291840191600101611f82565b50909695505050505050565b901515815260200190565b841515815260808101600c8510611fe557634e487b7160e01b600052602160045260246000fd5b60208201949094526001600160a01b0392831660408201529116606090910152919050565b6000602080835283518082850152825b818110156120365785810183015185820160400152820161201a565b818111156120475783604083870101525b50601f01601f1916929092016040019392505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526032908201527f556e61626c6520746f20736574207468726573686f6c642061626f766520746860408201527165206e756d626572206f66206f776e65727360701b606082015260800190565b60208082526018908201527f4d75737420616c77617973206265206f6e65206f776e65720000000000000000604082015260600190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601f908201527f6f6c644f70657261746f72206973206e6f7420616e204f70657261746f722e00604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526018908201527f6e65774f776e657220616c7265616479206578697374732e0000000000000000604082015260600190565b60208082526019908201527f6f6c644f776e6572206973206e6f7420616e206f776e65722e00000000000000604082015260600190565b6020808252601c908201527f536d61727420436f6e7472616374206973206e6f742070617573656400000000604082015260600190565b6020808252601b908201527f6e65774f70657261746f7220616c7265616479206578697374732e0000000000604082015260600190565b60208082526016908201527537bbb732b91034b9903737ba1030b71037bbb732b91760511b604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526024908201527f4f6e6c7920616e206f776e65722063616e2072756e20746869732066756e637460408201526334b7b71760e11b606082015260800190565b60208082526018908201527f536d61727420436f6e7472616374206973207061757365640000000000000000604082015260600190565b6020808252600f908201526e496e7661696c64204164647265737360881b604082015260600190565b6020808252601c908201527f6f70657261746f72206973206e6f7420616e204f70657261746f722e00000000604082015260600190565b60208082526037908201527f43616e6e6f7420636f6d706c65746520746f6b656e207472616e73666572207760408201527f68696c6520436f6e747261637420697320506175736564000000000000000000606082015260800190565b6020808252601d908201527f5265736f6c7574696f6e20697320616c726561647920696e207573652e000000604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156125f4576125f46126bb565b604052919050565b600067ffffffffffffffff821115612616576126166126bb565b5060209081020190565b60008219821115612633576126336126a5565b500190565b60008282101561264a5761264a6126a5565b500390565b60028104600182168061266357607f821691505b6020821081141561268457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561269e5761269e6126a5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461055257600080fdfea264697066735822122020f35fd5fde27c8601d5cc74fdfb18d78ca5df70c12ae5217331d9dad11207bf64736f6c63430008000033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025d5760003560e01c80637ad8ed1e11610146578063a9059cbb116100c3578063c3743cff11610087578063c3743cff146104dd578063ccc19752146104e5578063dd62ed3e146104ed578063dee80c0f14610500578063f1376a9814610508578063f19605d61461051b5761025d565b8063a9059cbb14610494578063b85e5b74146104a7578063b8d95d7e146104af578063baa98fbd146104c2578063c0d795de146104ca5761025d565b806390e4ed591161010a57806390e4ed591461044657806395d89b411461044e578063a0e67e2b14610456578063a457c2d71461045e578063a4b7f5ce146104715761025d565b80637ad8ed1e146103fd5780638456cb591461041057806384be5ea91461041857806385a1a60b1461042b57806388d695b2146104335761025d565b806326eb2735116101df5780633a008949116101a35780633a0089491461039f5780635c975abb146103a75780635e7d907f146103af578063654079ba146103c45780636cc8bcff146103d757806370a08231146103ea5761025d565b806326eb27351461033c57806327a099d81461034f5780632e33e1e314610364578063313ce56714610377578063395093511461038c5761025d565b806312c290cb1161022657806312c290cb146102e857806312c44515146102fb57806318160ddd1461030e578063203365661461031657806323b872dd146103295761025d565b80623f07fa14610262578063037af12c14610277578063053a04f1146102a057806306fdde03146102c0578063095ea7b3146102d5575b600080fd5b610275610270366004611da1565b610523565b005b61028a610285366004611da1565b610555565b60405161029791906125bb565b60405180910390f35b6102b36102ae366004611f20565b610574565b6040516102979190611fb3565b6102c8610589565b604051610297919061200a565b6102b36102e3366004611e35565b61061b565b6102756102f6366004611da1565b610639565b610275610309366004611da1565b6106ac565b61028a6106ee565b610275610324366004611dbd565b6106f4565b6102b3610337366004611df5565b61079a565b61027561034a366004611da1565b610831565b6103576108cd565b6040516102979190611f66565b610275610372366004611da1565b610999565b61037f610a0c565b60405161029791906125c4565b6102b361039a366004611e35565b610a11565b61028a610a60565b6102b3610a66565b6103b7610a6f565b6040516102979190611f38565b6102b36103d2366004611e35565b610a7e565b6102756103e5366004611f20565b610a9e565b61028a6103f8366004611da1565b610aff565b61027561040b366004611da1565b610b1a565b610275610b5c565b610275610426366004611dbd565b610b9b565b61037f610c3d565b6102b3610441366004611e60565b610c4e565b6103b7610cd0565b6102c8610cdf565b610357610cee565b6102b361046c366004611e35565b610db3565b61048461047f366004611f20565b610e24565b6040516102979493929190611fbe565b6102b36104a2366004611e35565b610e5f565b61037f610e73565b6102756104bd366004611da1565b610e7f565b610275610ee8565b6102b36104d8366004611f20565b610f2a565b61028a610fbd565b61028a610fc3565b61028a6104fb366004611dbd565b610fc9565b6103b7610ff4565b6102b3610516366004611f20565b611003565b61028a61109c565b6001600160a01b0381166105525760405162461bcd60e51b815260040161054990612482565b60405180910390fd5b50565b6001600160a01b0381166000908152600a60205260409020545b919050565b6000908152600b602052604090205460ff1690565b6060600f80546105989061264f565b80601f01602080910402602001604051908101604052809291908181526020018280546105c49061264f565b80156106115780601f106105e657610100808354040283529160200191610611565b820191906000526020600020905b8154815290600101906020018083116105f457829003601f168201915b5050505050905090565b600061062f6106286110c3565b84846110c7565b5060015b92915050565b61064233610523565b61064d60003361117b565b151560011461066e5760405162461bcd60e51b815260040161054990612407565b61067781610523565b61068260038261117b565b1561069f5760405162461bcd60e51b8152600401610549906122cf565b6105526004600083611190565b6106b533610523565b6106c060003361117b565b15156001146106e15760405162461bcd60e51b815260040161054990612407565b6105526007600083611190565b600e5490565b6106fd33610523565b61070860003361117b565b15156001146107295760405162461bcd60e51b815260040161054990612407565b61073282610523565b61073b81610523565b61074660038361117b565b6107625760405162461bcd60e51b8152600401610549906121ad565b61076d60038261117b565b1561078a5760405162461bcd60e51b8152600401610549906122cf565b61079660068383611190565b5050565b60006107a7848484611285565b6001600160a01b0384166000908152600d60205260408120816107c86110c3565b6001600160a01b03166001600160a01b031681526020019081526020016000205490508281101561080b5760405162461bcd60e51b815260040161054990612336565b610826856108176110c3565b6108218685612638565b6110c7565b506001949350505050565b61083a33610523565b61084560003361117b565b15156001146108665760405162461bcd60e51b815260040161054990612407565b61086f81610523565b6001610879610e73565b60ff16116108995760405162461bcd60e51b815260040161054990612134565b6108a460008261117b565b6108c05760405162461bcd60e51b815260040161054990612306565b6105526002826000611190565b606060006108db60036113ad565b905060008167ffffffffffffffff81111561090657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561092f578160200160208202803683370190505b50905060005b82811015610992576109486003826113b8565b82828151811061096857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528061098a8161268a565b915050610935565b5091505090565b6109a233610523565b6109ad60003361117b565b15156001146109ce5760405162461bcd60e51b815260040161054990612407565b6109d781610523565b6109e260008261117b565b156109ff5760405162461bcd60e51b81526004016105499061222a565b6105526001600083611190565b601290565b600061062f610a1e6110c3565b8484600d6000610a2c6110c3565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546108219190612620565b60095490565b60025460ff1690565b6006546001600160a01b031690565b600860209081526000928352604080842090915290825290205460ff1681565b6000818152600b60205260409020546201000090046001600160a01b0316151580610ae257506000818152600b60205260409020600101546001600160a01b031615155b156105525760405162461bcd60e51b81526004016105499061253f565b6001600160a01b03166000908152600c602052604090205490565b610b2333610523565b610b2e60003361117b565b1515600114610b4f5760405162461bcd60e51b815260040161054990612407565b6105526008600083611190565b610b6533610523565b610b7060003361117b565b1515600114610b915760405162461bcd60e51b815260040161054990612407565b610b996113c4565b565b610ba433610523565b610baf60003361117b565b1515600114610bd05760405162461bcd60e51b815260040161054990612407565b610bd982610523565b610be281610523565b610bed60008361117b565b610c095760405162461bcd60e51b815260040161054990612261565b610c1460008261117b565b15610c315760405162461bcd60e51b81526004016105499061222a565b61079660038383611190565b6000610c4960036113ad565b905090565b6000805b8251811015610cc657610cb3848281518110610c7e57634e487b7160e01b600052603260045260246000fd5b6020026020010151848381518110610ca657634e487b7160e01b600052603260045260246000fd5b6020026020010151610e5f565b5080610cbe8161268a565b915050610c52565b5060019392505050565b6005546001600160a01b031681565b6060601080546105989061264f565b60606000610cfc60006113ad565b905060008167ffffffffffffffff811115610d2757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d50578160200160208202803683370190505b50905060005b8281101561099257610d696000826113b8565b828281518110610d8957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280610dab8161268a565b915050610d56565b600080600d6000610dc26110c3565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610e0e5760405162461bcd60e51b815260040161054990612576565b610cc6610e196110c3565b856108218685612638565b600b602052600090815260409020805460019091015460ff808316926101008104909116916001600160a01b03620100009092048216911684565b600061062f610e6c6110c3565b8484611285565b6000610c4960006113ad565b610e8833610523565b610e9360003361117b565b1515600114610eb45760405162461bcd60e51b815260040161054990612407565b610ebf60038261117b565b610edb5760405162461bcd60e51b8152600401610549906124ab565b6105526005826000611190565b610ef133610523565b610efc60003361117b565b1515600114610f1d5760405162461bcd60e51b815260040161054990612407565b610b99600a600180611190565b60008080610f37816113ad565b905060005b81811015610fa75760086000610f536000846113b8565b6001600160a01b031681526020808201929092526040908101600090812088825290925290205460ff16151560011415610f955782610f918161268a565b9350505b80610f9f8161268a565b915050610f3c565b50506006546001600160a01b0316111592915050565b60075490565b60095481565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b6006546001600160a01b031681565b600061100e33610523565b61101960003361117b565b151560011461103a5760405162461bcd60e51b815260040161054990612407565b3360009081526008602090815260408083208584529091529020805460ff1916600117905561106882610574565b156110755750600161056f565b61107e82610f2a565b156110945761108c8261142e565b50600161056f565b506000919050565b60075481565b60006110b7836001600160a01b038416611820565b9392505050565b505050565b3390565b6001600160a01b0383166110ed5760405162461bcd60e51b8152600401610549906123c3565b6001600160a01b0382166111135760405162461bcd60e51b81526004016105499061216b565b6001600160a01b038084166000818152600d602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061116e9085906125bb565b60405180910390a3505050565b60006110b7836001600160a01b03841661186a565b6009805490819060006111a28361268a565b91905055506111b081610a9e565b6000818152600b602081905260409091208054869261ff0019909116906101009084908111156111f057634e487b7160e01b600052602160045260246000fd5b02179055506000818152600b60209081526040808320805462010000600160b01b031916620100006001600160a01b0389811691909102919091178255600191820180546001600160a01b03191688831617905533808652600885528386208787528552838620805460ff1916841790558552600a9093529220839055600654161161127f5761127f8161142e565b50505050565b6001600160a01b0383166112ab5760405162461bcd60e51b81526004016105499061237e565b6001600160a01b0382166112d15760405162461bcd60e51b81526004016105499061209f565b6112dc838383611882565b6001600160a01b0383166000908152600c6020526040902054818110156113155760405162461bcd60e51b8152600401610549906121e4565b61131f8282612638565b6001600160a01b038086166000908152600c60205260408082209390935590851681529081208054849290611355908490612620565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161139f91906125bb565b60405180910390a350505050565b6000610633826118b2565b60006110b783836118b6565b60025460ff16156113e75760405162461bcd60e51b81526004016105499061244b565b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890611424903390611f38565b60405180910390a1565b60016000828152600b6020819052604090912054610100900460ff169081111561146857634e487b7160e01b600052602160045260246000fd5b1415611497576000818152600b6020526040902060010154611492906001600160a01b031661190f565b611805565b60026000828152600b6020819052604090912054610100900460ff16908111156114d157634e487b7160e01b600052602160045260246000fd5b14156114fe576000818152600b6020526040902054611492906201000090046001600160a01b0316611955565b60036000828152600b6020819052604090912054610100900460ff169081111561153857634e487b7160e01b600052602160045260246000fd5b1415611570576000818152600b602052604090208054600190910154611492916001600160a01b0362010000909104811691166119c9565b60046000828152600b6020819052604090912054610100900460ff16908111156115aa57634e487b7160e01b600052602160045260246000fd5b14156115d4576000818152600b6020526040902060010154611492906001600160a01b0316611a1e565b60056000828152600b6020819052604090912054610100900460ff169081111561160e57634e487b7160e01b600052602160045260246000fd5b141561163b576000818152600b6020526040902054611492906201000090046001600160a01b0316611a59565b60066000828152600b6020819052604090912054610100900460ff169081111561167557634e487b7160e01b600052602160045260246000fd5b14156116ad576000818152600b602052604090208054600190910154611492916001600160a01b036201000090910481169116611a94565b60086000828152600b6020819052604090912054610100900460ff16908111156116e757634e487b7160e01b600052602160045260246000fd5b1415611711576000818152600b6020526040902060010154611492906001600160a01b0316611ae4565b60076000828152600b6020819052604090912054610100900460ff169081111561174b57634e487b7160e01b600052602160045260246000fd5b1415611775576000818152600b6020526040902060010154611492906001600160a01b0316611b20565b60096000828152600b6020819052604090912054610100900460ff16908111156117af57634e487b7160e01b600052602160045260246000fd5b14156117bd576114926113c4565b600a6000828152600b6020819052604090912054610100900460ff16908111156117f757634e487b7160e01b600052602160045260246000fd5b141561180557611805611bac565b6000908152600b60205260409020805460ff19166001179055565b600061182c838361186a565b61186257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610633565b506000610633565b60009081526001919091016020526040902054151590565b61188d8383836110be565b611895610a66565b156110be5760405162461bcd60e51b8152600401610549906124e2565b5490565b815460009082106118d95760405162461bcd60e51b81526004016105499061205d565b8260000182815481106118fc57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b61191a6000826110a2565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d8160405161194a9190611f38565b60405180910390a150565b611960600082611c08565b507f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90816040516119909190611f38565b60405180910390a160006119a2610e73565b60065490915060ff82166001600160a01b039091161115610796576107968160ff16611b20565b6119d4600083611c08565b506119e06000826110a2565b507f1b82188083c6040dda91df3d142280a20fa00e5a433eb921fdbf2e4ad1db45e58282604051611a12929190611f4c565b60405180910390a15050565b611a296003826110a2565b507fe96a56aa17dd8ae64ac3a51347e8e8a03d52f1cb2acdf8ed49b20d55662ebecc8160405161194a9190611f38565b611a64600382611c08565b507f108286147377add4f5f7bcdd7b6104dc6bdac3443e499142a612d418aa0be1548160405161194a9190611f38565b7f409833df5b08419a3bd86d34683f91767845e813a29d30d8a4338fba95158d8a8282604051611ac5929190611f4c565b60405180910390a1611ad8600383611c08565b506110be6003826110a2565b7f5ba74490711ccc5e81b24b40b8c5d2bd282981e4bc080dd8789bb10c1dfc2ea981604051611b1391906125bb565b60405180910390a1600755565b611b28610e73565b60ff16816001600160a01b03161115611b535760405162461bcd60e51b8152600401610549906120e2565b7f52ca658c4a059b2955bf70b065638aaa67f124556851d788a113d7c213f9ac9881604051611b829190611f38565b60405180910390a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b60025460ff16611bce5760405162461bcd60e51b815260040161054990612298565b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90611424903390611f38565b60006110b7836001600160a01b03841660008181526001830160205260408120548015611d2b576000611c3c600183612638565b8554909150600090611c5090600190612638565b90506000866000018281548110611c7757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611ca857634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611cbf836001612620565b60008281526001890160205260409020558654879080611cef57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610633565b6000915050610633565b600082601f830112611d45578081fd5b81356020611d5a611d55836125fc565b6125d2565b8281528181019085830183850287018401881015611d76578586fd5b855b85811015611d9457813584529284019290840190600101611d78565b5090979650505050505050565b600060208284031215611db2578081fd5b81356110b7816126d1565b60008060408385031215611dcf578081fd5b8235611dda816126d1565b91506020830135611dea816126d1565b809150509250929050565b600080600060608486031215611e09578081fd5b8335611e14816126d1565b92506020840135611e24816126d1565b929592945050506040919091013590565b60008060408385031215611e47578182fd5b8235611e52816126d1565b946020939093013593505050565b60008060408385031215611e72578182fd5b823567ffffffffffffffff80821115611e89578384fd5b818501915085601f830112611e9c578384fd5b81356020611eac611d55836125fc565b82815281810190858301838502870184018b1015611ec8578889fd5b8896505b84871015611ef3578035611edf816126d1565b835260019690960195918301918301611ecc565b5096505086013592505080821115611f09578283fd5b50611f1685828601611d35565b9150509250929050565b600060208284031215611f31578081fd5b5035919050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611fa75783516001600160a01b031683529284019291840191600101611f82565b50909695505050505050565b901515815260200190565b841515815260808101600c8510611fe557634e487b7160e01b600052602160045260246000fd5b60208201949094526001600160a01b0392831660408201529116606090910152919050565b6000602080835283518082850152825b818110156120365785810183015185820160400152820161201a565b818111156120475783604083870101525b50601f01601f1916929092016040019392505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526032908201527f556e61626c6520746f20736574207468726573686f6c642061626f766520746860408201527165206e756d626572206f66206f776e65727360701b606082015260800190565b60208082526018908201527f4d75737420616c77617973206265206f6e65206f776e65720000000000000000604082015260600190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601f908201527f6f6c644f70657261746f72206973206e6f7420616e204f70657261746f722e00604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526018908201527f6e65774f776e657220616c7265616479206578697374732e0000000000000000604082015260600190565b60208082526019908201527f6f6c644f776e6572206973206e6f7420616e206f776e65722e00000000000000604082015260600190565b6020808252601c908201527f536d61727420436f6e7472616374206973206e6f742070617573656400000000604082015260600190565b6020808252601b908201527f6e65774f70657261746f7220616c7265616479206578697374732e0000000000604082015260600190565b60208082526016908201527537bbb732b91034b9903737ba1030b71037bbb732b91760511b604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526024908201527f4f6e6c7920616e206f776e65722063616e2072756e20746869732066756e637460408201526334b7b71760e11b606082015260800190565b60208082526018908201527f536d61727420436f6e7472616374206973207061757365640000000000000000604082015260600190565b6020808252600f908201526e496e7661696c64204164647265737360881b604082015260600190565b6020808252601c908201527f6f70657261746f72206973206e6f7420616e204f70657261746f722e00000000604082015260600190565b60208082526037908201527f43616e6e6f7420636f6d706c65746520746f6b656e207472616e73666572207760408201527f68696c6520436f6e747261637420697320506175736564000000000000000000606082015260800190565b6020808252601d908201527f5265736f6c7574696f6e20697320616c726561647920696e207573652e000000604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156125f4576125f46126bb565b604052919050565b600067ffffffffffffffff821115612616576126166126bb565b5060209081020190565b60008219821115612633576126336126a5565b500190565b60008282101561264a5761264a6126a5565b500390565b60028104600182168061266357607f821691505b6020821081141561268457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561269e5761269e6126a5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461055257600080fdfea264697066735822122020f35fd5fde27c8601d5cc74fdfb18d78ca5df70c12ae5217331d9dad11207bf64736f6c63430008000033
Deployed Bytecode Sourcemap
43792:968:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27669:121;;;;;;:::i;:::-;;:::i;:::-;;31988:141;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32728:123;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5814:91::-;;;:::i;:::-;;;;;;;:::i;7954:169::-;;;;;;:::i;:::-;;:::i;35739:304::-;;;;;;:::i;:::-;;:::i;37491:202::-;;;;;;:::i;:::-;;:::i;6907:108::-;;;:::i;36537:496::-;;;;;;:::i;:::-;;:::i;8605:422::-;;;;;;:::i;:::-;;:::i;34728:342::-;;;;;;:::i;:::-;;:::i;30666:310::-;;;:::i;:::-;;;;;;;:::i;34248:280::-;;;;;;:::i;:::-;;:::i;6758:84::-;;;:::i;:::-;;;;;;;:::i;9436:215::-;;;;;;:::i;:::-;;:::i;31768:105::-;;;:::i;32212:78::-;;;:::i;31316:107::-;;;:::i;:::-;;;;;;;:::i;26404:62::-;;;;;;:::i;:::-;;:::i;32376:344::-;;;;;;:::i;:::-;;:::i;7078:127::-;;;;;;:::i;:::-;;:::i;37151:214::-;;;;;;:::i;:::-;;:::i;37769:64::-;;;:::i;35181:451::-;;;;;;:::i;:::-;;:::i;31069:125::-;;;:::i;44255:243::-;;;;;;:::i;:::-;;:::i;26067:32::-;;;:::i;6024:95::-;;;:::i;30071:301::-;;;:::i;10154:377::-;;;;;;:::i;:::-;;:::i;26649:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;7418:175::-;;;;;;:::i;:::-;;:::i;30459:119::-;;;:::i;36153:261::-;;;;;;:::i;:::-;;:::i;37943:138::-;;;:::i;32859:400::-;;;;;;:::i;:::-;;:::i;31550:103::-;;;:::i;26518:33::-;;;:::i;7656:151::-;;;;;;:::i;:::-;;:::i;26168:42::-;;;:::i;33611:533::-;;;;;;:::i;:::-;;:::i;26304:35::-;;;:::i;27669:121::-;-1:-1:-1;;;;;27741:21:0;;27733:49;;;;-1:-1:-1;;;27733:49:0;;;;;;;:::i;:::-;;;;;;;;;27669:121;:::o;31988:141::-;-1:-1:-1;;;;;32089:32:0;;32062:7;32089:32;;;:25;:32;;;;;;31988:141;;;;:::o;32728:123::-;32793:4;32817:19;;;:11;:19;;;;;:26;;;;32728:123::o;5814:91::-;5859:13;5892:5;5885:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5814:91;:::o;7954:169::-;8037:4;8054:39;8063:12;:10;:12::i;:::-;8077:7;8086:6;8054:8;:39::i;:::-;-1:-1:-1;8111:4:0;7954:169;;;;;:::o;35739:304::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;35828:27:::1;35843:11;35828:14;:27::i;:::-;35875:47;35898:10;35910:11;35875:22;:47::i;:::-;35874:48;35866:87;;;;-1:-1:-1::0;;;35866:87:0::1;;;;;;;:::i;:::-;35966:69;35983:26;36019:1;36023:11;35966:16;:69::i;37491:202::-:0;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;37605:80:::1;37622:30;37662:1;37674:9;37605:16;:80::i;6907:108::-:0;6995:12;;6907:108;:::o;36537:496::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;36674:27:::1;36689:11;36674:14;:27::i;:::-;36712;36727:11;36712:14;:27::i;:::-;36758:47;36781:10;36793:11;36758:22;:47::i;:::-;36750:90;;;;-1:-1:-1::0;;;36750:90:0::1;;;;;;;:::i;:::-;36860:47;36883:10;36895:11;36860:22;:47::i;:::-;36859:48;36851:87;;;;-1:-1:-1::0;;;36851:87:0::1;;;;;;;:::i;:::-;36951:74;36968:30;37000:11;37013;36951:16;:74::i;:::-;36537:496:::0;;:::o;8605:422::-;8711:4;8728:36;8738:6;8746:9;8757:6;8728:9;:36::i;:::-;-1:-1:-1;;;;;8804:19:0;;8777:24;8804:19;;;:11;:19;;;;;8777:24;8824:12;:10;:12::i;:::-;-1:-1:-1;;;;;8804:33:0;-1:-1:-1;;;;;8804:33:0;;;;;;;;;;;;;8777:60;;8876:6;8856:16;:26;;8848:79;;;;-1:-1:-1;;;8848:79:0;;;;;;;:::i;:::-;8938:57;8947:6;8955:12;:10;:12::i;:::-;8969:25;8988:6;8969:16;:25;:::i;:::-;8938:8;:57::i;:::-;-1:-1:-1;9015:4:0;;8605:422;-1:-1:-1;;;;8605:422:0:o;34728:342::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;34811:21:::1;34826:5;34811:14;:21::i;:::-;34873:1;34851:19;:17;:19::i;:::-;:23;;;34843:60;;;;-1:-1:-1::0;;;34843:60:0::1;;;;;;;:::i;:::-;34922:38;34945:7;34954:5;34922:22;:38::i;:::-;34914:72;;;;-1:-1:-1::0;;;34914:72:0::1;;;;;;;:::i;:::-;34999:63;35016:26;35044:5;35059:1;34999:16;:63::i;30666:310::-:0;30711:16;30740:11;30754:32;30775:10;30754:20;:32::i;:::-;30740:46;;30797:18;30832:3;30818:18;;;;;;-1:-1:-1;;;30818:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30818:18:0;;30797:39;;30854:9;30849:99;30873:3;30869:1;:7;30849:99;;;30905:31;30922:10;30934:1;30905:16;:31::i;:::-;30898:1;30900;30898:4;;;;;;-1:-1:-1;;;30898:4:0;;;;;;;;;-1:-1:-1;;;;;30898:38:0;;;:4;;;;;;;;;;;:38;30878:3;;;;:::i;:::-;;;;30849:99;;;-1:-1:-1;30967:1:0;-1:-1:-1;;30666:310:0;:::o;34248:280::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;34331:24:::1;34346:8;34331:14;:24::i;:::-;34375:41;34398:7;34407:8;34375:22;:41::i;:::-;34374:42;34366:78;;;;-1:-1:-1::0;;;34366:78:0::1;;;;;;;:::i;:::-;34457:63;34474:23;34507:1;34511:8;34457:16;:63::i;6758:84::-:0;6832:2;6758:84;:::o;9436:215::-;9524:4;9541:80;9550:12;:10;:12::i;:::-;9564:7;9610:10;9573:11;:25;9585:12;:10;:12::i;:::-;-1:-1:-1;;;;;9573:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;9573:25:0;;;:34;;;;;;;;;;:47;;;;:::i;31768:105::-;31851:14;;31768:105;:::o;32212:78::-;32275:7;;;;32212:78;:::o;31316:107::-;31392:23;;-1:-1:-1;;;;;31392:23:0;31316:107;:::o;26404:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32376:344::-;32587:1;32545:19;;;:11;:19;;;;;:30;;;;-1:-1:-1;;;;;32545:30:0;:44;;;:109;;-1:-1:-1;32652:1:0;32610:19;;;:11;:19;;;;;:30;;;-1:-1:-1;;;;;32610:30:0;:44;;32545:109;32543:112;32446:266;;;;-1:-1:-1;;;32446:266:0;;;;;;;:::i;7078:127::-;-1:-1:-1;;;;;7179:18:0;7152:7;7179:18;;;:9;:18;;;;;;;7078:127::o;37151:214::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;37271:86:::1;37288:37;37335:1;37347:8;37271:16;:86::i;37769:64::-:0;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;37817:8:::1;:6;:8::i;:::-;37769:64::o:0;35181:451::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;35309:24:::1;35324:8;35309:14;:24::i;:::-;35344;35359:8;35344:14;:24::i;:::-;35387:41;35410:7;35419:8;35387:22;:41::i;:::-;35379:78;;;;-1:-1:-1::0;;;35379:78:0::1;;;;;;;:::i;:::-;35477:41;35500:7;35509:8;35477:22;:41::i;:::-;35476:42;35468:78;;;;-1:-1:-1::0;;;35468:78:0::1;;;;;;;:::i;:::-;35559:65;35576:27;35605:8;35615;35559:16;:65::i;31069:125::-:0;31122:5;31153:32;31174:10;31153:20;:32::i;:::-;31140:46;;31069:125;:::o;44255:243::-;44349:4;;44366:103;44386:7;:14;44383:1;:17;44366:103;;;44422:35;44431:10;44442:1;44431:13;;;;;;-1:-1:-1;;;44431:13:0;;;;;;;;;;;;;;;44446:7;44454:1;44446:10;;;;;;-1:-1:-1;;;44446:10:0;;;;;;;;;;;;;;;44422:8;:35::i;:::-;-1:-1:-1;44402:3:0;;;;:::i;:::-;;;;44366:103;;;-1:-1:-1;44486:4:0;;44255:243;-1:-1:-1;;;44255:243:0:o;26067:32::-;;;-1:-1:-1;;;;;26067:32:0;;:::o;6024:95::-;6071:13;6104:7;6097:14;;;;;:::i;30071:301::-;30113:16;30142:11;30156:29;30177:7;30156:20;:29::i;:::-;30142:43;;30196:18;30231:3;30217:18;;;;;;-1:-1:-1;;;30217:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30217:18:0;;30196:39;;30253:9;30248:96;30272:3;30268:1;:7;30248:96;;;30304:28;30321:7;30330:1;30304:16;:28::i;:::-;30297:1;30299;30297:4;;;;;;-1:-1:-1;;;30297:4:0;;;;;;;;;-1:-1:-1;;;;;30297:35:0;;;:4;;;;;;;;;;;:35;30277:3;;;;:::i;:::-;;;;30248:96;;10154:377;10247:4;10264:24;10291:11;:25;10303:12;:10;:12::i;:::-;-1:-1:-1;;;;;10291:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;10291:25:0;;;:34;;;;;;;;;;;-1:-1:-1;10344:35:0;;;;10336:85;;;;-1:-1:-1;;;10336:85:0;;;;;;;:::i;:::-;10432:67;10441:12;:10;:12::i;:::-;10455:7;10464:34;10483:15;10464:16;:34;:::i;26649:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26649:49:0;;;;;;;;;:::o;7418:175::-;7504:4;7521:42;7531:12;:10;:12::i;:::-;7545:9;7556:6;7521:9;:42::i;30459:119::-;30509:5;30540:29;30561:7;30540:20;:29::i;36153:261::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;36250:44:::1;36273:10;36285:8;36250:22;:44::i;:::-;36242:84;;;;-1:-1:-1::0;;;36242:84:0::1;;;;;;;:::i;:::-;36337:69;36354:29;36385:8;36403:1;36337:16;:69::i;37943:138::-:0;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;38009:64:::1;38026:22;38058:1;38070::::0;38009:16:::1;:64::i;32859:400::-:0;32923:4;;;32986:29;32923:4;32986:20;:29::i;:::-;32972:43;;33033:9;33028:168;33052:3;33048:1;:7;33028:168;;;33081:10;:40;33092:28;33109:7;33118:1;33092:16;:28::i;:::-;-1:-1:-1;;;;;33081:40:0;;;;;;;;;;;;;;;-1:-1:-1;33081:40:0;;;:48;;;;;;;;;;;:56;;:48;:56;33077:108;;;33158:11;;;;:::i;:::-;;;;33077:108;33057:3;;;;:::i;:::-;;;;33028:168;;;-1:-1:-1;;33228:23:0;;-1:-1:-1;;;;;33228:23:0;-1:-1:-1;33215:36:0;;32859:400;-1:-1:-1;;32859:400:0:o;31550:103::-;31629:16;;31550:103;:::o;26518:33::-;;;;:::o;7656:151::-;-1:-1:-1;;;;;7772:18:0;;;7745:7;7772:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7656:151::o;26168:42::-;;;-1:-1:-1;;;;;26168:42:0;;:::o;33611:533::-;33680:4;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;33708:10:::1;33697:22;::::0;;;:10:::1;:22;::::0;;;;;;;:30;;;;;;;;:37;;-1:-1:-1;;33697:37:0::1;33730:4;33697:37;::::0;;33816:26:::1;33720:6:::0;33816:18:::1;:26::i;:::-;33812:70;;;-1:-1:-1::0;33866:4:0::1;33859:11;;33812:70;33958:25;33976:6;33958:17;:25::i;:::-;33954:110;;;34000:26;34019:6;34000:18;:26::i;:::-;-1:-1:-1::0;34048:4:0::1;34041:11;;33954:110;-1:-1:-1::0;34131:5:0::1;33611:533:::0;;;:::o;26304:35::-;;;;:::o;21212:152::-;21282:4;21306:50;21311:3;-1:-1:-1;;;;;21331:23:0;;21306:4;:50::i;:::-;21299:57;21212:152;-1:-1:-1;;;21212:152:0:o;14459:92::-;;;;:::o;3419:98::-;3499:10;3419:98;:::o;13510:346::-;-1:-1:-1;;;;;13612:19:0;;13604:68;;;;-1:-1:-1;;;13604:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13691:21:0;;13683:68;;;;-1:-1:-1;;;13683:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13764:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;13816:32;;;;;13794:6;;13816:32;:::i;:::-;;;;;;;;13510:346;;;:::o;21784:167::-;21864:4;21888:55;21898:3;-1:-1:-1;;;;;21918:23:0;;21888:9;:55::i;38333:630::-;38460:14;;;;;;38443;38485:16;38460:14;38485:16;:::i;:::-;;;;;;38512:29;38534:6;38512:21;:29::i;:::-;38554:19;;;;:11;:19;;;;;;;;:37;;38584:7;;-1:-1:-1;;38554:37:0;;;;;;38584:7;;38554:37;;;;;-1:-1:-1;;;38554:37:0;;;;;;;;;;;;;-1:-1:-1;38602:19:0;;;;:11;:19;;;;;;;;:43;;-1:-1:-1;;;;;;38602:43:0;;-1:-1:-1;;;;;38602:43:0;;;;;;;;;;;;;-1:-1:-1;38656:30:0;;;:43;;-1:-1:-1;;;;;;38656:43:0;;;;;;;38723:10;38712:22;;;:10;:22;;;;;:30;;;;;;;;:37;;-1:-1:-1;;38712:37:0;;;;;38760;;:25;:37;;;;;:46;;;38873:23;;;:28;38869:87;;38918:26;38937:6;38918:18;:26::i;:::-;38333:630;;;;:::o;11021:604::-;-1:-1:-1;;;;;11127:20:0;;11119:70;;;;-1:-1:-1;;;11119:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11208:23:0;;11200:71;;;;-1:-1:-1;;;11200:71:0;;;;;;;:::i;:::-;11284:47;11305:6;11313:9;11324:6;11284:20;:47::i;:::-;-1:-1:-1;;;;;11368:17:0;;11344:21;11368:17;;;:9;:17;;;;;;11404:23;;;;11396:74;;;;-1:-1:-1;;;11396:74:0;;;;;;;:::i;:::-;11501:22;11517:6;11501:13;:22;:::i;:::-;-1:-1:-1;;;;;11481:17:0;;;;;;;:9;:17;;;;;;:42;;;;11534:20;;;;;;;;:30;;11558:6;;11481:17;11534:30;;11558:6;;11534:30;:::i;:::-;;;;;;;;11599:9;-1:-1:-1;;;;;11582:35:0;11591:6;-1:-1:-1;;;;;11582:35:0;;11610:6;11582:35;;;;;;:::i;:::-;;;;;;;;11021:604;;;;:::o;22037:117::-;22100:7;22127:19;22135:3;22127:7;:19::i;22498:158::-;22572:7;22623:22;22627:3;22639:5;22623:3;:22::i;43278:116::-;29008:7;;;;29007:8;28999:45;;;;-1:-1:-1;;;28999:45:0;;;;;;;:::i;:::-;43338:7:::1;:14:::0;;-1:-1:-1;;43338:14:0::1;43348:4;43338:14;::::0;;43368:18:::1;::::0;::::1;::::0;::::1;::::0;43375:10:::1;::::0;43368:18:::1;:::i;:::-;;;;;;;;43278:116::o:0;39092:1769::-;39191:23;39160:19;;;;:11;:19;;;;;;;;:27;;;;;;;:54;;;;;-1:-1:-1;;;39160:54:0;;;;;;;;;;39156:1652;;;39241:19;;;;:11;:19;;;;;:30;;;39231:41;;-1:-1:-1;;;;;39241:30:0;39231:9;:41::i;:::-;39156:1652;;;39325:26;39294:19;;;;:11;:19;;;;;;;;:27;;;;;;;:57;;;;;-1:-1:-1;;;39294:57:0;;;;;;;;;;39290:1518;;;39381:19;;;;:11;:19;;;;;:30;39368:44;;39381:30;;;-1:-1:-1;;;;;39381:30:0;39368:12;:44::i;39290:1518::-;39465:27;39434:19;;;;:11;:19;;;;;;;;:27;;;;;;;:58;;;;;-1:-1:-1;;;39434:58:0;;;;;;;;;;39430:1378;;;39541:19;;;;:11;:19;;;;;:30;;39590;;;;;39509:126;;-1:-1:-1;;;;;39541:30:0;;;;;;;39590;39509:13;:126::i;39430:1378::-;39702:26;39671:19;;;;:11;:19;;;;;;;;:27;;;;;;;:57;;;;;-1:-1:-1;;;39671:57:0;;;;;;;;;;39653:1155;;;39768:19;;;;:11;:19;;;;;:30;;;39755:44;;-1:-1:-1;;;;;39768:30:0;39755:12;:44::i;39653:1155::-;39866:29;39835:19;;;;:11;:19;;;;;;;;:27;;;;;;;:60;;;;;-1:-1:-1;;;39835:60:0;;;;;;;;;;39817:991;;;39938:19;;;;:11;:19;;;;;:30;39922:47;;39938:30;;;-1:-1:-1;;;;;39938:30:0;39922:15;:47::i;39817:991::-;40036:30;40005:19;;;;:11;:19;;;;;;;;:27;;;;;;;:61;;;;;-1:-1:-1;;;40005:61:0;;;;;;;;;;39987:821;;;40110:19;;;;:11;:19;;;;;:30;;40141;;;;;40093:79;;-1:-1:-1;;;;;40110:30:0;;;;;;;40141;40093:16;:79::i;39987:821::-;40239:37;40208:19;;;;:11;:19;;;;;;;;:27;;;;;;;:68;;;;;-1:-1:-1;;;40208:68:0;;;;;;;;;;40190:618;;;40335:19;;;;:11;:19;;;;;:30;;;40303:64;;-1:-1:-1;;;;;40335:30:0;40303:23;:64::i;40190:618::-;40434:30;40403:19;;;;:11;:19;;;;;;;;:27;;;;;;;:61;;;;;-1:-1:-1;;;40403:61:0;;;;;;;;;;40385:423;;;40516:19;;;;:11;:19;;;;;:30;;;40491:57;;-1:-1:-1;;;;;40516:30:0;40491:16;:57::i;40385:423::-;40615:20;40584:19;;;;:11;:19;;;;;;;;:27;;;;;;;:51;;;;;-1:-1:-1;;;40584:51:0;;;;;;;;;;40566:242;;;40662:8;:6;:8::i;40566:242::-;40737:22;40706:19;;;;:11;:19;;;;;;;;:27;;;;;;;:53;;;;;-1:-1:-1;;;40706:53:0;;;;;;;;;;40688:120;;;40786:10;:8;:10::i;:::-;40820:19;;;;:11;:19;;;;;:33;;-1:-1:-1;;40820:33:0;40849:4;40820:33;;;39092:1769::o;16276:414::-;16339:4;16361:21;16371:3;16376:5;16361:9;:21::i;:::-;16356:327;;-1:-1:-1;16399:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;16582:18;;16560:19;;;:12;;;:19;;;;;;:40;;;;16615:11;;16356:327;-1:-1:-1;16666:5:0;16659:12;;18496:129;18569:4;18593:19;;;:12;;;;;:19;;;;;;:24;;;18496:129::o;44506:251::-;44615:44;44642:4;44648:2;44652:6;44615:26;:44::i;:::-;44681:8;:6;:8::i;:::-;44680:9;44672:77;;;;-1:-1:-1;;;44672:77:0;;;;;;;:::i;18711:109::-;18794:18;;18711:109::o;19164:204::-;19259:18;;19231:7;;19259:26;-1:-1:-1;19251:73:0;;;;-1:-1:-1;;;19251:73:0;;;;;;;:::i;:::-;19342:3;:11;;19354:5;19342:18;;;;;;-1:-1:-1;;;19342:18:0;;;;;;;;;;;;;;;;;19335:25;;19164:204;;;;:::o;40883:131::-;40937:33;40955:7;40964:5;40937:17;:33::i;:::-;;40986:20;41000:5;40986:20;;;;;;:::i;:::-;;;;;;;;40883:131;:::o;41036:290::-;41093:36;41114:7;41123:5;41093:20;:36::i;:::-;;41145:19;41158:5;41145:19;;;;;;:::i;:::-;;;;;;;;41177:15;41195:19;:17;:19::i;:::-;41228:23;;41177:37;;-1:-1:-1;41228:35:0;;;-1:-1:-1;;;;;41228:23:0;;;:35;41225:94;;;41280:27;41297:9;41280:27;;:16;:27::i;41348:225::-;41427:39;41448:7;41457:8;41427:20;:39::i;:::-;;41477:36;41495:7;41504:8;41477:17;:36::i;:::-;;41529;41546:8;41556;41529:36;;;;;;;:::i;:::-;;;;;;;;41348:225;;:::o;41595:149::-;41655:39;41673:10;41685:8;41655:17;:39::i;:::-;;41710:26;41727:8;41710:26;;;;;;:::i;41766:154::-;41829:42;41850:10;41862:8;41829:20;:42::i;:::-;;41887:25;41903:8;41887:25;;;;;;:::i;41942:255::-;42035:45;42055:11;42068;42035:45;;;;;;;:::i;:::-;;;;;;;;42091;42112:10;42124:11;42091:20;:45::i;:::-;;42147:42;42165:10;42177:11;42147:17;:42::i;42282:154::-;42358:32;42381:8;42358:32;;;;;;:::i;:::-;;;;;;;;42401:16;:27;42282:154::o;42520:256::-;42606:19;:17;:19::i;:::-;42593:32;;:9;-1:-1:-1;;;;;42593:32:0;;;42585:95;;;;-1:-1:-1;;;42585:95:0;;;;;;;:::i;:::-;42696:26;42712:9;42696:26;;;;;;:::i;:::-;;;;;;;;42733:23;:35;;-1:-1:-1;;;;;;42733:35:0;-1:-1:-1;;;;;42733:35:0;;;;;;;;;;42520:256::o;43517:118::-;29266:7;;;;29258:48;;;;-1:-1:-1;;;29258:48:0;;;;;;;:::i;:::-;43576:7:::1;:15:::0;;-1:-1:-1;;43576:15:0::1;::::0;;43607:20:::1;::::0;::::1;::::0;::::1;::::0;43616:10:::1;::::0;43607:20:::1;:::i;21540:158::-:0;21613:4;21637:53;21645:3;-1:-1:-1;;;;;21665:23:0;;16932:4;17071:19;;;:12;;;:19;;;;;;17107:15;;17103:1300;;17469:21;17493:14;17506:1;17493:10;:14;:::i;:::-;17542:18;;17469:38;;-1:-1:-1;17522:17:0;;17542:22;;17563:1;;17542:22;:::i;:::-;17522:42;;17809:17;17829:3;:11;;17841:9;17829:22;;;;;;-1:-1:-1;;;17829:22:0;;;;;;;;;;;;;;;;;17809:42;;17975:9;17946:3;:11;;17958:13;17946:26;;;;;;-1:-1:-1;;;17946:26:0;;;;;;;;;;;;;;;;;;:38;18078:17;:13;18094:1;18078:17;:::i;:::-;18052:23;;;;:12;;;:23;;;;;:43;18204:17;;18052:3;;18204:17;;;-1:-1:-1;;;18204:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;18299:3;:12;;:19;18312:5;18299:19;;;;;;;;;;;18292:26;;;18342:4;18335:11;;;;;;;;17103:1300;18386:5;18379:12;;;;;14:705:1;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;189:6;176:20;215:4;239:65;254:49;300:2;254:49;:::i;:::-;239:65;:::i;:::-;338:15;;;369:12;;;;401:15;;;447:11;;;435:24;;431:33;;428:42;-1:-1:-1;425:2:1;;;487:5;480;473:20;425:2;513:5;527:163;541:2;538:1;535:9;527:163;;;598:17;;586:30;;636:12;;;;668;;;;559:1;552:9;527:163;;;-1:-1:-1;708:5:1;;84:635;-1:-1:-1;;;;;;;84:635:1:o;724:259::-;;836:2;824:9;815:7;811:23;807:32;804:2;;;857:6;849;842:22;804:2;901:9;888:23;920:33;947:5;920:33;:::i;988:402::-;;;1117:2;1105:9;1096:7;1092:23;1088:32;1085:2;;;1138:6;1130;1123:22;1085:2;1182:9;1169:23;1201:33;1228:5;1201:33;:::i;:::-;1253:5;-1:-1:-1;1310:2:1;1295:18;;1282:32;1323:35;1282:32;1323:35;:::i;:::-;1377:7;1367:17;;;1075:315;;;;;:::o;1395:470::-;;;;1541:2;1529:9;1520:7;1516:23;1512:32;1509:2;;;1562:6;1554;1547:22;1509:2;1606:9;1593:23;1625:33;1652:5;1625:33;:::i;:::-;1677:5;-1:-1:-1;1734:2:1;1719:18;;1706:32;1747:35;1706:32;1747:35;:::i;:::-;1499:366;;1801:7;;-1:-1:-1;;;1855:2:1;1840:18;;;;1827:32;;1499:366::o;1870:327::-;;;1999:2;1987:9;1978:7;1974:23;1970:32;1967:2;;;2020:6;2012;2005:22;1967:2;2064:9;2051:23;2083:33;2110:5;2083:33;:::i;:::-;2135:5;2187:2;2172:18;;;;2159:32;;-1:-1:-1;;;1957:240:1:o;2202:1295::-;;;2381:2;2369:9;2360:7;2356:23;2352:32;2349:2;;;2402:6;2394;2387:22;2349:2;2447:9;2434:23;2476:18;2517:2;2509:6;2506:14;2503:2;;;2538:6;2530;2523:22;2503:2;2581:6;2570:9;2566:22;2556:32;;2626:7;2619:4;2615:2;2611:13;2607:27;2597:2;;2653:6;2645;2638:22;2597:2;2694;2681:16;2716:4;2740:65;2755:49;2801:2;2755:49;:::i;2740:65::-;2839:15;;;2870:12;;;;2902:11;;;2940;;;2932:20;;2928:29;;2925:42;-1:-1:-1;2922:2:1;;;2985:6;2977;2970:22;2922:2;3012:6;3003:15;;3027:240;3041:2;3038:1;3035:9;3027:240;;;3112:3;3099:17;3129:33;3156:5;3129:33;:::i;:::-;3175:18;;3059:1;3052:9;;;;;3213:12;;;;3245;;3027:240;;;-1:-1:-1;3286:5:1;-1:-1:-1;;3329:18:1;;3316:32;;-1:-1:-1;;3360:16:1;;;3357:2;;;3394:6;3386;3379:22;3357:2;;3422:69;3483:7;3472:8;3461:9;3457:24;3422:69;:::i;:::-;3412:79;;;2339:1158;;;;;:::o;3766:190::-;;3878:2;3866:9;3857:7;3853:23;3849:32;3846:2;;;3899:6;3891;3884:22;3846:2;-1:-1:-1;3927:23:1;;3836:120;-1:-1:-1;3836:120:1:o;3961:203::-;-1:-1:-1;;;;;4125:32:1;;;;4107:51;;4095:2;4080:18;;4062:102::o;4169:304::-;-1:-1:-1;;;;;4399:15:1;;;4381:34;;4451:15;;4446:2;4431:18;;4424:43;4331:2;4316:18;;4298:175::o;4478:661::-;4649:2;4701:21;;;4771:13;;4674:18;;;4793:22;;;4478:661;;4649:2;4872:15;;;;4846:2;4831:18;;;4478:661;4918:195;4932:6;4929:1;4926:13;4918:195;;;4997:13;;-1:-1:-1;;;;;4993:39:1;4981:52;;5088:15;;;;5053:12;;;;5029:1;4947:9;4918:195;;;-1:-1:-1;5130:3:1;;4629:510;-1:-1:-1;;;;;;4629:510:1:o;5144:187::-;5309:14;;5302:22;5284:41;;5272:2;5257:18;;5239:92::o;5336:628::-;5603:14;;5596:22;5578:41;;5565:3;5550:19;;5649:2;5638:14;;5628:2;;5695:10;5690:3;5686:20;5683:1;5676:31;5730:4;5727:1;5720:15;5758:4;5755:1;5748:15;5628:2;5804;5789:18;;5782:34;;;;-1:-1:-1;;;;;5890:15:1;;;5885:2;5870:18;;5863:43;5942:15;;5937:2;5922:18;;;5915:43;5532:432;;-1:-1:-1;5532:432:1:o;5969:603::-;;6110:2;6139;6128:9;6121:21;6171:6;6165:13;6214:6;6209:2;6198:9;6194:18;6187:34;6239:4;6252:140;6266:6;6263:1;6260:13;6252:140;;;6361:14;;;6357:23;;6351:30;6327:17;;;6346:2;6323:26;6316:66;6281:10;;6252:140;;;6410:6;6407:1;6404:13;6401:2;;;6480:4;6475:2;6466:6;6455:9;6451:22;6447:31;6440:45;6401:2;-1:-1:-1;6556:2:1;6535:15;-1:-1:-1;;6531:29:1;6516:45;;;;6563:2;6512:54;;6090:482;-1:-1:-1;;;6090:482:1:o;6577:398::-;6779:2;6761:21;;;6818:2;6798:18;;;6791:30;6857:34;6852:2;6837:18;;6830:62;-1:-1:-1;;;6923:2:1;6908:18;;6901:32;6965:3;6950:19;;6751:224::o;6980:399::-;7182:2;7164:21;;;7221:2;7201:18;;;7194:30;7260:34;7255:2;7240:18;;7233:62;-1:-1:-1;;;7326:2:1;7311:18;;7304:33;7369:3;7354:19;;7154:225::o;7384:414::-;7586:2;7568:21;;;7625:2;7605:18;;;7598:30;7664:34;7659:2;7644:18;;7637:62;-1:-1:-1;;;7730:2:1;7715:18;;7708:48;7788:3;7773:19;;7558:240::o;7803:348::-;8005:2;7987:21;;;8044:2;8024:18;;;8017:30;8083:26;8078:2;8063:18;;8056:54;8142:2;8127:18;;7977:174::o;8156:398::-;8358:2;8340:21;;;8397:2;8377:18;;;8370:30;8436:34;8431:2;8416:18;;8409:62;-1:-1:-1;;;8502:2:1;8487:18;;8480:32;8544:3;8529:19;;8330:224::o;8559:355::-;8761:2;8743:21;;;8800:2;8780:18;;;8773:30;8839:33;8834:2;8819:18;;8812:61;8905:2;8890:18;;8733:181::o;8919:402::-;9121:2;9103:21;;;9160:2;9140:18;;;9133:30;9199:34;9194:2;9179:18;;9172:62;-1:-1:-1;;;9265:2:1;9250:18;;9243:36;9311:3;9296:19;;9093:228::o;9326:348::-;9528:2;9510:21;;;9567:2;9547:18;;;9540:30;9606:26;9601:2;9586:18;;9579:54;9665:2;9650:18;;9500:174::o;9679:349::-;9881:2;9863:21;;;9920:2;9900:18;;;9893:30;9959:27;9954:2;9939:18;;9932:55;10019:2;10004:18;;9853:175::o;10033:352::-;10235:2;10217:21;;;10274:2;10254:18;;;10247:30;10313;10308:2;10293:18;;10286:58;10376:2;10361:18;;10207:178::o;10390:351::-;10592:2;10574:21;;;10631:2;10611:18;;;10604:30;10670:29;10665:2;10650:18;;10643:57;10732:2;10717:18;;10564:177::o;10746:346::-;10948:2;10930:21;;;10987:2;10967:18;;;10960:30;-1:-1:-1;;;11021:2:1;11006:18;;10999:52;11083:2;11068:18;;10920:172::o;11097:404::-;11299:2;11281:21;;;11338:2;11318:18;;;11311:30;11377:34;11372:2;11357:18;;11350:62;-1:-1:-1;;;11443:2:1;11428:18;;11421:38;11491:3;11476:19;;11271:230::o;11506:401::-;11708:2;11690:21;;;11747:2;11727:18;;;11720:30;11786:34;11781:2;11766:18;;11759:62;-1:-1:-1;;;11852:2:1;11837:18;;11830:35;11897:3;11882:19;;11680:227::o;11912:400::-;12114:2;12096:21;;;12153:2;12133:18;;;12126:30;12192:34;12187:2;12172:18;;12165:62;-1:-1:-1;;;12258:2:1;12243:18;;12236:34;12302:3;12287:19;;12086:226::o;12317:400::-;12519:2;12501:21;;;12558:2;12538:18;;;12531:30;12597:34;12592:2;12577:18;;12570:62;-1:-1:-1;;;12663:2:1;12648:18;;12641:34;12707:3;12692:19;;12491:226::o;12722:348::-;12924:2;12906:21;;;12963:2;12943:18;;;12936:30;13002:26;12997:2;12982:18;;12975:54;13061:2;13046:18;;12896:174::o;13075:339::-;13277:2;13259:21;;;13316:2;13296:18;;;13289:30;-1:-1:-1;;;13350:2:1;13335:18;;13328:45;13405:2;13390:18;;13249:165::o;13419:352::-;13621:2;13603:21;;;13660:2;13640:18;;;13633:30;13699;13694:2;13679:18;;13672:58;13762:2;13747:18;;13593:178::o;13776:419::-;13978:2;13960:21;;;14017:2;13997:18;;;13990:30;14056:34;14051:2;14036:18;;14029:62;14127:25;14122:2;14107:18;;14100:53;14185:3;14170:19;;13950:245::o;14200:353::-;14402:2;14384:21;;;14441:2;14421:18;;;14414:30;14480:31;14475:2;14460:18;;14453:59;14544:2;14529:18;;14374:179::o;14558:401::-;14760:2;14742:21;;;14799:2;14779:18;;;14772:30;14838:34;14833:2;14818:18;;14811:62;-1:-1:-1;;;14904:2:1;14889:18;;14882:35;14949:3;14934:19;;14732:227::o;15172:177::-;15318:25;;;15306:2;15291:18;;15273:76::o;15354:184::-;15526:4;15514:17;;;;15496:36;;15484:2;15469:18;;15451:87::o;15543:251::-;15613:2;15607:9;15643:17;;;15690:18;15675:34;;15711:22;;;15672:62;15669:2;;;15737:18;;:::i;:::-;15773:2;15766:22;15587:207;;-1:-1:-1;15587:207:1:o;15799:192::-;;15898:18;15890:6;15887:30;15884:2;;;15920:18;;:::i;:::-;-1:-1:-1;15980:4:1;15961:17;;;15957:28;;15874:117::o;15996:128::-;;16067:1;16063:6;16060:1;16057:13;16054:2;;;16073:18;;:::i;:::-;-1:-1:-1;16109:9:1;;16044:80::o;16129:125::-;;16197:1;16194;16191:8;16188:2;;;16202:18;;:::i;:::-;-1:-1:-1;16239:9:1;;16178:76::o;16259:380::-;16344:1;16334:12;;16391:1;16381:12;;;16402:2;;16456:4;16448:6;16444:17;16434:27;;16402:2;16509;16501:6;16498:14;16478:18;16475:38;16472:2;;;16555:10;16550:3;16546:20;16543:1;16536:31;16590:4;16587:1;16580:15;16618:4;16615:1;16608:15;16472:2;;16314:325;;;:::o;16644:135::-;;-1:-1:-1;;16704:17:1;;16701:2;;;16724:18;;:::i;:::-;-1:-1:-1;16771:1:1;16760:13;;16691:88::o;16784:127::-;16845:10;16840:3;16836:20;16833:1;16826:31;16876:4;16873:1;16866:15;16900:4;16897:1;16890:15;16916:127;16977:10;16972:3;16968:20;16965:1;16958:31;17008:4;17005:1;16998:15;17032:4;17029:1;17022:15;17048:133;-1:-1:-1;;;;;17125:31:1;;17115:42;;17105:2;;17171:1;17168;17161:12
Swarm Source
ipfs://20f35fd5fde27c8601d5cc74fdfb18d78ca5df70c12ae5217331d9dad11207bf
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.
Add Token to MetaMask (Web3)