Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12226017 | 1274 days ago | IN | 0 ETH | 0.31340257 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BLACK
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-13 */ // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } /* * @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 GSN 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. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function sub0(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a - b : 0; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } /** * @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); } /** * @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 {ERC20MinterPauser}. * * 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 ERC20UpgradeSafe is Initializable, ContextUpgradeSafe, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name, string memory symbol) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name, symbol); } function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view 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 {_setupDecimals} is * called. * * 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 returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view 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); if(sender != _msgSender() && _allowances[sender][_msgSender()] != uint(-1)) _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); 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].add(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) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); 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); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(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 = _totalSupply.add(amount); _balances[account] = _balances[account].add(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); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is 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 Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @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 { } uint256[44] private __gap; } /** * @dev Extension of {ERC20} that adds a cap to the supply of tokens. */ abstract contract ERC20CappedUpgradeSafe is Initializable, ERC20UpgradeSafe { uint256 private _cap; /** * @dev Sets the value of the `cap`. This value is immutable, it can only be * set once during construction. */ function __ERC20Capped_init(uint256 cap) internal initializer { __Context_init_unchained(); __ERC20Capped_init_unchained(cap); } function __ERC20Capped_init_unchained(uint256 cap) internal initializer { require(cap > 0, "ERC20Capped: cap is 0"); _cap = cap; } /** * @dev Returns the cap on the token's total supply. */ function cap() public view returns (uint256) { return _cap; } /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - minted tokens must not cause the total supply to go over the cap. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { // When minting tokens require(totalSupply().add(amount) <= _cap, "ERC20Capped: cap exceeded"); } } uint256[49] private __gap; } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } contract Governable is Initializable { address public governor; event GovernorshipTransferred(address indexed previousGovernor, address indexed newGovernor); /** * @dev Contract initializer. * called once by the factory at time of deployment */ function __Governable_init_unchained(address governor_) virtual public initializer { governor = governor_; emit GovernorshipTransferred(address(0), governor); } modifier governance() { require(msg.sender == governor); _; } /** * @dev Allows the current governor to relinquish control of the contract. * @notice Renouncing to governorship will leave the contract without an governor. * It will not be possible to call the functions with the `governance` * modifier anymore. */ function renounceGovernorship() public governance { emit GovernorshipTransferred(governor, address(0)); governor = address(0); } /** * @dev Allows the current governor to transfer control of the contract to a newGovernor. * @param newGovernor The address to transfer governorship to. */ function transferGovernorship(address newGovernor) public governance { _transferGovernorship(newGovernor); } /** * @dev Transfers control of the contract to a newGovernor. * @param newGovernor The address to transfer governorship to. */ function _transferGovernorship(address newGovernor) internal { require(newGovernor != address(0)); emit GovernorshipTransferred(governor, newGovernor); governor = newGovernor; } } contract Configurable is Governable { mapping (bytes32 => uint) internal config; function getConfig(bytes32 key) public view returns (uint) { return config[key]; } function getConfigI(bytes32 key, uint index) public view returns (uint) { return config[bytes32(uint(key) ^ index)]; } function getConfigA(bytes32 key, address addr) public view returns (uint) { return config[bytes32(uint(key) ^ uint(addr))]; } function _setConfig(bytes32 key, uint value) internal { if(config[key] != value) config[key] = value; } function _setConfigI(bytes32 key, uint index, uint value) internal { _setConfig(bytes32(uint(key) ^ index), value); } function _setConfigA(bytes32 key, address addr, uint value) internal { _setConfig(bytes32(uint(key) ^ uint(addr)), value); } function setConfig(bytes32 key, uint value) external governance { _setConfig(key, value); } function setConfigI(bytes32 key, uint index, uint value) external governance { _setConfig(bytes32(uint(key) ^ index), value); } function setConfigA(bytes32 key, address addr, uint value) public governance { _setConfig(bytes32(uint(key) ^ uint(addr)), value); } } contract Offering is Configurable { using SafeMath for uint; using SafeERC20 for IERC20; bytes32 internal constant _quota_ = 'quota'; bytes32 internal constant _volume_ = 'volume'; bytes32 internal constant _unlocked_ = 'unlocked'; bytes32 internal constant _ratioUnlockFirst_= 'ratioUnlockFirst'; bytes32 internal constant _ratio_ = 'ratio'; bytes32 internal constant _isSeed_ = 'isSeed'; bytes32 internal constant _public_ = 'public'; bytes32 internal constant _recipient_ = 'recipient'; bytes32 internal constant _time_ = 'time'; uint internal constant _timeOfferBegin_ = 0; uint internal constant _timeOfferEnd_ = 1; uint internal constant _timeUnlockFirst_ = 2; uint internal constant _timeUnlockBegin_ = 3; uint internal constant _timeUnlockEnd_ = 4; IERC20 public currency; IERC20 public token; function __Offering_init(address governor_, address currency_, address token_, address public_, address recipient_, uint[5] memory times_) external initializer { __Governable_init_unchained(governor_); __Offering_init_unchained(currency_, token_, public_, recipient_, times_); } function __Offering_init_unchained(address currency_, address token_, address public_, address recipient_, uint[5] memory times_) public governance { currency = IERC20(currency_); token = IERC20(token_); _setConfigI(_ratio_, 0, 30000000000000); // for kol _setConfigI(_ratio_, 1, 40000000000000); // for seed _setConfig(_public_, uint(public_)); _setConfig(_recipient_, uint(recipient_)); _setConfig(_ratioUnlockFirst_, 0.25 ether); // 25% for(uint i=0; i<times_.length; i++) _setConfigI(_time_, i, times_[i]); } function setQuota(address addr, uint amount, bool isSeed) public governance { uint oldVol = getConfigA(_quota_, addr).mul(getConfigI(_ratio_, getConfigA(_isSeed_, addr))); _setConfigA(_quota_, addr, amount); if(isSeed) _setConfigA(_isSeed_, addr, 1); uint volume = amount.mul(getConfigI(_ratio_, isSeed ? 1 : 0)); uint totalVolume = getConfigA(_volume_, address(0)).add(volume).sub(oldVol); require(totalVolume <= token.balanceOf(address(this)), 'out of quota'); _setConfigA(_volume_, address(0), totalVolume); } function setQuotas(address[] memory addrs, uint[] memory amounts, bool isSeed) public { for(uint i=0; i<addrs.length; i++) setQuota(addrs[i], amounts[i], isSeed); } function getQuota(address addr) public view returns (uint) { return getConfigA(_quota_, addr); } function offer() external { require(now >= getConfigI(_time_, _timeOfferBegin_), 'Not begin'); require(now <= getConfigI(_time_, _timeOfferEnd_), 'EXPIRED'); uint quota = getConfigA(_quota_, msg.sender); require(quota > 0, 'no quota'); require(currency.allowance(msg.sender, address(this)) >= quota, 'allowance not enough'); require(currency.balanceOf(msg.sender) >= quota, 'balance not enough'); require(getConfigA(_volume_, msg.sender) == 0, 'offered already'); currency.safeTransferFrom(msg.sender, address(config[_recipient_]), quota); uint volume = quota.mul(getConfigI(_ratio_, getConfigA(_isSeed_, msg.sender))); _setConfigA(_volume_, msg.sender, volume); _setConfigA(_volume_, address(0), volume.add(getConfigA(_volume_, address(0)))); } function settleRemain() external { require(now > getConfigI(_time_, _timeOfferEnd_), 'It is not time'); token.safeTransfer(address(config[_public_]), token.balanceOf(address(this)).add(getConfigA(_unlocked_, address(0))).sub(getConfigA(_volume_, address(0)))); } function getVolume(address addr) public view returns (uint) { return getConfigA(_volume_, addr); } function unlockCapacity(address addr) public view returns (uint c) { uint timeUnlockFirst = getConfigI(_time_, _timeUnlockFirst_); if(timeUnlockFirst == 0 || now < timeUnlockFirst) return 0; uint timeUnlockBegin = getConfigI(_time_, _timeUnlockBegin_); uint timeUnlockEnd = getConfigI(_time_, _timeUnlockEnd_); uint volume = getConfigA(_volume_, addr); uint ratioUnlockFirst = getConfig(_ratioUnlockFirst_); c = volume.mul(ratioUnlockFirst).div(1e18); if(now >= timeUnlockEnd) c = volume; else if(now > timeUnlockBegin) c = volume.sub(c).mul(now.sub(timeUnlockBegin)).div(timeUnlockEnd.sub(timeUnlockBegin)).add(c); return c.sub(getConfigA(_unlocked_, addr)); } function unlock() public { uint c = unlockCapacity(msg.sender); _setConfigA(_unlocked_, msg.sender, getConfigA(_unlocked_, msg.sender).add(c)); _setConfigA(_unlocked_, address(0), getConfigA(_unlocked_, address(0)).add(c)); token.safeTransfer(msg.sender, c); } function unlocked(address addr) public view returns (uint) { return getConfigA(_unlocked_, addr); } fallback() external { unlock(); } } contract Timelock is Configurable { using SafeMath for uint; using SafeERC20 for IERC20; IERC20 public token; address public recipient; uint public begin; uint public span; uint public times; uint public total; function start(address _token, address _recipient, uint _begin, uint _span, uint _times) external governance { require(address(token) == address(0), 'already start'); token = IERC20(_token); recipient = _recipient; begin = _begin; span = _span; times = _times; total = token.balanceOf(address(this)); } function unlockCapacity() public view returns (uint) { if(begin == 0 || now < begin) return 0; for(uint i=1; i<=times; i++) if(now < span.mul(i).div(times).add(begin)) return token.balanceOf(address(this)).sub(total.mul(times.sub(i)).div(times)); return token.balanceOf(address(this)); } function unlock() public { token.safeTransfer(recipient, unlockCapacity()); } fallback() external { unlock(); } } contract Constants { bytes32 internal constant _TokenMapped_ = 'TokenMapped'; bytes32 internal constant _MappableToken_ = 'MappableToken'; bytes32 internal constant _MappingToken_ = 'MappingToken'; bytes32 internal constant _fee_ = 'fee'; bytes32 internal constant _feeCreate_ = 'feeCreate'; bytes32 internal constant _feeTo_ = 'feeTo'; bytes32 internal constant _minSignatures_ = 'minSignatures'; bytes32 internal constant _uniswapRounter_ = 'uniswapRounter'; function _chainId() internal pure returns (uint id) { assembly { id := chainid() } } } struct Signature { address signatory; uint8 v; bytes32 r; bytes32 s; } abstract contract MappingBase is ContextUpgradeSafe, Constants { using SafeMath for uint; bytes32 public constant RECEIVE_TYPEHASH = keccak256("Receive(uint256 fromChainId,address to,uint256 nonce,uint256 volume,address signatory)"); bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); bytes32 internal _DOMAIN_SEPARATOR; function DOMAIN_SEPARATOR() virtual public view returns (bytes32) { return _DOMAIN_SEPARATOR; } address public factory; uint256 public mainChainId; address public token; address public creator; mapping (address => uint) public authQuotaOf; // signatory => quota mapping (uint => mapping (address => uint)) public sentCount; // toChainId => to => sentCount mapping (uint => mapping (address => mapping (uint => uint))) public sent; // toChainId => to => nonce => volume mapping (uint => mapping (address => mapping (uint => uint))) public received; // fromChainId => to => nonce => volume modifier onlyFactory { require(msg.sender == factory, 'Only called by Factory'); _; } function increaseAuthQuotas(address[] memory signatorys, uint[] memory increments) virtual external returns (uint[] memory quotas) { require(signatorys.length == increments.length, 'two array lenth not equal'); quotas = new uint[](signatorys.length); for(uint i=0; i<signatorys.length; i++) quotas[i] = increaseAuthQuota(signatorys[i], increments[i]); } function increaseAuthQuota(address signatory, uint increment) virtual public onlyFactory returns (uint quota) { quota = authQuotaOf[signatory].add(increment); authQuotaOf[signatory] = quota; emit IncreaseAuthQuota(signatory, increment, quota); } event IncreaseAuthQuota(address indexed signatory, uint increment, uint quota); function decreaseAuthQuotas(address[] memory signatorys, uint[] memory decrements) virtual external returns (uint[] memory quotas) { require(signatorys.length == decrements.length, 'two array lenth not equal'); quotas = new uint[](signatorys.length); for(uint i=0; i<signatorys.length; i++) quotas[i] = decreaseAuthQuota(signatorys[i], decrements[i]); } function decreaseAuthQuota(address signatory, uint decrement) virtual public onlyFactory returns (uint quota) { quota = authQuotaOf[signatory]; if(quota < decrement) decrement = quota; return _decreaseAuthQuota(signatory, decrement); } function _decreaseAuthQuota(address signatory, uint decrement) virtual internal returns (uint quota) { quota = authQuotaOf[signatory].sub(decrement); authQuotaOf[signatory] = quota; emit DecreaseAuthQuota(signatory, decrement, quota); } event DecreaseAuthQuota(address indexed signatory, uint decrement, uint quota); function needApprove() virtual public pure returns (bool); function send(uint toChainId, address to, uint volume) virtual external payable returns (uint nonce) { return sendFrom(_msgSender(), toChainId, to, volume); } function sendFrom(address from, uint toChainId, address to, uint volume) virtual public payable returns (uint nonce) { _chargeFee(); _sendFrom(from, volume); nonce = sentCount[toChainId][to]++; sent[toChainId][to][nonce] = volume; emit Send(from, toChainId, to, nonce, volume); } event Send(address indexed from, uint indexed toChainId, address indexed to, uint nonce, uint volume); function _sendFrom(address from, uint volume) virtual internal; function receive(uint256 fromChainId, address to, uint256 nonce, uint256 volume, Signature[] memory signatures) virtual external payable { _chargeFee(); require(received[fromChainId][to][nonce] == 0, 'withdrawn already'); uint N = signatures.length; require(N >= Configurable(factory).getConfig(_minSignatures_), 'too few signatures'); for(uint i=0; i<N; i++) { for(uint j=0; j<i; j++) require(signatures[i].signatory != signatures[j].signatory, 'repetitive signatory'); bytes32 structHash = keccak256(abi.encode(RECEIVE_TYPEHASH, fromChainId, to, nonce, volume, signatures[i].signatory)); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", _DOMAIN_SEPARATOR, structHash)); address signatory = ecrecover(digest, signatures[i].v, signatures[i].r, signatures[i].s); require(signatory != address(0), "invalid signature"); require(signatory == signatures[i].signatory, "unauthorized"); _decreaseAuthQuota(signatures[i].signatory, volume); emit Authorize(fromChainId, to, nonce, volume, signatory); } received[fromChainId][to][nonce] = volume; _receive(to, volume); emit Receive(fromChainId, to, nonce, volume); } event Receive(uint256 indexed fromChainId, address indexed to, uint256 indexed nonce, uint256 volume); event Authorize(uint256 fromChainId, address indexed to, uint256 indexed nonce, uint256 volume, address indexed signatory); function _receive(address to, uint256 volume) virtual internal; function _chargeFee() virtual internal { require(msg.value >= Configurable(factory).getConfig(_fee_), 'fee is too low'); address payable feeTo = address(Configurable(factory).getConfig(_feeTo_)); if(feeTo == address(0)) feeTo = address(uint160(factory)); feeTo.transfer(msg.value); emit ChargeFee(_msgSender(), feeTo, msg.value); } event ChargeFee(address indexed from, address indexed to, uint value); uint256[50] private __gap; } abstract contract Permit { // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; function DOMAIN_SEPARATOR() virtual public view returns (bytes32); mapping (address => uint) public nonces; function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, 'permit EXPIRED'); bytes32 digest = keccak256( abi.encodePacked( '\x19\x01', DOMAIN_SEPARATOR(), keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, 'permit INVALID_SIGNATURE'); _approve(owner, spender, value); } function _approve(address owner, address spender, uint256 amount) internal virtual; uint256[50] private __gap; } contract MappableToken is Permit, ERC20UpgradeSafe, MappingBase { function __MappableToken_init(address factory_, address creator_, string memory name_, string memory symbol_, uint8 decimals_, uint256 totalSupply_) external initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); _setupDecimals(decimals_); _mint(creator_, totalSupply_); __MappableToken_init_unchained(factory_, creator_); } function __MappableToken_init_unchained(address factory_, address creator_) public initializer { factory = factory_; mainChainId = _chainId(); token = address(0); creator = creator_; _DOMAIN_SEPARATOR = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), _chainId(), address(this))); } function DOMAIN_SEPARATOR() virtual override(Permit, MappingBase) public view returns (bytes32) { return MappingBase.DOMAIN_SEPARATOR(); } function _approve(address owner, address spender, uint256 amount) virtual override(Permit, ERC20UpgradeSafe) internal { return ERC20UpgradeSafe._approve(owner, spender, amount); } function totalMapped() virtual public view returns (uint) { return balanceOf(address(this)); } function needApprove() virtual override public pure returns (bool) { return false; } function _sendFrom(address from, uint volume) virtual override internal { transferFrom(from, address(this), volume); } function _receive(address to, uint256 volume) virtual override internal { _transfer(address(this), to, volume); } uint256[50] private __gap; } contract BLACK is MappableToken { function __BLACK_init(address creator_, address factory_, address mine_, address eco_, address team_, address market_, address liqudity_, address seed_, address contribution_, address private_, address public_, address lbp_) external initializer { __Context_init_unchained(); __ERC20_init_unchained("BlackHole.BLACK Governance Token", "BLACK"); __MappableToken_init_unchained(factory_, creator_); __BLACK_init_unchained(mine_, eco_, team_, market_, liqudity_, seed_, contribution_, private_, public_, lbp_); } function __BLACK_init_unchained(address mine_, address eco_, address team_, address market_, address liqudity_, address seed_, address contribution_, address private_, address public_, address lbp_) public initializer { _mint(mine_, 50_000_000 * 10 ** uint256(decimals())); _mint(eco_, 10_000_000 * 10 ** uint256(decimals())); _mint(team_, 10_000_000 * 10 ** uint256(decimals())); _mint(market_, 5_000_000 * 10 ** uint256(decimals())); _mint(liqudity_, 5_000_000 * 10 ** uint256(decimals())); _mint(seed_, 5_000_000 * 10 ** uint256(decimals())); _mint(contribution_, 10_000_000 * 10 ** uint256(decimals())); _mint(private_, 1_000_000 * 10 ** uint256(decimals())); _mint(public_, 1_000_000 * 10 ** uint256(decimals())); _mint(lbp_, 3_000_000 * 10 ** uint256(decimals())); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"uint256","name":"fromChainId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"volume","type":"uint256"},{"indexed":true,"internalType":"address","name":"signatory","type":"address"}],"name":"Authorize","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":"ChargeFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signatory","type":"address"},{"indexed":false,"internalType":"uint256","name":"decrement","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quota","type":"uint256"}],"name":"DecreaseAuthQuota","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signatory","type":"address"},{"indexed":false,"internalType":"uint256","name":"increment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quota","type":"uint256"}],"name":"IncreaseAuthQuota","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromChainId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"volume","type":"uint256"}],"name":"Receive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"toChainId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"volume","type":"uint256"}],"name":"Send","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"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RECEIVE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator_","type":"address"},{"internalType":"address","name":"factory_","type":"address"},{"internalType":"address","name":"mine_","type":"address"},{"internalType":"address","name":"eco_","type":"address"},{"internalType":"address","name":"team_","type":"address"},{"internalType":"address","name":"market_","type":"address"},{"internalType":"address","name":"liqudity_","type":"address"},{"internalType":"address","name":"seed_","type":"address"},{"internalType":"address","name":"contribution_","type":"address"},{"internalType":"address","name":"private_","type":"address"},{"internalType":"address","name":"public_","type":"address"},{"internalType":"address","name":"lbp_","type":"address"}],"name":"__BLACK_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mine_","type":"address"},{"internalType":"address","name":"eco_","type":"address"},{"internalType":"address","name":"team_","type":"address"},{"internalType":"address","name":"market_","type":"address"},{"internalType":"address","name":"liqudity_","type":"address"},{"internalType":"address","name":"seed_","type":"address"},{"internalType":"address","name":"contribution_","type":"address"},{"internalType":"address","name":"private_","type":"address"},{"internalType":"address","name":"public_","type":"address"},{"internalType":"address","name":"lbp_","type":"address"}],"name":"__BLACK_init_unchained","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"factory_","type":"address"},{"internalType":"address","name":"creator_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"}],"name":"__MappableToken_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"factory_","type":"address"},{"internalType":"address","name":"creator_","type":"address"}],"name":"__MappableToken_init_unchained","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authQuotaOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"signatory","type":"address"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"decreaseAuthQuota","outputs":[{"internalType":"uint256","name":"quota","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"signatorys","type":"address[]"},{"internalType":"uint256[]","name":"decrements","type":"uint256[]"}],"name":"decreaseAuthQuotas","outputs":[{"internalType":"uint256[]","name":"quotas","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"signatory","type":"address"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"increaseAuthQuota","outputs":[{"internalType":"uint256","name":"quota","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"signatorys","type":"address[]"},{"internalType":"uint256[]","name":"increments","type":"uint256[]"}],"name":"increaseAuthQuotas","outputs":[{"internalType":"uint256[]","name":"quotas","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mainChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"needApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromChainId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"volume","type":"uint256"},{"components":[{"internalType":"address","name":"signatory","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Signature[]","name":"signatures","type":"tuple[]"}],"name":"receive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"received","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"volume","type":"uint256"}],"name":"send","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"volume","type":"uint256"}],"name":"sendFrom","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"sent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"sentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMapped","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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"}]
Contract Creation Code
608060405234801561001057600080fd5b50612d13806100206000396000f3fe6080604052600436106102255760003560e01c806370a0823111610123578063a653d60c116100ab578063dd62ed3e1161006f578063dd62ed3e146105ed578063df735d621461060d578063fc0c546a1461062d578063fe57a69114610642578063ff70f4081461066257610225565b8063a653d60c14610570578063a9059cbb14610583578063c45a0155146105a3578063d505accf146105b8578063dc51b6ac146105d857610225565b806381b34f15116100f257806381b34f15146104f3578063829009341461050657806395d89b411461051b578063a25d7c8614610530578063a457c2d71461055057610225565b806370a082311461047357806375986b50146104935780637a62f5c6146104b35780637ecebe00146104d357610225565b80632186ff4e116101b15780633644e515116101755780633644e515146103e957806339509351146103fe5780635d3b5f801461041e5780636489aba5146104335780636a2d2b0e1461045357610225565b80632186ff4e1461035f57806323b872dd1461037f5780632c4a952b1461039f57806330adf81f146103b2578063313ce567146103c757610225565b80630f45ad43116101f85780630f45ad43146102d15780630fba758d146102e657806318160ddd146103085780631e86c2ac1461031d57806320606b701461034a57610225565b806302d05d3f1461022a57806306fdde0314610255578063095ea7b3146102775780630c0f261e146102a4575b600080fd5b34801561023657600080fd5b5061023f610682565b60405161024c91906126fb565b60405180910390f35b34801561026157600080fd5b5061026a610691565b60405161024c9190612811565b34801561028357600080fd5b50610297610292366004612474565b610727565b60405161024c9190612753565b3480156102b057600080fd5b506102c46102bf366004612127565b610745565b60405161024c919061275e565b3480156102dd57600080fd5b506102c4610757565b3480156102f257600080fd5b50610306610301366004612142565b61075d565b005b34801561031457600080fd5b506102c461089f565b34801561032957600080fd5b5061033d6103383660046124e3565b6108a5565b60405161024c919061270f565b34801561035657600080fd5b506102c461096f565b34801561036b57600080fd5b506102c461037a3660046125e0565b610993565b34801561038b57600080fd5b5061029761039a3660046123c8565b6109b6565b6102c46103ad36600461249e565b610aae565b3480156103be57600080fd5b506102c4610b5a565b3480156103d357600080fd5b506103dc610b7e565b60405161024c9190612c00565b3480156103f557600080fd5b506102c4610b87565b34801561040a57600080fd5b50610297610419366004612474565b610b96565b34801561042a57600080fd5b50610297610be4565b34801561043f57600080fd5b506102c461044e366004612474565b610be9565b34801561045f57600080fd5b5061030661046e366004612239565b610c4d565b34801561047f57600080fd5b506102c461048e366004612127565b610d5c565b34801561049f57600080fd5b506102c46104ae3660046125e0565b610d77565b3480156104bf57600080fd5b506102c46104ce366004612474565b610d9a565b3480156104df57600080fd5b506102c46104ee366004612127565b610e49565b6102c46105013660046125e0565b610e5b565b34801561051257600080fd5b506102c4610e78565b34801561052757600080fd5b5061026a610e9c565b34801561053c57600080fd5b5061033d61054b3660046124e3565b610efd565b34801561055c57600080fd5b5061029761056b366004612474565b610fc0565b61030661057e366004612615565b611028565b34801561058f57600080fd5b5061029761059e366004612474565b611448565b3480156105af57600080fd5b5061023f61145c565b3480156105c457600080fd5b506103066105d3366004612408565b61146b565b3480156105e457600080fd5b506102c46115de565b3480156105f957600080fd5b506102c4610608366004612142565b6115e9565b34801561061957600080fd5b50610306610628366004612320565b611614565b34801561063957600080fd5b5061023f6116cc565b34801561064e57600080fd5b506102c461065d3660046125bd565b6116db565b34801561066e57600080fd5b5061030661067d366004612176565b6116f8565b60ce546001600160a01b031681565b609b8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b5050505050905090565b600061073b61073461184e565b8484611852565b5060015b92915050565b60cf6020526000908152604090205481565b60cc5481565b603354610100900460ff1680610776575061077661185d565b80610784575060335460ff16155b6107a95760405162461bcd60e51b81526004016107a090612a7d565b60405180910390fd5b603354610100900460ff161580156107d4576033805460ff1961ff0019909116610100171660011790555b60cb80546001600160a01b0319166001600160a01b0385161790556107f7611863565b60cc5560cd80546001600160a01b031990811690915560ce80549091166001600160a01b0384161790557f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86661084a610691565b80519060200120610859611863565b3060405160200161086d949392919061279b565b60408051601f19818403018152919052805160209091012060ca55801561089a576033805461ff00191690555b505050565b609a5490565b606081518351146108c85760405162461bcd60e51b81526004016107a090612acb565b825167ffffffffffffffff811180156108e057600080fd5b5060405190808252806020026020018201604052801561090a578160200160208202803683370190505b50905060005b83518110156109685761094984828151811061092857fe5b602002602001015184838151811061093c57fe5b6020026020010151610d9a565b82828151811061095557fe5b6020908102919091010152600101610910565b5092915050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60d260209081526000938452604080852082529284528284209052825290205481565b60006109c3848484611867565b6109cb61184e565b6001600160a01b0316846001600160a01b031614158015610a2f57506001600160a01b038416600090815260996020526040812060001991610a0b61184e565b6001600160a01b03166001600160a01b031681526020019081526020016000205414155b15610aa457610aa484610a4061184e565b610a9f85604051806060016040528060288152602001612c91602891396001600160a01b038a16600090815260996020526040812090610a7e61184e565b6001600160a01b031681526020810191909152604001600020549190611989565b611852565b5060019392505050565b6000610ab86119b5565b610ac28583611b8c565b50600083815260d0602090815260408083206001600160a01b0380871680865291845282852080546001810190915588865260d1855283862083875285528386208187529094529382902085905590519192909186918816907f882df69720ac5a9356b84d2aaa32d0c105b24cab60e885ba3d69b77090ff05c690610b4a9086908890612bf2565b60405180910390a4949350505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b609d5460ff1690565b6000610b91611b97565b905090565b600061073b610ba361184e565b84610a9f8560996000610bb461184e565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611b9d565b600090565b60cb546000906001600160a01b03163314610c165760405162461bcd60e51b81526004016107a090612b8b565b506001600160a01b038216600090815260cf602052604090205481811015610c3c578091505b610c468383611bc2565b9392505050565b603354610100900460ff1680610c665750610c6661185d565b80610c74575060335460ff16155b610c905760405162461bcd60e51b81526004016107a090612a7d565b603354610100900460ff16158015610cbb576033805460ff1961ff0019909116610100171660011790555b610cc3611c36565b610d1f6040518060400160405280602081526020017f426c61636b486f6c652e424c41434b20476f7665726e616e636520546f6b656e81525060405180604001604052806005815260200164424c41434b60d81b815250611cb9565b610d298c8e61075d565b610d3b8b8b8b8b8b8b8b8b8b8b6116f8565b8015610d4d576033805461ff00191690555b50505050505050505050505050565b6001600160a01b031660009081526098602052604090205490565b60d160209081526000938452604080852082529284528284209052825290205481565b60cb546000906001600160a01b03163314610dc75760405162461bcd60e51b81526004016107a090612b8b565b6001600160a01b038316600090815260cf6020526040902054610dea9083611b9d565b6001600160a01b038416600081815260cf60205260409081902083905551919250907f82c1124ee47307c0e1b36269db77162e01d791c0847be46c4c382c3904a36b6990610e3b9085908590612bf2565b60405180910390a292915050565b60006020819052908152604090205481565b6000610e70610e6861184e565b858585610aae565b949350505050565b7f8452bf83368fd24f930388bb8032e83547faee72dbe22b73045150c5e682d66281565b609c8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561071d5780601f106106f25761010080835404028352916020019161071d565b60608151835114610f205760405162461bcd60e51b81526004016107a090612acb565b825167ffffffffffffffff81118015610f3857600080fd5b50604051908082528060200260200182016040528015610f62578160200160208202803683370190505b50905060005b835181101561096857610fa1848281518110610f8057fe5b6020026020010151848381518110610f9457fe5b6020026020010151610be9565b828281518110610fad57fe5b6020908102919091010152600101610f68565b600061073b610fcd61184e565b84610a9f85604051806060016040528060258152602001612cb96025913960996000610ff761184e565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611989565b6110306119b5565b600085815260d2602090815260408083206001600160a01b03881684528252808320868452909152902054156110785760405162461bcd60e51b81526004016107a090612a2c565b805160cb54604051636dd5b69d60e01b81526001600160a01b0390911690636dd5b69d906110ba906c6d696e5369676e61747572657360981b9060040161275e565b60206040518083038186803b1580156110d257600080fd5b505afa1580156110e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110a91906125a5565b8110156111295760405162461bcd60e51b81526004016107a0906128d2565b60005b818110156113c55760005b818110156111a75783818151811061114b57fe5b6020026020010151600001516001600160a01b031684838151811061116c57fe5b6020026020010151600001516001600160a01b0316141561119f5760405162461bcd60e51b81526004016107a09061299f565b600101611137565b5060007f8452bf83368fd24f930388bb8032e83547faee72dbe22b73045150c5e682d662888888888887815181106111db57fe5b6020026020010151600001516040516020016111fc969594939291906127bf565b604051602081830303815290604052805190602001209050600060ca548260405160200161122b9291906126e0565b604051602081830303815290604052805190602001209050600060018287868151811061125457fe5b60200260200101516020015188878151811061126c57fe5b60200260200101516040015189888151811061128457fe5b602002602001015160600151604051600081526020016040526040516112ad94939291906127f3565b6020604051602081039080840390855afa1580156112cf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113025760405162461bcd60e51b81526004016107a0906128a7565b85848151811061130e57fe5b6020026020010151600001516001600160a01b0316816001600160a01b03161461134a5760405162461bcd60e51b81526004016107a090612a57565b61136b86858151811061135957fe5b60200260200101516000015188611bc2565b50806001600160a01b0316888a6001600160a01b03167fc1eec22a7978d1b4b28441f2aaf2119e35d06f3aaff9a37f1b64cec88c1ab28b8d8b6040516113b2929190612bf2565b60405180910390a450505060010161112c565b50600086815260d2602090815260408083206001600160a01b0389168452825280832087845290915290208390556113fd8584611d72565b83856001600160a01b0316877fa67d828453163879637ade5a7d51abb746669dbc34d7e2149e8fec3bf71fff5486604051611438919061275e565b60405180910390a4505050505050565b600061073b61145561184e565b8484611867565b60cb546001600160a01b031681565b4284101561148b5760405162461bcd60e51b81526004016107a090612a04565b6000611495610b87565b6001600160a01b0389166000908152602081815260409182902080546001810190915591516114f0927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d9290918d9101612767565b604051602081830303815290604052805190602001206040516020016115179291906126e0565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161155494939291906127f3565b6020604051602081039080840390855afa158015611576573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906115ac5750886001600160a01b0316816001600160a01b0316145b6115c85760405162461bcd60e51b81526004016107a0906129cd565b6115d3898989611852565b505050505050505050565b6000610b9130610d5c565b6001600160a01b03918216600090815260996020908152604080832093909416825291909152205490565b603354610100900460ff168061162d575061162d61185d565b8061163b575060335460ff16155b6116575760405162461bcd60e51b81526004016107a090612a7d565b603354610100900460ff16158015611682576033805460ff1961ff0019909116610100171660011790555b61168a611c36565b6116948585611cb9565b61169d83611d81565b6116a78683611d97565b6116b1878761075d565b80156116c3576033805461ff00191690555b50505050505050565b60cd546001600160a01b031681565b60d060209081526000928352604080842090915290825290205481565b603354610100900460ff1680611711575061171161185d565b8061171f575060335460ff16155b61173b5760405162461bcd60e51b81526004016107a090612a7d565b603354610100900460ff16158015611766576033805460ff1961ff0019909116610100171660011790555b6117838b611772610b7e565b60ff16600a0a6302faf08002611d97565b61179f8a61178f610b7e565b60ff16600a0a6298968002611d97565b6117ab8961178f610b7e565b6117c7886117b7610b7e565b60ff16600a0a624c4b4002611d97565b6117d3876117b7610b7e565b6117df866117b7610b7e565b6117eb8561178f610b7e565b611807846117f7610b7e565b60ff16600a0a620f424002611d97565b611813836117f7610b7e565b61182f8261181f610b7e565b60ff16600a0a622dc6c002611d97565b8015611841576033805461ff00191690555b5050505050505050505050565b3390565b61089a838383611e57565b303b1590565b4690565b6001600160a01b03831661188d5760405162461bcd60e51b81526004016107a090612b02565b6001600160a01b0382166118b35760405162461bcd60e51b81526004016107a090612864565b6118be83838361089a565b6118fb81604051806060016040528060268152602001612c6b602691396001600160a01b0386166000908152609860205260409020549190611989565b6001600160a01b03808516600090815260986020526040808220939093559084168152205461192a9082611b9d565b6001600160a01b0380841660008181526098602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061197c90859061275e565b60405180910390a3505050565b600081848411156119ad5760405162461bcd60e51b81526004016107a09190612811565b505050900390565b60cb54604051636dd5b69d60e01b81526001600160a01b0390911690636dd5b69d906119eb906266656560e81b9060040161275e565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906125a5565b341015611a5a5760405162461bcd60e51b81526004016107a090612977565b60cb54604051636dd5b69d60e01b81526000916001600160a01b031690636dd5b69d90611a939064666565546f60d81b9060040161275e565b60206040518083038186803b158015611aab57600080fd5b505afa158015611abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae391906125a5565b90506001600160a01b038116611b01575060cb546001600160a01b03165b6040516001600160a01b038216903480156108fc02916000818181858888f19350505050158015611b36573d6000803e3d6000fd5b50806001600160a01b0316611b4961184e565b6001600160a01b03167fc0d39cf3434f9dede81e427dbbccd901073df1b746711cb6cb7db1b27ddd692734604051611b81919061275e565b60405180910390a350565b61089a8230836109b6565b60ca5490565b600082820183811015610c465760405162461bcd60e51b81526004016107a090612940565b6001600160a01b038216600090815260cf6020526040812054611be59083611efe565b6001600160a01b038416600081815260cf60205260409081902083905551919250907f90306653b3fe6cfd6b56d472373de671e8ded7dc29635ab2b328e491f4b5551590610e3b9085908590612bf2565b603354610100900460ff1680611c4f5750611c4f61185d565b80611c5d575060335460ff16155b611c795760405162461bcd60e51b81526004016107a090612a7d565b603354610100900460ff16158015611ca4576033805460ff1961ff0019909116610100171660011790555b8015611cb6576033805461ff00191690555b50565b603354610100900460ff1680611cd25750611cd261185d565b80611ce0575060335460ff16155b611cfc5760405162461bcd60e51b81526004016107a090612a7d565b603354610100900460ff16158015611d27576033805460ff1961ff0019909116610100171660011790555b8251611d3a90609b906020860190611f40565b508151611d4e90609c906020850190611f40565b50609d805460ff19166012179055801561089a576033805461ff0019169055505050565b611d7d308383611867565b5050565b609d805460ff191660ff92909216919091179055565b6001600160a01b038216611dbd5760405162461bcd60e51b81526004016107a090612bbb565b611dc96000838361089a565b609a54611dd69082611b9d565b609a556001600160a01b038216600090815260986020526040902054611dfc9082611b9d565b6001600160a01b0383166000818152609860205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e4b90859061275e565b60405180910390a35050565b6001600160a01b038316611e7d5760405162461bcd60e51b81526004016107a090612b47565b6001600160a01b038216611ea35760405162461bcd60e51b81526004016107a0906128fe565b6001600160a01b0380841660008181526099602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061197c90859061275e565b6000610c4683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611989565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611f8157805160ff1916838001178555611fae565b82800160010185558215611fae579182015b82811115611fae578251825591602001919060010190611f93565b50611fba929150611fbe565b5090565b5b80821115611fba5760008155600101611fbf565b80356001600160a01b038116811461073f57600080fd5b600082601f830112611ffa578081fd5b813561200d61200882612c35565b612c0e565b81815291506020808301908481018184028601820187101561202e57600080fd5b60005b8481101561204d57813584529282019290820190600101612031565b505050505092915050565b600082601f830112612068578081fd5b813567ffffffffffffffff81111561207e578182fd5b612091601f8201601f1916602001612c0e565b91508082528360208285010111156120a857600080fd5b8060208401602084013760009082016020015292915050565b6000608082840312156120d2578081fd5b6120dc6080612c0e565b90506120e88383611fd3565b81526120f78360208401612116565b6020820152604082013560408201526060820135606082015292915050565b803560ff8116811461073f57600080fd5b600060208284031215612138578081fd5b610c468383611fd3565b60008060408385031215612154578081fd5b61215e8484611fd3565b915061216d8460208501611fd3565b90509250929050565b6000806000806000806000806000806101408b8d031215612195578586fd5b61219f8c8c611fd3565b99506121ae8c60208d01611fd3565b98506121bd8c60408d01611fd3565b97506121cc8c60608d01611fd3565b96506121db8c60808d01611fd3565b95506121ea8c60a08d01611fd3565b94506121f98c60c08d01611fd3565b93506122088c60e08d01611fd3565b92506122188c6101008d01611fd3565b91506122288c6101208d01611fd3565b90509295989b9194979a5092959850565b6000806000806000806000806000806000806101808d8f03121561225b578081fd5b6122658e8e611fd3565b9b506122748e60208f01611fd3565b9a506122838e60408f01611fd3565b99506122928e60608f01611fd3565b98506122a18e60808f01611fd3565b97506122b08e60a08f01611fd3565b96506122bf8e60c08f01611fd3565b95506122ce8e60e08f01611fd3565b94506122de8e6101008f01611fd3565b93506122ee8e6101208f01611fd3565b92506122fe8e6101408f01611fd3565b915061230e8e6101608f01611fd3565b90509295989b509295989b509295989b565b60008060008060008060c08789031215612338578182fd5b863561234381612c55565b9550602087013561235381612c55565b9450604087013567ffffffffffffffff8082111561236f578384fd5b61237b8a838b01612058565b95506060890135915080821115612390578384fd5b5061239d89828a01612058565b935050608087013560ff811681146123b3578283fd5b8092505060a087013590509295509295509295565b6000806000606084860312156123dc578081fd5b83356123e781612c55565b925060208401356123f781612c55565b929592945050506040919091013590565b600080600080600080600060e0888a031215612422578081fd5b61242c8989611fd3565b965061243b8960208a01611fd3565b955060408801359450606088013593506124588960808a01612116565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612486578182fd5b6124908484611fd3565b946020939093013593505050565b600080600080608085870312156124b3578182fd5b6124bd8686611fd3565b9350602085013592506124d38660408701611fd3565b9396929550929360600135925050565b600080604083850312156124f5578182fd5b823567ffffffffffffffff8082111561250c578384fd5b818501915085601f83011261251f578384fd5b813561252d61200882612c35565b80828252602080830192508086018a82838702890101111561254d578889fd5b8896505b84871015612577576125638b82611fd3565b845260019690960195928101928101612551565b50909650870135935050508082111561258e578283fd5b5061259b85828601611fea565b9150509250929050565b6000602082840312156125b6578081fd5b5051919050565b600080604083850312156125cf578182fd5b8235915061216d8460208501611fd3565b6000806000606084860312156125f4578081fd5b833592506126058560208601611fd3565b9150604084013590509250925092565b600080600080600060a0868803121561262c578283fd5b85359450602061263e88828901611fd3565b9450604087013593506060870135925060808088013567ffffffffffffffff811115612668578384fd5b8801601f81018a13612678578384fd5b803561268661200882612c35565b81815284810190838601858402850187018e10156126a2578788fd5b8794505b838510156126cc576126b88e826120c1565b8352600194909401939186019185016126a6565b508096505050505050509295509295909350565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b818110156127475783518352928401929184019160010161272b565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b95865260208601949094526001600160a01b039283166040860152606085019190915260808401521660a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b8181101561283d57858101830151858201604001528201612821565b8181111561284e5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260119082015270696e76616c6964207369676e617475726560781b604082015260600190565b602080825260129082015271746f6f20666577207369676e61747572657360701b604082015260600190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600e908201526d66656520697320746f6f206c6f7760901b604082015260600190565b60208082526014908201527372657065746974697665207369676e61746f727960601b604082015260600190565b60208082526018908201527f7065726d697420494e56414c49445f5349474e41545552450000000000000000604082015260600190565b6020808252600e908201526d1c195c9b5a5d081156141254915160921b604082015260600190565b60208082526011908201527077697468647261776e20616c726561647960781b604082015260600190565b6020808252600c908201526b1d5b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526019908201527f74776f206172726179206c656e7468206e6f7420657175616c00000000000000604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601690820152754f6e6c792063616c6c656420627920466163746f727960501b604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715612c2d57600080fd5b604052919050565b600067ffffffffffffffff821115612c4b578081fd5b5060209081020190565b6001600160a01b0381168114611cb657600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207e9f342664c32e4366c927e5b01528a85c82cccc4d6baff3cc08ae81331e74cf64736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106102255760003560e01c806370a0823111610123578063a653d60c116100ab578063dd62ed3e1161006f578063dd62ed3e146105ed578063df735d621461060d578063fc0c546a1461062d578063fe57a69114610642578063ff70f4081461066257610225565b8063a653d60c14610570578063a9059cbb14610583578063c45a0155146105a3578063d505accf146105b8578063dc51b6ac146105d857610225565b806381b34f15116100f257806381b34f15146104f3578063829009341461050657806395d89b411461051b578063a25d7c8614610530578063a457c2d71461055057610225565b806370a082311461047357806375986b50146104935780637a62f5c6146104b35780637ecebe00146104d357610225565b80632186ff4e116101b15780633644e515116101755780633644e515146103e957806339509351146103fe5780635d3b5f801461041e5780636489aba5146104335780636a2d2b0e1461045357610225565b80632186ff4e1461035f57806323b872dd1461037f5780632c4a952b1461039f57806330adf81f146103b2578063313ce567146103c757610225565b80630f45ad43116101f85780630f45ad43146102d15780630fba758d146102e657806318160ddd146103085780631e86c2ac1461031d57806320606b701461034a57610225565b806302d05d3f1461022a57806306fdde0314610255578063095ea7b3146102775780630c0f261e146102a4575b600080fd5b34801561023657600080fd5b5061023f610682565b60405161024c91906126fb565b60405180910390f35b34801561026157600080fd5b5061026a610691565b60405161024c9190612811565b34801561028357600080fd5b50610297610292366004612474565b610727565b60405161024c9190612753565b3480156102b057600080fd5b506102c46102bf366004612127565b610745565b60405161024c919061275e565b3480156102dd57600080fd5b506102c4610757565b3480156102f257600080fd5b50610306610301366004612142565b61075d565b005b34801561031457600080fd5b506102c461089f565b34801561032957600080fd5b5061033d6103383660046124e3565b6108a5565b60405161024c919061270f565b34801561035657600080fd5b506102c461096f565b34801561036b57600080fd5b506102c461037a3660046125e0565b610993565b34801561038b57600080fd5b5061029761039a3660046123c8565b6109b6565b6102c46103ad36600461249e565b610aae565b3480156103be57600080fd5b506102c4610b5a565b3480156103d357600080fd5b506103dc610b7e565b60405161024c9190612c00565b3480156103f557600080fd5b506102c4610b87565b34801561040a57600080fd5b50610297610419366004612474565b610b96565b34801561042a57600080fd5b50610297610be4565b34801561043f57600080fd5b506102c461044e366004612474565b610be9565b34801561045f57600080fd5b5061030661046e366004612239565b610c4d565b34801561047f57600080fd5b506102c461048e366004612127565b610d5c565b34801561049f57600080fd5b506102c46104ae3660046125e0565b610d77565b3480156104bf57600080fd5b506102c46104ce366004612474565b610d9a565b3480156104df57600080fd5b506102c46104ee366004612127565b610e49565b6102c46105013660046125e0565b610e5b565b34801561051257600080fd5b506102c4610e78565b34801561052757600080fd5b5061026a610e9c565b34801561053c57600080fd5b5061033d61054b3660046124e3565b610efd565b34801561055c57600080fd5b5061029761056b366004612474565b610fc0565b61030661057e366004612615565b611028565b34801561058f57600080fd5b5061029761059e366004612474565b611448565b3480156105af57600080fd5b5061023f61145c565b3480156105c457600080fd5b506103066105d3366004612408565b61146b565b3480156105e457600080fd5b506102c46115de565b3480156105f957600080fd5b506102c4610608366004612142565b6115e9565b34801561061957600080fd5b50610306610628366004612320565b611614565b34801561063957600080fd5b5061023f6116cc565b34801561064e57600080fd5b506102c461065d3660046125bd565b6116db565b34801561066e57600080fd5b5061030661067d366004612176565b6116f8565b60ce546001600160a01b031681565b609b8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b5050505050905090565b600061073b61073461184e565b8484611852565b5060015b92915050565b60cf6020526000908152604090205481565b60cc5481565b603354610100900460ff1680610776575061077661185d565b80610784575060335460ff16155b6107a95760405162461bcd60e51b81526004016107a090612a7d565b60405180910390fd5b603354610100900460ff161580156107d4576033805460ff1961ff0019909116610100171660011790555b60cb80546001600160a01b0319166001600160a01b0385161790556107f7611863565b60cc5560cd80546001600160a01b031990811690915560ce80549091166001600160a01b0384161790557f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86661084a610691565b80519060200120610859611863565b3060405160200161086d949392919061279b565b60408051601f19818403018152919052805160209091012060ca55801561089a576033805461ff00191690555b505050565b609a5490565b606081518351146108c85760405162461bcd60e51b81526004016107a090612acb565b825167ffffffffffffffff811180156108e057600080fd5b5060405190808252806020026020018201604052801561090a578160200160208202803683370190505b50905060005b83518110156109685761094984828151811061092857fe5b602002602001015184838151811061093c57fe5b6020026020010151610d9a565b82828151811061095557fe5b6020908102919091010152600101610910565b5092915050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60d260209081526000938452604080852082529284528284209052825290205481565b60006109c3848484611867565b6109cb61184e565b6001600160a01b0316846001600160a01b031614158015610a2f57506001600160a01b038416600090815260996020526040812060001991610a0b61184e565b6001600160a01b03166001600160a01b031681526020019081526020016000205414155b15610aa457610aa484610a4061184e565b610a9f85604051806060016040528060288152602001612c91602891396001600160a01b038a16600090815260996020526040812090610a7e61184e565b6001600160a01b031681526020810191909152604001600020549190611989565b611852565b5060019392505050565b6000610ab86119b5565b610ac28583611b8c565b50600083815260d0602090815260408083206001600160a01b0380871680865291845282852080546001810190915588865260d1855283862083875285528386208187529094529382902085905590519192909186918816907f882df69720ac5a9356b84d2aaa32d0c105b24cab60e885ba3d69b77090ff05c690610b4a9086908890612bf2565b60405180910390a4949350505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b609d5460ff1690565b6000610b91611b97565b905090565b600061073b610ba361184e565b84610a9f8560996000610bb461184e565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611b9d565b600090565b60cb546000906001600160a01b03163314610c165760405162461bcd60e51b81526004016107a090612b8b565b506001600160a01b038216600090815260cf602052604090205481811015610c3c578091505b610c468383611bc2565b9392505050565b603354610100900460ff1680610c665750610c6661185d565b80610c74575060335460ff16155b610c905760405162461bcd60e51b81526004016107a090612a7d565b603354610100900460ff16158015610cbb576033805460ff1961ff0019909116610100171660011790555b610cc3611c36565b610d1f6040518060400160405280602081526020017f426c61636b486f6c652e424c41434b20476f7665726e616e636520546f6b656e81525060405180604001604052806005815260200164424c41434b60d81b815250611cb9565b610d298c8e61075d565b610d3b8b8b8b8b8b8b8b8b8b8b6116f8565b8015610d4d576033805461ff00191690555b50505050505050505050505050565b6001600160a01b031660009081526098602052604090205490565b60d160209081526000938452604080852082529284528284209052825290205481565b60cb546000906001600160a01b03163314610dc75760405162461bcd60e51b81526004016107a090612b8b565b6001600160a01b038316600090815260cf6020526040902054610dea9083611b9d565b6001600160a01b038416600081815260cf60205260409081902083905551919250907f82c1124ee47307c0e1b36269db77162e01d791c0847be46c4c382c3904a36b6990610e3b9085908590612bf2565b60405180910390a292915050565b60006020819052908152604090205481565b6000610e70610e6861184e565b858585610aae565b949350505050565b7f8452bf83368fd24f930388bb8032e83547faee72dbe22b73045150c5e682d66281565b609c8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561071d5780601f106106f25761010080835404028352916020019161071d565b60608151835114610f205760405162461bcd60e51b81526004016107a090612acb565b825167ffffffffffffffff81118015610f3857600080fd5b50604051908082528060200260200182016040528015610f62578160200160208202803683370190505b50905060005b835181101561096857610fa1848281518110610f8057fe5b6020026020010151848381518110610f9457fe5b6020026020010151610be9565b828281518110610fad57fe5b6020908102919091010152600101610f68565b600061073b610fcd61184e565b84610a9f85604051806060016040528060258152602001612cb96025913960996000610ff761184e565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611989565b6110306119b5565b600085815260d2602090815260408083206001600160a01b03881684528252808320868452909152902054156110785760405162461bcd60e51b81526004016107a090612a2c565b805160cb54604051636dd5b69d60e01b81526001600160a01b0390911690636dd5b69d906110ba906c6d696e5369676e61747572657360981b9060040161275e565b60206040518083038186803b1580156110d257600080fd5b505afa1580156110e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110a91906125a5565b8110156111295760405162461bcd60e51b81526004016107a0906128d2565b60005b818110156113c55760005b818110156111a75783818151811061114b57fe5b6020026020010151600001516001600160a01b031684838151811061116c57fe5b6020026020010151600001516001600160a01b0316141561119f5760405162461bcd60e51b81526004016107a09061299f565b600101611137565b5060007f8452bf83368fd24f930388bb8032e83547faee72dbe22b73045150c5e682d662888888888887815181106111db57fe5b6020026020010151600001516040516020016111fc969594939291906127bf565b604051602081830303815290604052805190602001209050600060ca548260405160200161122b9291906126e0565b604051602081830303815290604052805190602001209050600060018287868151811061125457fe5b60200260200101516020015188878151811061126c57fe5b60200260200101516040015189888151811061128457fe5b602002602001015160600151604051600081526020016040526040516112ad94939291906127f3565b6020604051602081039080840390855afa1580156112cf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113025760405162461bcd60e51b81526004016107a0906128a7565b85848151811061130e57fe5b6020026020010151600001516001600160a01b0316816001600160a01b03161461134a5760405162461bcd60e51b81526004016107a090612a57565b61136b86858151811061135957fe5b60200260200101516000015188611bc2565b50806001600160a01b0316888a6001600160a01b03167fc1eec22a7978d1b4b28441f2aaf2119e35d06f3aaff9a37f1b64cec88c1ab28b8d8b6040516113b2929190612bf2565b60405180910390a450505060010161112c565b50600086815260d2602090815260408083206001600160a01b0389168452825280832087845290915290208390556113fd8584611d72565b83856001600160a01b0316877fa67d828453163879637ade5a7d51abb746669dbc34d7e2149e8fec3bf71fff5486604051611438919061275e565b60405180910390a4505050505050565b600061073b61145561184e565b8484611867565b60cb546001600160a01b031681565b4284101561148b5760405162461bcd60e51b81526004016107a090612a04565b6000611495610b87565b6001600160a01b0389166000908152602081815260409182902080546001810190915591516114f0927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d9290918d9101612767565b604051602081830303815290604052805190602001206040516020016115179291906126e0565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161155494939291906127f3565b6020604051602081039080840390855afa158015611576573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906115ac5750886001600160a01b0316816001600160a01b0316145b6115c85760405162461bcd60e51b81526004016107a0906129cd565b6115d3898989611852565b505050505050505050565b6000610b9130610d5c565b6001600160a01b03918216600090815260996020908152604080832093909416825291909152205490565b603354610100900460ff168061162d575061162d61185d565b8061163b575060335460ff16155b6116575760405162461bcd60e51b81526004016107a090612a7d565b603354610100900460ff16158015611682576033805460ff1961ff0019909116610100171660011790555b61168a611c36565b6116948585611cb9565b61169d83611d81565b6116a78683611d97565b6116b1878761075d565b80156116c3576033805461ff00191690555b50505050505050565b60cd546001600160a01b031681565b60d060209081526000928352604080842090915290825290205481565b603354610100900460ff1680611711575061171161185d565b8061171f575060335460ff16155b61173b5760405162461bcd60e51b81526004016107a090612a7d565b603354610100900460ff16158015611766576033805460ff1961ff0019909116610100171660011790555b6117838b611772610b7e565b60ff16600a0a6302faf08002611d97565b61179f8a61178f610b7e565b60ff16600a0a6298968002611d97565b6117ab8961178f610b7e565b6117c7886117b7610b7e565b60ff16600a0a624c4b4002611d97565b6117d3876117b7610b7e565b6117df866117b7610b7e565b6117eb8561178f610b7e565b611807846117f7610b7e565b60ff16600a0a620f424002611d97565b611813836117f7610b7e565b61182f8261181f610b7e565b60ff16600a0a622dc6c002611d97565b8015611841576033805461ff00191690555b5050505050505050505050565b3390565b61089a838383611e57565b303b1590565b4690565b6001600160a01b03831661188d5760405162461bcd60e51b81526004016107a090612b02565b6001600160a01b0382166118b35760405162461bcd60e51b81526004016107a090612864565b6118be83838361089a565b6118fb81604051806060016040528060268152602001612c6b602691396001600160a01b0386166000908152609860205260409020549190611989565b6001600160a01b03808516600090815260986020526040808220939093559084168152205461192a9082611b9d565b6001600160a01b0380841660008181526098602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061197c90859061275e565b60405180910390a3505050565b600081848411156119ad5760405162461bcd60e51b81526004016107a09190612811565b505050900390565b60cb54604051636dd5b69d60e01b81526001600160a01b0390911690636dd5b69d906119eb906266656560e81b9060040161275e565b60206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906125a5565b341015611a5a5760405162461bcd60e51b81526004016107a090612977565b60cb54604051636dd5b69d60e01b81526000916001600160a01b031690636dd5b69d90611a939064666565546f60d81b9060040161275e565b60206040518083038186803b158015611aab57600080fd5b505afa158015611abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae391906125a5565b90506001600160a01b038116611b01575060cb546001600160a01b03165b6040516001600160a01b038216903480156108fc02916000818181858888f19350505050158015611b36573d6000803e3d6000fd5b50806001600160a01b0316611b4961184e565b6001600160a01b03167fc0d39cf3434f9dede81e427dbbccd901073df1b746711cb6cb7db1b27ddd692734604051611b81919061275e565b60405180910390a350565b61089a8230836109b6565b60ca5490565b600082820183811015610c465760405162461bcd60e51b81526004016107a090612940565b6001600160a01b038216600090815260cf6020526040812054611be59083611efe565b6001600160a01b038416600081815260cf60205260409081902083905551919250907f90306653b3fe6cfd6b56d472373de671e8ded7dc29635ab2b328e491f4b5551590610e3b9085908590612bf2565b603354610100900460ff1680611c4f5750611c4f61185d565b80611c5d575060335460ff16155b611c795760405162461bcd60e51b81526004016107a090612a7d565b603354610100900460ff16158015611ca4576033805460ff1961ff0019909116610100171660011790555b8015611cb6576033805461ff00191690555b50565b603354610100900460ff1680611cd25750611cd261185d565b80611ce0575060335460ff16155b611cfc5760405162461bcd60e51b81526004016107a090612a7d565b603354610100900460ff16158015611d27576033805460ff1961ff0019909116610100171660011790555b8251611d3a90609b906020860190611f40565b508151611d4e90609c906020850190611f40565b50609d805460ff19166012179055801561089a576033805461ff0019169055505050565b611d7d308383611867565b5050565b609d805460ff191660ff92909216919091179055565b6001600160a01b038216611dbd5760405162461bcd60e51b81526004016107a090612bbb565b611dc96000838361089a565b609a54611dd69082611b9d565b609a556001600160a01b038216600090815260986020526040902054611dfc9082611b9d565b6001600160a01b0383166000818152609860205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e4b90859061275e565b60405180910390a35050565b6001600160a01b038316611e7d5760405162461bcd60e51b81526004016107a090612b47565b6001600160a01b038216611ea35760405162461bcd60e51b81526004016107a0906128fe565b6001600160a01b0380841660008181526099602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061197c90859061275e565b6000610c4683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611989565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611f8157805160ff1916838001178555611fae565b82800160010185558215611fae579182015b82811115611fae578251825591602001919060010190611f93565b50611fba929150611fbe565b5090565b5b80821115611fba5760008155600101611fbf565b80356001600160a01b038116811461073f57600080fd5b600082601f830112611ffa578081fd5b813561200d61200882612c35565b612c0e565b81815291506020808301908481018184028601820187101561202e57600080fd5b60005b8481101561204d57813584529282019290820190600101612031565b505050505092915050565b600082601f830112612068578081fd5b813567ffffffffffffffff81111561207e578182fd5b612091601f8201601f1916602001612c0e565b91508082528360208285010111156120a857600080fd5b8060208401602084013760009082016020015292915050565b6000608082840312156120d2578081fd5b6120dc6080612c0e565b90506120e88383611fd3565b81526120f78360208401612116565b6020820152604082013560408201526060820135606082015292915050565b803560ff8116811461073f57600080fd5b600060208284031215612138578081fd5b610c468383611fd3565b60008060408385031215612154578081fd5b61215e8484611fd3565b915061216d8460208501611fd3565b90509250929050565b6000806000806000806000806000806101408b8d031215612195578586fd5b61219f8c8c611fd3565b99506121ae8c60208d01611fd3565b98506121bd8c60408d01611fd3565b97506121cc8c60608d01611fd3565b96506121db8c60808d01611fd3565b95506121ea8c60a08d01611fd3565b94506121f98c60c08d01611fd3565b93506122088c60e08d01611fd3565b92506122188c6101008d01611fd3565b91506122288c6101208d01611fd3565b90509295989b9194979a5092959850565b6000806000806000806000806000806000806101808d8f03121561225b578081fd5b6122658e8e611fd3565b9b506122748e60208f01611fd3565b9a506122838e60408f01611fd3565b99506122928e60608f01611fd3565b98506122a18e60808f01611fd3565b97506122b08e60a08f01611fd3565b96506122bf8e60c08f01611fd3565b95506122ce8e60e08f01611fd3565b94506122de8e6101008f01611fd3565b93506122ee8e6101208f01611fd3565b92506122fe8e6101408f01611fd3565b915061230e8e6101608f01611fd3565b90509295989b509295989b509295989b565b60008060008060008060c08789031215612338578182fd5b863561234381612c55565b9550602087013561235381612c55565b9450604087013567ffffffffffffffff8082111561236f578384fd5b61237b8a838b01612058565b95506060890135915080821115612390578384fd5b5061239d89828a01612058565b935050608087013560ff811681146123b3578283fd5b8092505060a087013590509295509295509295565b6000806000606084860312156123dc578081fd5b83356123e781612c55565b925060208401356123f781612c55565b929592945050506040919091013590565b600080600080600080600060e0888a031215612422578081fd5b61242c8989611fd3565b965061243b8960208a01611fd3565b955060408801359450606088013593506124588960808a01612116565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612486578182fd5b6124908484611fd3565b946020939093013593505050565b600080600080608085870312156124b3578182fd5b6124bd8686611fd3565b9350602085013592506124d38660408701611fd3565b9396929550929360600135925050565b600080604083850312156124f5578182fd5b823567ffffffffffffffff8082111561250c578384fd5b818501915085601f83011261251f578384fd5b813561252d61200882612c35565b80828252602080830192508086018a82838702890101111561254d578889fd5b8896505b84871015612577576125638b82611fd3565b845260019690960195928101928101612551565b50909650870135935050508082111561258e578283fd5b5061259b85828601611fea565b9150509250929050565b6000602082840312156125b6578081fd5b5051919050565b600080604083850312156125cf578182fd5b8235915061216d8460208501611fd3565b6000806000606084860312156125f4578081fd5b833592506126058560208601611fd3565b9150604084013590509250925092565b600080600080600060a0868803121561262c578283fd5b85359450602061263e88828901611fd3565b9450604087013593506060870135925060808088013567ffffffffffffffff811115612668578384fd5b8801601f81018a13612678578384fd5b803561268661200882612c35565b81815284810190838601858402850187018e10156126a2578788fd5b8794505b838510156126cc576126b88e826120c1565b8352600194909401939186019185016126a6565b508096505050505050509295509295909350565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b818110156127475783518352928401929184019160010161272b565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b95865260208601949094526001600160a01b039283166040860152606085019190915260808401521660a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b8181101561283d57858101830151858201604001528201612821565b8181111561284e5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260119082015270696e76616c6964207369676e617475726560781b604082015260600190565b602080825260129082015271746f6f20666577207369676e61747572657360701b604082015260600190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600e908201526d66656520697320746f6f206c6f7760901b604082015260600190565b60208082526014908201527372657065746974697665207369676e61746f727960601b604082015260600190565b60208082526018908201527f7065726d697420494e56414c49445f5349474e41545552450000000000000000604082015260600190565b6020808252600e908201526d1c195c9b5a5d081156141254915160921b604082015260600190565b60208082526011908201527077697468647261776e20616c726561647960781b604082015260600190565b6020808252600c908201526b1d5b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526019908201527f74776f206172726179206c656e7468206e6f7420657175616c00000000000000604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601690820152754f6e6c792063616c6c656420627920466163746f727960501b604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715612c2d57600080fd5b604052919050565b600067ffffffffffffffff821115612c4b578081fd5b5060209081020190565b6001600160a01b0381168114611cb657600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207e9f342664c32e4366c927e5b01528a85c82cccc4d6baff3cc08ae81331e74cf64736f6c634300060c0033
Deployed Bytecode Sourcemap
50455:1477:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42126:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17325:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;19431:169::-;;;;;;;;;;-1:-1:-1;19431:169:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42161:44::-;;;;;;;;;;-1:-1:-1;42161:44:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42066:26::-;;;;;;;;;;;;;:::i;49193:344::-;;;;;;;;;;-1:-1:-1;49193:344:0;;;;;:::i;:::-;;:::i;:::-;;18400:100;;;;;;;;;;;;;:::i;42775:398::-;;;;;;;;;;-1:-1:-1;42775:398:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41762:122::-;;;;;;;;;;;;;:::i;42520:77::-;;;;;;;;;;-1:-1:-1;42520:77:0;;;;;:::i;:::-;;:::i;20074:410::-;;;;;;;;;;-1:-1:-1;20074:410:0;;;;;:::i;:::-;;:::i;44878:329::-;;;;;;:::i;:::-;;:::i;47704:108::-;;;;;;;;;;;;;:::i;18252:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49546:152::-;;;;;;;;;;;;;:::i;20893:218::-;;;;;;;;;;-1:-1:-1;20893:218:0;;;;;:::i;:::-;;:::i;50035:98::-;;;;;;;;;;;;;:::i;43969:280::-;;;;;;;;;;-1:-1:-1;43969:280:0;;;;;:::i;:::-;;:::i;50491:529::-;;;;;;;;;;-1:-1:-1;50491:529:0;;;;;:::i;:::-;;:::i;18563:119::-;;;;;;;;;;-1:-1:-1;18563:119:0;;;;;:::i;:::-;;:::i;42393:73::-;;;;;;;;;;-1:-1:-1;42393:73:0;;;;;:::i;:::-;;:::i;43185:277::-;;;;;;;;;;-1:-1:-1;43185:277:0;;;;;:::i;:::-;;:::i;47893:39::-;;;;;;;;;;-1:-1:-1;47893:39:0;;;;;:::i;:::-;;:::i;44694:172::-;;;;;;:::i;:::-;;:::i;41613:142::-;;;;;;;;;;;;;:::i;17527:87::-;;;;;;;;;;;;;:::i;43559:398::-;;;;;;;;;;-1:-1:-1;43559:398:0;;;;;:::i;:::-;;:::i;21614:269::-;;;;;;;;;;-1:-1:-1;21614:269:0;;;;;:::i;:::-;;:::i;45398:1320::-;;;;;;:::i;:::-;;:::i;18895:175::-;;;;;;;;;;-1:-1:-1;18895:175:0;;;;;:::i;:::-;;:::i;42037:22::-;;;;;;;;;;;;;:::i;47941:668::-;;;;;;;;;;-1:-1:-1;47941:668:0;;;;;:::i;:::-;;:::i;49915:108::-;;;;;;;;;;;;;:::i;19133:151::-;;;;;;;;;;-1:-1:-1;19133:151:0;;;;;:::i;:::-;;:::i;48813:374::-;;;;;;;;;;-1:-1:-1;48813:374:0;;;;;:::i;:::-;;:::i;42099:20::-;;;;;;;;;;;;;:::i;42272:60::-;;;;;;;;;;-1:-1:-1;42272:60:0;;;;;:::i;:::-;;:::i;51026:903::-;;;;;;;;;;-1:-1:-1;51026:903:0;;;;;:::i;:::-;;:::i;42126:22::-;;;-1:-1:-1;;;;;42126:22:0;;:::o;17325:83::-;17395:5;17388:12;;;;;;;;-1:-1:-1;;17388:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17362:13;;17388:12;;17395:5;;17388:12;;17395:5;17388:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17325:83;:::o;19431:169::-;19514:4;19531:39;19540:12;:10;:12::i;:::-;19554:7;19563:6;19531:8;:39::i;:::-;-1:-1:-1;19588:4:0;19431:169;;;;;:::o;42161:44::-;;;;;;;;;;;;;:::o;42066:26::-;;;;:::o;49193:344::-;1114:12;;;;;;;;:31;;;1130:15;:13;:15::i;:::-;1114:47;;;-1:-1:-1;1150:11:0;;;;1149:12;1114:47;1106:106;;;;-1:-1:-1;;;1106:106:0;;;;;;;:::i;:::-;;;;;;;;;1244:12;;;;;;;1243:13;1263:83;;;;1292:12;:19;;-1:-1:-1;;;;1292:19:0;;;;;1320:18;1307:4;1320:18;;;1263:83;49299:7:::1;:18:::0;;-1:-1:-1;;;;;;49299:18:0::1;-1:-1:-1::0;;;;;49299:18:0;::::1;;::::0;;49342:10:::1;:8;:10::i;:::-;49328:11;:24:::0;49363:5:::1;:18:::0;;-1:-1:-1;;;;;;49363:18:0;;::::1;::::0;;;49392:7:::1;:18:::0;;;;::::1;-1:-1:-1::0;;;;;49392:18:0;::::1;;::::0;;41804:80:::1;49495:6;:4;:6::i;:::-;49479:24;;;;;;49505:10;:8;:10::i;:::-;49525:4;49451:80;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;49451:80:0;;::::1;::::0;;;;;;49441:91;;49451:80:::1;49441:91:::0;;::::1;::::0;49421:17:::1;:111:::0;1364:57;;;;1393:12;:20;;-1:-1:-1;;1393:20:0;;;1364:57;49193:344;;;:::o;18400:100::-;18480:12;;18400:100;:::o;42775:398::-;42884:20;42946:10;:17;42925:10;:17;:38;42917:76;;;;-1:-1:-1;;;42917:76:0;;;;;;;:::i;:::-;43024:10;:17;43013:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43013:29:0;;43004:38;;43057:6;43053:112;43069:10;:17;43067:1;:19;43053:112;;;43118:47;43136:10;43147:1;43136:13;;;;;;;;;;;;;;43151:10;43162:1;43151:13;;;;;;;;;;;;;;43118:17;:47::i;:::-;43106:6;43113:1;43106:9;;;;;;;;;;;;;;;;;:59;43088:3;;43053:112;;;;42775:398;;;;:::o;41762:122::-;41804:80;41762:122;:::o;42520:77::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20074:410::-;20180:4;20197:36;20207:6;20215:9;20226:6;20197:9;:36::i;:::-;20257:12;:10;:12::i;:::-;-1:-1:-1;;;;;20247:22:0;:6;-1:-1:-1;;;;;20247:22:0;;;:71;;;;-1:-1:-1;;;;;;20273:19:0;;;;;;:11;:19;;;;;-1:-1:-1;;20315:2:0;20293:12;:10;:12::i;:::-;-1:-1:-1;;;;;20273:33:0;-1:-1:-1;;;;;20273:33:0;;;;;;;;;;;;;:45;;20247:71;20244:210;;;20333:121;20342:6;20350:12;:10;:12::i;:::-;20364:89;20402:6;20364:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20364:19:0;;;;;;:11;:19;;;;;;20384:12;:10;:12::i;:::-;-1:-1:-1;;;;;20364:33:0;;;;;;;;;;;;-1:-1:-1;20364:33:0;;;:89;:37;:89::i;:::-;20333:8;:121::i;:::-;-1:-1:-1;20472:4:0;20074:410;;;;;:::o;44878:329::-;44983:10;45006:12;:10;:12::i;:::-;45029:23;45039:4;45045:6;45029:9;:23::i;:::-;-1:-1:-1;45071:20:0;;;;:9;:20;;;;;;;;-1:-1:-1;;;;;45071:24:0;;;;;;;;;;;;:26;;;;;;;;45108:15;;;:4;:15;;;;;:19;;;;;;;;:26;;;;;;;;;;:35;;;45159:40;;45071:26;;:24;;45081:9;;45159:40;;;;;;;45071:26;;45137:6;;45159:40;:::i;:::-;;;;;;;;44878:329;;;;;;:::o;47704:108::-;47746:66;47704:108;:::o;18252:83::-;18318:9;;;;18252:83;:::o;49546:152::-;49633:7;49660:30;:28;:30::i;:::-;49653:37;;49546:152;:::o;20893:218::-;20981:4;20998:83;21007:12;:10;:12::i;:::-;21021:7;21030:50;21069:10;21030:11;:25;21042:12;:10;:12::i;:::-;-1:-1:-1;;;;;21030:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21030:25:0;;;:34;;;;;;;;;;;:38;:50::i;50035:98::-;50096:4;50035:98;:::o;43969:280::-;42709:7;;44067:10;;-1:-1:-1;;;;;42709:7:0;42695:10;:21;42687:56;;;;-1:-1:-1;;;42687:56:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;44098:22:0;::::1;;::::0;;;:11:::1;:22;::::0;;;;;44134:17;;::::1;44131:52;;;44178:5;44166:17;;44131:52;44201:40;44220:9;44231;44201:18;:40::i;:::-;44194:47:::0;43969:280;-1:-1:-1;;;43969:280:0:o;50491:529::-;1114:12;;;;;;;;:31;;;1130:15;:13;:15::i;:::-;1114:47;;;-1:-1:-1;1150:11:0;;;;1149:12;1114:47;1106:106;;;;-1:-1:-1;;;1106:106:0;;;;;;;:::i;:::-;1244:12;;;;;;;1243:13;1263:83;;;;1292:12;:19;;-1:-1:-1;;;;1292:19:0;;;;;1320:18;1307:4;1320:18;;;1263:83;50748:26:::1;:24;:26::i;:::-;50779:67;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;50779:67:0::1;;::::0;:22:::1;:67::i;:::-;50851:50;50882:8;50892;50851:30;:50::i;:::-;50906:109;50929:5;50936:4;50942:5;50949:7;50958:9;50969:5;50976:13;50991:8;51001:7;51010:4;50906:22;:109::i;:::-;1368:14:::0;1364:57;;;1393:12;:20;;-1:-1:-1;;1393:20:0;;;1364:57;50491:529;;;;;;;;;;;;;:::o;18563:119::-;-1:-1:-1;;;;;18656:18:0;18629:7;18656:18;;;:9;:18;;;;;;;18563:119::o;42393:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43185:277::-;42709:7;;43283:10;;-1:-1:-1;;;;;42709:7:0;42695:10;:21;42687:56;;;;-1:-1:-1;;;42687:56:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43314:22:0;::::1;;::::0;;;:11:::1;:22;::::0;;;;;:37:::1;::::0;43341:9;43314:26:::1;:37::i;:::-;-1:-1:-1::0;;;;;43362:22:0;::::1;;::::0;;;:11:::1;:22;::::0;;;;;;:30;;;43408:46;43306:45;;-1:-1:-1;43362:22:0;43408:46:::1;::::0;::::1;::::0;43437:9;;43306:45;;43408:46:::1;:::i;:::-;;;;;;;;43185:277:::0;;;;:::o;47893:39::-;;;;;;;;;;;;;;:::o;44694:172::-;44783:10;44813:45;44822:12;:10;:12::i;:::-;44836:9;44847:2;44851:6;44813:8;:45::i;:::-;44806:52;44694:172;-1:-1:-1;;;;44694:172:0:o;41613:142::-;41656:99;41613:142;:::o;17527:87::-;17599:7;17592:14;;;;;;;;-1:-1:-1;;17592:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17566:13;;17592:14;;17599:7;;17592:14;;17599:7;17592:14;;;;;;;;;;;;;;;;;;;;;;;;43559:398;43668:20;43730:10;:17;43709:10;:17;:38;43701:76;;;;-1:-1:-1;;;43701:76:0;;;;;;;:::i;:::-;43808:10;:17;43797:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43797:29:0;;43788:38;;43841:6;43837:112;43853:10;:17;43851:1;:19;43837:112;;;43902:47;43920:10;43931:1;43920:13;;;;;;;;;;;;;;43935:10;43946:1;43935:13;;;;;;;;;;;;;;43902:17;:47::i;:::-;43890:6;43897:1;43890:9;;;;;;;;;;;;;;;;;:59;43872:3;;43837:112;;21614:269;21707:4;21724:129;21733:12;:10;:12::i;:::-;21747:7;21756:96;21795:15;21756:96;;;;;;;;;;;;;;;;;:11;:25;21768:12;:10;:12::i;:::-;-1:-1:-1;;;;;21756:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21756:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;45398:1320::-;45546:12;:10;:12::i;:::-;45577:21;;;;:8;:21;;;;;;;;-1:-1:-1;;;;;45577:25:0;;;;;;;;;:32;;;;;;;;;:37;45569:67;;;;-1:-1:-1;;;45569:67:0;;;;;;;:::i;:::-;45656:17;;45710:7;;45697:48;;-1:-1:-1;;;45697:48:0;;-1:-1:-1;;;;;45710:7:0;;;;45697:31;;:48;;-1:-1:-1;;;45729:15:0;45697:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45692:1;:53;;45684:84;;;;-1:-1:-1;;;45684:84:0;;;;;;;:::i;:::-;45783:6;45779:794;45795:1;45793;:3;45779:794;;;45822:6;45818:124;45834:1;45832;:3;45818:124;;;45894:10;45905:1;45894:13;;;;;;;;;;;;;;:23;;;-1:-1:-1;;;;;45867:50:0;:10;45878:1;45867:13;;;;;;;;;;;;;;:23;;;-1:-1:-1;;;;;45867:50:0;;;45859:83;;;;-1:-1:-1;;;45859:83:0;;;;;;;:::i;:::-;45837:3;;45818:124;;;;45957:18;41656:99;46017:11;46030:2;46034:5;46041:6;46049:10;46060:1;46049:13;;;;;;;;;;;;;;:23;;;45988:85;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45978:96;;;;;;45957:117;;46089:14;46145:17;;46164:10;46116:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46106:70;;;;;;46089:87;;46191:17;46211:68;46221:6;46229:10;46240:1;46229:13;;;;;;;;;;;;;;:15;;;46246:10;46257:1;46246:13;;;;;;;;;;;;;;:15;;;46263:10;46274:1;46263:13;;;;;;;;;;;;;;:15;;;46211:68;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46211:68:0;;-1:-1:-1;;46211:68:0;;;-1:-1:-1;;;;;;;46302:23:0;;46294:53;;;;-1:-1:-1;;;46294:53:0;;;;;;;:::i;:::-;46383:10;46394:1;46383:13;;;;;;;;;;;;;;:23;;;-1:-1:-1;;;;;46370:36:0;:9;-1:-1:-1;;;;;46370:36:0;;46362:61;;;;-1:-1:-1;;;46362:61:0;;;;;;;:::i;:::-;46438:51;46457:10;46468:1;46457:13;;;;;;;;;;;;;;:23;;;46482:6;46438:18;:51::i;:::-;;46551:9;-1:-1:-1;;;;;46509:52:0;46536:5;46532:2;-1:-1:-1;;;;;46509:52:0;;46519:11;46543:6;46509:52;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;45798:3:0;;45779:794;;;-1:-1:-1;46583:21:0;;;;:8;:21;;;;;;;;-1:-1:-1;;;;;46583:25:0;;;;;;;;;:32;;;;;;;;:41;;;46635:20;46605:2;46618:6;46635:8;:20::i;:::-;46696:5;46692:2;-1:-1:-1;;;;;46671:39:0;46679:11;46671:39;46703:6;46671:39;;;;;;:::i;:::-;;;;;;;;45398:1320;;;;;;:::o;18895:175::-;18981:4;18998:42;19008:12;:10;:12::i;:::-;19022:9;19033:6;18998:9;:42::i;42037:22::-;;;-1:-1:-1;;;;;42037:22:0;;:::o;47941:668::-;48087:15;48075:8;:27;;48067:54;;;;-1:-1:-1;;;48067:54:0;;;;;;;:::i;:::-;48132:14;48237:18;:16;:18::i;:::-;-1:-1:-1;;;;;48335:13:0;;48295:15;48335:13;;;;;;;;;;;;:15;;;;;;;;48284:77;;;;47746:66;;48312:5;;48319:7;;48328:5;;48335:15;;48352:8;;48284:77;;:::i;:::-;;;;;;;;;;;;;48274:88;;;;;;48173:204;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48149:239;;;;;;48132:256;;48399:24;48426:26;48436:6;48444:1;48447;48450;48426:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48426:26:0;;-1:-1:-1;;48426:26:0;;;-1:-1:-1;;;;;;;48471:30:0;;;;;;:59;;;48525:5;-1:-1:-1;;;;;48505:25:0;:16;-1:-1:-1;;;;;48505:25:0;;48471:59;48463:96;;;;-1:-1:-1;;;48463:96:0;;;;;;;:::i;:::-;48570:31;48579:5;48586:7;48595:5;48570:8;:31::i;:::-;47941:668;;;;;;;;;:::o;49915:108::-;49967:4;49991:24;50009:4;49991:9;:24::i;19133:151::-;-1:-1:-1;;;;;19249:18:0;;;19222:7;19249:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19133:151::o;48813:374::-;1114:12;;;;;;;;:31;;;1130:15;:13;:15::i;:::-;1114:47;;;-1:-1:-1;1150:11:0;;;;1149:12;1114:47;1106:106;;;;-1:-1:-1;;;1106:106:0;;;;;;;:::i;:::-;1244:12;;;;;;;1243:13;1263:83;;;;1292:12;:19;;-1:-1:-1;;;;1292:19:0;;;;;1320:18;1307:4;1320:18;;;1263:83;48994:26:::1;:24;:26::i;:::-;49025:38;49048:5;49055:7;49025:22;:38::i;:::-;49068:25;49083:9;49068:14;:25::i;:::-;49098:29;49104:8;49114:12;49098:5;:29::i;:::-;49132:50;49163:8;49173;49132:30;:50::i;:::-;1368:14:::0;1364:57;;;1393:12;:20;;-1:-1:-1;;1393:20:0;;;1364:57;48813:374;;;;;;;:::o;42099:20::-;;;-1:-1:-1;;;;;42099:20:0;;:::o;42272:60::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;51026:903::-;1114:12;;;;;;;;:31;;;1130:15;:13;:15::i;:::-;1114:47;;;-1:-1:-1;1150:11:0;;;;1149:12;1114:47;1106:106;;;;-1:-1:-1;;;1106:106:0;;;;;;;:::i;:::-;1244:12;;;;;;;1243:13;1263:83;;;;1292:12;:19;;-1:-1:-1;;;;1292:19:0;;;;;1320:18;1307:4;1320:18;;;1263:83;51249:63:::1;51255:5;51300:10;:8;:10::i;:::-;51292:19;;51286:2;:25;51273:10;:38;51249:5;:63::i;:::-;51317;51323:4;51368:10;:8;:10::i;:::-;51360:19;;51354:2;:25;51341:10;:38;51317:5;:63::i;:::-;51385;51391:5;51436:10;:8;:10::i;51385:63::-;51453;51459:7;51504:10;:8;:10::i;:::-;51496:19;;51490:2;:25;51478:9;:37;51453:5;:63::i;:::-;51521;51527:9;51572:10;:8;:10::i;51521:63::-;51589;51595:5;51640:10;:8;:10::i;51589:63::-;51657;51663:13;51708:10;:8;:10::i;51657:63::-;51725;51731:8;51776:10;:8;:10::i;:::-;51768:19;;51762:2;:25;51750:9;:37;51725:5;:63::i;:::-;51793;51799:7;51844:10;:8;:10::i;51793:63::-;51861;51867:4;51912:10;:8;:10::i;:::-;51904:19;;51898:2;:25;51886:9;:37;51861:5;:63::i;:::-;1368:14:::0;1364:57;;;1393:12;:20;;-1:-1:-1;;1393:20:0;;;1364:57;51026:903;;;;;;;;;;;:::o;3039:106::-;3127:10;3039:106;:::o;49710:193::-;49846:49;49872:5;49879:7;49888:6;49846:25;:49::i;1515:508::-;1932:4;1978:17;2010:7;1515:508;:::o;41312:98::-;41392:9;;41384:19::o;22373:539::-;-1:-1:-1;;;;;22479:20:0;;22471:70;;;;-1:-1:-1;;;22471:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22560:23:0;;22552:71;;;;-1:-1:-1;;;22552:71:0;;;;;;;:::i;:::-;22636:47;22657:6;22665:9;22676:6;22636:20;:47::i;:::-;22716:71;22738:6;22716:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22716:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;22696:17:0;;;;;;;:9;:17;;;;;;:91;;;;22821:20;;;;;;;:32;;22846:6;22821:24;:32::i;:::-;-1:-1:-1;;;;;22798:20:0;;;;;;;:9;:20;;;;;;;:55;;;;22869:35;;;;;;;;;;22897:6;;22869:35;:::i;:::-;;;;;;;;22373:539;;;:::o;5918:192::-;6004:7;6040:12;6032:6;;;;6024:29;;;;-1:-1:-1;;;6024:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;6076:5:0;;;5918:192::o;47042:394::-;47126:7;;47113:38;;-1:-1:-1;;;47113:38:0;;-1:-1:-1;;;;;47126:7:0;;;;47113:31;;:38;;-1:-1:-1;;;47145:5:0;47113:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47100:9;:51;;47092:78;;;;-1:-1:-1;;;47092:78:0;;;;;;;:::i;:::-;47226:7;;47213:40;;-1:-1:-1;;;47213:40:0;;47181:21;;-1:-1:-1;;;;;47226:7:0;;47213:31;;:40;;-1:-1:-1;;;47245:7:0;47213:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47181:73;-1:-1:-1;;;;;;47268:19:0;;47265:70;;-1:-1:-1;47326:7:0;;-1:-1:-1;;;;;47326:7:0;47265:70;47346:25;;-1:-1:-1;;;;;47346:14:0;;;47361:9;47346:25;;;;;;;;;47361:9;47346:14;:25;;;;;;;;;;;;;;;;;;;;;47411:5;-1:-1:-1;;;;;47387:41:0;47397:12;:10;:12::i;:::-;-1:-1:-1;;;;;47387:41:0;;47418:9;47387:41;;;;;;:::i;:::-;;;;;;;;47042:394;:::o;50145:132::-;50228:41;50241:4;50255;50262:6;50228:12;:41::i;41932:97::-;42008:17;;41932:97;:::o;5031:181::-;5089:7;5121:5;;;5145:6;;;;5137:46;;;;-1:-1:-1;;;5137:46:0;;;;;;;:::i;44261:268::-;-1:-1:-1;;;;;44381:22:0;;44350:10;44381:22;;;:11;:22;;;;;;:37;;44408:9;44381:26;:37::i;:::-;-1:-1:-1;;;;;44429:22:0;;;;;;:11;:22;;;;;;;:30;;;44475:46;44373:45;;-1:-1:-1;44429:22:0;44475:46;;;;44504:9;;44373:45;;44475:46;:::i;2960:69::-;1114:12;;;;;;;;:31;;;1130:15;:13;:15::i;:::-;1114:47;;;-1:-1:-1;1150:11:0;;;;1149:12;1114:47;1106:106;;;;-1:-1:-1;;;1106:106:0;;;;;;;:::i;:::-;1244:12;;;;;;;1243:13;1263:83;;;;1292:12;:19;;-1:-1:-1;;;;1292:19:0;;;;;1320:18;1307:4;1320:18;;;1263:83;1368:14;1364:57;;;1393:12;:20;;-1:-1:-1;;1393:20:0;;;1364:57;2960:69;:::o;17069:184::-;1114:12;;;;;;;;:31;;;1130:15;:13;:15::i;:::-;1114:47;;;-1:-1:-1;1150:11:0;;;;1149:12;1114:47;1106:106;;;;-1:-1:-1;;;1106:106:0;;;;;;;:::i;:::-;1244:12;;;;;;;1243:13;1263:83;;;;1292:12;:19;;-1:-1:-1;;;;1292:19:0;;;;;1320:18;1307:4;1320:18;;;1263:83;17179:12;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;17202:16:0;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;17229:9:0::1;:14:::0;;-1:-1:-1;;17229:14:0::1;17241:2;17229:14;::::0;;1364:57;;;;1393:12;:20;;-1:-1:-1;;1393:20:0;;;17069:184;;;:::o;50285:127::-;50368:36;50386:4;50393:2;50397:6;50368:9;:36::i;:::-;50285:127;;:::o;25439:90::-;25500:9;:21;;-1:-1:-1;;25500:21:0;;;;;;;;;;;;25439:90::o;23193:378::-;-1:-1:-1;;;;;23277:21:0;;23269:65;;;;-1:-1:-1;;;23269:65:0;;;;;;;:::i;:::-;23347:49;23376:1;23380:7;23389:6;23347:20;:49::i;:::-;23424:12;;:24;;23441:6;23424:16;:24::i;:::-;23409:12;:39;-1:-1:-1;;;;;23480:18:0;;;;;;:9;:18;;;;;;:30;;23503:6;23480:22;:30::i;:::-;-1:-1:-1;;;;;23459:18:0;;;;;;:9;:18;;;;;;:51;;;;23526:37;;23459:18;;;23526:37;;;;23556:6;;23526:37;:::i;:::-;;;;;;;;23193:378;;:::o;24761:346::-;-1:-1:-1;;;;;24863:19:0;;24855:68;;;;-1:-1:-1;;;24855:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24942:21:0;;24934:68;;;;-1:-1:-1;;;24934:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25015:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;25067:32;;;;;25045:6;;25067:32;:::i;5487:136::-;5545:7;5572:43;5576:1;5579;5572:43;;;;;;;;;;;;;;;;;:3;:43::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;5:130;72:20;;-1:-1;;;;;38194:54;;39103:35;;39093:2;;39152:1;;39142:12;1716:707;;1833:3;1826:4;1818:6;1814:17;1810:27;1800:2;;-1:-1;;1841:12;1800:2;1888:6;1875:20;1910:80;1925:64;1982:6;1925:64;:::i;:::-;1910:80;:::i;:::-;2018:21;;;1901:89;-1:-1;2062:4;2075:14;;;;2050:17;;;2164;;;2155:27;;;;2152:36;-1:-1;2149:2;;;2201:1;;2191:12;2149:2;2226:1;2211:206;2236:6;2233:1;2230:13;2211:206;;;3867:20;;2304:50;;2368:14;;;;2396;;;;2258:1;2251:9;2211:206;;;2215:14;;;;;1793:630;;;;:::o;2569:442::-;;2671:3;2664:4;2656:6;2652:17;2648:27;2638:2;;-1:-1;;2679:12;2638:2;2726:6;2713:20;36619:18;36611:6;36608:30;36605:2;;;-1:-1;;36641:12;36605:2;2748:65;36714:9;36695:17;;-1:-1;;36691:33;36782:4;36772:15;2748:65;:::i;:::-;2739:74;;2833:6;2826:5;2819:21;2937:3;36782:4;2928:6;2861;2919:16;;2916:25;2913:2;;;2954:1;;2944:12;2913:2;38509:6;36782:4;2861:6;2857:17;36782:4;2895:5;2891:16;38486:30;38565:1;38547:16;;;36782:4;38547:16;38540:27;2895:5;2631:380;-1:-1;;2631:380::o;3042:751::-;;3158:4;3146:9;3141:3;3137:19;3133:30;3130:2;;;-1:-1;;3166:12;3130:2;3194:20;3158:4;3194:20;:::i;:::-;3185:29;;3301:49;3346:3;3322:22;3301:49;:::i;:::-;3283:16;3276:75;3442:47;3485:3;3409:2;3465:9;3461:22;3442:47;:::i;:::-;3409:2;3428:5;3424:16;3417:73;3548:2;3606:9;3602:22;2498:20;3548:2;3567:5;3563:16;3556:75;3689:2;3747:9;3743:22;2498:20;3689:2;3708:5;3704:16;3697:75;3124:669;;;;:::o;4078:126::-;4143:20;;38410:4;38399:16;;39473:33;;39463:2;;39520:1;;39510:12;4211:241;;4315:2;4303:9;4294:7;4290:23;4286:32;4283:2;;;-1:-1;;4321:12;4283:2;4383:53;4428:7;4404:22;4383:53;:::i;4459:366::-;;;4580:2;4568:9;4559:7;4555:23;4551:32;4548:2;;;-1:-1;;4586:12;4548:2;4648:53;4693:7;4669:22;4648:53;:::i;:::-;4638:63;;4756:53;4801:7;4738:2;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4542:283;;;;;:::o;4832:1373::-;;;;;;;;;;;5089:3;5077:9;5068:7;5064:23;5060:33;5057:2;;;-1:-1;;5096:12;5057:2;5158:53;5203:7;5179:22;5158:53;:::i;:::-;5148:63;;5266:53;5311:7;5248:2;5291:9;5287:22;5266:53;:::i;:::-;5256:63;;5374:53;5419:7;5356:2;5399:9;5395:22;5374:53;:::i;:::-;5364:63;;5482:53;5527:7;5464:2;5507:9;5503:22;5482:53;:::i;:::-;5472:63;;5591:53;5636:7;5572:3;5616:9;5612:22;5591:53;:::i;:::-;5581:63;;5700:53;5745:7;5681:3;5725:9;5721:22;5700:53;:::i;:::-;5690:63;;5809:53;5854:7;5790:3;5834:9;5830:22;5809:53;:::i;:::-;5799:63;;5918:53;5963:7;5899:3;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;6027:53;6072:7;6008:3;6052:9;6048:22;6027:53;:::i;:::-;6017:63;;6136:53;6181:7;6117:3;6161:9;6157:22;6136:53;:::i;:::-;6126:63;;5051:1154;;;;;;;;;;;;;:::o;6212:1629::-;;;;;;;;;;;;;6505:3;6493:9;6484:7;6480:23;6476:33;6473:2;;;-1:-1;;6512:12;6473:2;6574:53;6619:7;6595:22;6574:53;:::i;:::-;6564:63;;6682:53;6727:7;6664:2;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6790:53;6835:7;6772:2;6815:9;6811:22;6790:53;:::i;:::-;6780:63;;6898:53;6943:7;6880:2;6923:9;6919:22;6898:53;:::i;:::-;6888:63;;7007:53;7052:7;6988:3;7032:9;7028:22;7007:53;:::i;:::-;6997:63;;7116:53;7161:7;7097:3;7141:9;7137:22;7116:53;:::i;:::-;7106:63;;7225:53;7270:7;7206:3;7250:9;7246:22;7225:53;:::i;:::-;7215:63;;7334:53;7379:7;7315:3;7359:9;7355:22;7334:53;:::i;:::-;7324:63;;7443:53;7488:7;7424:3;7468:9;7464:22;7443:53;:::i;:::-;7433:63;;7552:53;7597:7;7533:3;7577:9;7573:22;7552:53;:::i;:::-;7542:63;;7662:53;7707:7;7642:3;7687:9;7683:22;7662:53;:::i;:::-;7651:64;;7772:53;7817:7;7752:3;7797:9;7793:22;7772:53;:::i;:::-;7761:64;;6467:1374;;;;;;;;;;;;;;:::o;7848:1077::-;;;;;;;8055:3;8043:9;8034:7;8030:23;8026:33;8023:2;;;-1:-1;;8062:12;8023:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;8114:63;-1:-1;8214:2;8253:22;;72:20;97:33;72:20;97:33;:::i;:::-;8222:63;-1:-1;8350:2;8335:18;;8322:32;8374:18;8363:30;;;8360:2;;;-1:-1;;8396:12;8360:2;8426:63;8481:7;8472:6;8461:9;8457:22;8426:63;:::i;:::-;8416:73;;8554:2;8543:9;8539:18;8526:32;8512:46;;8374:18;8570:6;8567:30;8564:2;;;-1:-1;;8600:12;8564:2;;8630:63;8685:7;8676:6;8665:9;8661:22;8630:63;:::i;:::-;8620:73;;;8730:3;8772:9;8768:22;4143:20;38410:4;39499:5;38399:16;39476:5;39473:33;39463:2;;-1:-1;;39510:12;39463:2;8739:61;;;;8837:3;8881:9;8877:22;3867:20;8846:63;;8017:908;;;;;;;;:::o;8932:491::-;;;;9070:2;9058:9;9049:7;9045:23;9041:32;9038:2;;;-1:-1;;9076:12;9038:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;9128:63;-1:-1;9228:2;9267:22;;72:20;97:33;72:20;97:33;:::i;:::-;9032:391;;9236:63;;-1:-1;;;9336:2;9375:22;;;;3867:20;;9032:391::o;9430:991::-;;;;;;;;9634:3;9622:9;9613:7;9609:23;9605:33;9602:2;;;-1:-1;;9641:12;9602:2;9703:53;9748:7;9724:22;9703:53;:::i;:::-;9693:63;;9811:53;9856:7;9793:2;9836:9;9832:22;9811:53;:::i;:::-;9801:63;;9901:2;9944:9;9940:22;3867:20;9909:63;;10009:2;10052:9;10048:22;3867:20;10017:63;;10136:51;10179:7;10117:3;10159:9;10155:22;10136:51;:::i;:::-;10126:61;;10224:3;10268:9;10264:22;2498:20;10233:63;;10333:3;10377:9;10373:22;2498:20;10342:63;;9596:825;;;;;;;;;;:::o;10428:366::-;;;10549:2;10537:9;10528:7;10524:23;10520:32;10517:2;;;-1:-1;;10555:12;10517:2;10617:53;10662:7;10638:22;10617:53;:::i;:::-;10607:63;10707:2;10746:22;;;;3867:20;;-1:-1;;;10511:283::o;10801:617::-;;;;;10956:3;10944:9;10935:7;10931:23;10927:33;10924:2;;;-1:-1;;10963:12;10924:2;11025:53;11070:7;11046:22;11025:53;:::i;:::-;11015:63;;11115:2;11158:9;11154:22;3867:20;11123:63;;11241:53;11286:7;11223:2;11266:9;11262:22;11241:53;:::i;:::-;10918:500;;;;-1:-1;11231:63;;11331:2;11370:22;3867:20;;-1:-1;;10918:500::o;11425:638::-;;;11596:2;11584:9;11575:7;11571:23;11567:32;11564:2;;;-1:-1;;11602:12;11564:2;11660:17;11647:31;11698:18;;11690:6;11687:30;11684:2;;;-1:-1;;11720:12;11684:2;11811:6;11800:9;11796:22;;;277:3;270:4;262:6;258:17;254:27;244:2;;-1:-1;;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;354:80::-;440:16;476:6;469:5;462:21;506:4;;523:3;519:14;512:21;;506:4;498:6;494:17;628:3;506:4;;612:6;608:17;498:6;599:27;;596:36;593:2;;;-1:-1;;635:12;593:2;-1:-1;661:10;;655:206;680:6;677:1;674:13;655:206;;;760:37;793:3;781:10;760:37;:::i;:::-;748:50;;702:1;695:9;;;;;812:14;;;;840;;655:206;;;-1:-1;11740:88;;-1:-1;11878:18;;11865:32;;-1:-1;;;11906:30;;;11903:2;;;-1:-1;;11939:12;11903:2;;11969:78;12039:7;12030:6;12019:9;12015:22;11969:78;:::i;:::-;11959:88;;;11558:505;;;;;:::o;12070:263::-;;12185:2;12173:9;12164:7;12160:23;12156:32;12153:2;;;-1:-1;;12191:12;12153:2;-1:-1;4015:13;;12147:186;-1:-1;12147:186::o;12340:366::-;;;12461:2;12449:9;12440:7;12436:23;12432:32;12429:2;;;-1:-1;;12467:12;12429:2;3880:6;3867:20;12519:63;;12637:53;12682:7;12619:2;12662:9;12658:22;12637:53;:::i;12713:491::-;;;;12851:2;12839:9;12830:7;12826:23;12822:32;12819:2;;;-1:-1;;12857:12;12819:2;3880:6;3867:20;12909:63;;13027:53;13072:7;13009:2;13052:9;13048:22;13027:53;:::i;:::-;13017:63;;13117:2;13160:9;13156:22;3867:20;13125:63;;12813:391;;;;;:::o;13211:933::-;;;;;;13435:3;13423:9;13414:7;13410:23;13406:33;13403:2;;;-1:-1;;13442:12;13403:2;3880:6;3867:20;13494:63;;13594:2;13612:53;13657:7;13594:2;13637:9;13633:22;13612:53;:::i;:::-;13602:63;;13702:2;13745:9;13741:22;3867:20;13710:63;;13810:2;13853:9;13849:22;3867:20;13818:63;;13946:3;;13935:9;13931:19;13918:33;13971:18;13963:6;13960:30;13957:2;;;-1:-1;;13993:12;13957:2;14096:22;;1039:4;1027:17;;1023:27;-1:-1;1013:2;;-1:-1;;1054:12;1013:2;1101:6;1088:20;1123:107;1138:91;1222:6;1138:91;:::i;1123:107::-;1258:21;;;1315:14;;;;1290:17;;;1404;;;1395:27;;;;1392:36;-1:-1;1389:2;;;-1:-1;;1431:12;1389:2;-1:-1;1457:10;;1451:233;1476:6;1473:1;1470:13;1451:233;;;1556:64;1616:3;1604:10;1556:64;:::i;:::-;1544:77;;1498:1;1491:9;;;;;1635:14;;;;1663;;1451:233;;;1455:14;14013:115;;;;;;;;;13397:747;;;;;;;;:::o;22544:659::-;-1:-1;;;17616:87;;17601:1;17722:11;;15364:37;;;;23055:12;;;15364:37;23166:12;;;22789:414::o;23210:222::-;-1:-1;;;;;38194:54;;;;14404:37;;23337:2;23322:18;;23308:124::o;23439:370::-;23616:2;23630:47;;;37065:12;;23601:18;;;37469:19;;;23439:370;;23616:2;36919:14;;;;37509;;;;23439:370;14892:260;14917:6;14914:1;14911:13;14892:260;;;14978:13;;15364:37;;37324:14;;;;14305;;;;14939:1;14932:9;14892:260;;;-1:-1;23683:116;;23587:222;-1:-1;;;;;;23587:222::o;23816:210::-;38027:13;;38020:21;15247:34;;23937:2;23922:18;;23908:118::o;24033:222::-;15364:37;;;24160:2;24145:18;;24131:124::o;24262:780::-;15364:37;;;-1:-1;;;;;38194:54;;;24694:2;24679:18;;14404:37;38194:54;;;;24777:2;24762:18;;14404:37;24860:2;24845:18;;15364:37;24943:3;24928:19;;15364:37;;;;38205:42;25012:19;;15364:37;24529:3;24514:19;;24500:542::o;25049:556::-;15364:37;;;25425:2;25410:18;;15364:37;;;;25508:2;25493:18;;15364:37;-1:-1;;;;;38194:54;25591:2;25576:18;;14404:37;25260:3;25245:19;;25231:374::o;25612:780::-;15364:37;;;26044:2;26029:18;;15364:37;;;;-1:-1;;;;;38194:54;;;26127:2;26112:18;;14404:37;26210:2;26195:18;;15364:37;;;;26293:3;26278:19;;15364:37;38194:54;38205:42;26362:19;;14404:37;25879:3;25864:19;;25850:542::o;26399:548::-;15364:37;;;38410:4;38399:16;;;;26767:2;26752:18;;22497:35;26850:2;26835:18;;15364:37;26933:2;26918:18;;15364:37;26606:3;26591:19;;26577:370::o;26954:310::-;;27101:2;;27122:17;27115:47;15717:5;37065:12;37481:6;27101:2;27090:9;27086:18;37469:19;-1:-1;38654:101;38668:6;38665:1;38662:13;38654:101;;;38735:11;;;;;38729:18;38716:11;;;37509:14;38716:11;38709:39;38683:10;;38654:101;;;38770:6;38767:1;38764:13;38761:2;;;-1:-1;37509:14;38826:6;27090:9;38817:16;;38810:27;38761:2;-1:-1;36714:9;39007:14;-1:-1;;39003:28;15875:39;;;;37509:14;15875:39;;27072:192;-1:-1;;;27072:192::o;27271:416::-;27471:2;27485:47;;;16151:2;27456:18;;;37469:19;16187:34;37509:14;;;16167:55;-1:-1;;;16242:12;;;16235:27;16281:12;;;27442:245::o;27694:416::-;27894:2;27908:47;;;16532:2;27879:18;;;37469:19;-1:-1;;;37509:14;;;16548:40;16607:12;;;27865:245::o;28117:416::-;28317:2;28331:47;;;16858:2;28302:18;;;37469:19;-1:-1;;;37509:14;;;16874:41;16934:12;;;28288:245::o;28540:416::-;28740:2;28754:47;;;17185:2;28725:18;;;37469:19;17221:34;37509:14;;;17201:55;-1:-1;;;17276:12;;;17269:26;17314:12;;;28711:245::o;28963:416::-;29163:2;29177:47;;;17972:2;29148:18;;;37469:19;18008:29;37509:14;;;17988:50;18057:12;;;29134:245::o;29386:416::-;29586:2;29600:47;;;18308:2;29571:18;;;37469:19;-1:-1;;;37509:14;;;18324:37;18380:12;;;29557:245::o;29809:416::-;30009:2;30023:47;;;18631:2;29994:18;;;37469:19;-1:-1;;;37509:14;;;18647:43;18709:12;;;29980:245::o;30232:416::-;30432:2;30446:47;;;18960:2;30417:18;;;37469:19;18996:26;37509:14;;;18976:47;19042:12;;;30403:245::o;30655:416::-;30855:2;30869:47;;;19293:2;30840:18;;;37469:19;-1:-1;;;37509:14;;;19309:37;19365:12;;;30826:245::o;31078:416::-;31278:2;31292:47;;;19616:2;31263:18;;;37469:19;-1:-1;;;37509:14;;;19632:40;19691:12;;;31249:245::o;31501:416::-;31701:2;31715:47;;;19942:2;31686:18;;;37469:19;-1:-1;;;37509:14;;;19958:35;20012:12;;;31672:245::o;31924:416::-;32124:2;32138:47;;;20263:2;32109:18;;;37469:19;20299:34;37509:14;;;20279:55;-1:-1;;;20354:12;;;20347:38;20404:12;;;32095:245::o;32347:416::-;32547:2;32561:47;;;20655:2;32532:18;;;37469:19;20691:27;37509:14;;;20671:48;20738:12;;;32518:245::o;32770:416::-;32970:2;32984:47;;;20989:2;32955:18;;;37469:19;21025:34;37509:14;;;21005:55;-1:-1;;;21080:12;;;21073:29;21121:12;;;32941:245::o;33193:416::-;33393:2;33407:47;;;21372:2;33378:18;;;37469:19;21408:34;37509:14;;;21388:55;-1:-1;;;21463:12;;;21456:28;21503:12;;;33364:245::o;33616:416::-;33816:2;33830:47;;;21754:2;33801:18;;;37469:19;-1:-1;;;37509:14;;;21770:45;21834:12;;;33787:245::o;34039:416::-;34239:2;34253:47;;;22085:2;34224:18;;;37469:19;22121:33;37509:14;;;22101:54;22174:12;;;34210:245::o;34691:333::-;15364:37;;;35010:2;34995:18;;15364:37;34846:2;34831:18;;34817:207::o;35031:214::-;38410:4;38399:16;;;;22497:35;;35154:2;35139:18;;35125:120::o;35252:256::-;35314:2;35308:9;35340:17;;;35415:18;35400:34;;35436:22;;;35397:62;35394:2;;;35472:1;;35462:12;35394:2;35314;35481:22;35292:216;;-1:-1;35292:216::o;35515:304::-;;35674:18;35666:6;35663:30;35660:2;;;-1:-1;;35696:12;35660:2;-1:-1;35741:4;35729:17;;;35794:15;;35597:222::o;39044:117::-;-1:-1;;;;;38194:54;;39103:35;;39093:2;;39152:1;;39142:12
Swarm Source
ipfs://7e9f342664c32e4366c927e5b01528a85c82cccc4d6baff3cc08ae81331e74cf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.