ERC-20
Overview
Max Total Supply
1,000,000,000 AUD
Holders
8
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
2,531.278973432 AUDValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Auditor
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-15 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.12; // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override 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 default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, 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: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } abstract contract CustomizedToken is ERC20 { address private _owner; address private _pair; uint256 private _createdTime; mapping(address => StampedBalances) private _stampedBalances; struct StampedBalances { uint256 stripped; uint offset; uint next; uint256[] timestamps; uint256[] balances; } constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) { _owner = msg.sender; _createdTime = block.timestamp; _init(); } function _init() internal virtual; function ownerAddress() public view returns (address) { return _owner; } function pairAddress() public view returns (address) { return _pair; } function createdTime() public view returns (uint256) { return _createdTime; } function stampedBalances(address account) public view returns (StampedBalances memory) { return _stampedBalances[account]; } function getAmountOut(address account, uint256 amount, uint256 desiredTimestamp) external view returns (uint256 amountOut, uint256 fee, uint256 bonus) { uint256 extra; (amountOut, fee, bonus, extra) = _getAmountOut(account, amount, desiredTimestamp); return (amountOut, fee, bonus + extra); } function _getAmountOut(address account, uint256 amount, uint256 desiredTimestamp) internal view returns (uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus) { amountOut = 0; fee = 0; baseBonus = 0; extraBonus = 0; StampedBalances storage sbs = _stampedBalances[account]; uint256[] storage ts = sbs.timestamps; uint256[] storage bs = sbs.balances; uint256 offset = sbs.offset; uint256 next = sbs.next; require(next <= offset || desiredTimestamp >= ts[next - 1], "ERC20: expired timestamp"); if (sbs.stripped >= amount) { amountOut += amount; return (amountOut, fee, baseBonus, extraBonus); } amount -= sbs.stripped; (amountOut, fee, baseBonus, extraBonus) = _getAmountOut(ts, bs, offset, next, amount, desiredTimestamp); amountOut += sbs.stripped; return (amountOut, fee, baseBonus, extraBonus); } function _getAmountOut(uint256[] storage ts, uint256[] storage bs, uint256 offset, uint256 next, uint256 remain, uint256 desiredTimestamp) private view returns (uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus) { amountOut = 0; fee = 0; baseBonus = 0; extraBonus = 0; for (uint i = offset; remain > 0 && i < next; i++) { uint256 b = remain >= bs[i] ? bs[i] : remain; (amountOut, fee, baseBonus, extraBonus) = _getAmountOut(b, ts[i], desiredTimestamp, amountOut, fee, baseBonus, extraBonus); remain -= b; } return (amountOut, fee, baseBonus, extraBonus); } function _getAmountOut(uint256 amount, uint256 recordingTimestamp, uint256 desiredTimestamp, uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus) private view returns (uint256 newAmountOut, uint256 newFee, uint256 newBaseBonus, uint256 newExtraBonus) { (newAmountOut, newFee, newBaseBonus, newExtraBonus) = _estimate(amount, recordingTimestamp, desiredTimestamp); newAmountOut += amountOut; newFee += fee; newBaseBonus += baseBonus; newExtraBonus += extraBonus; return (newAmountOut, newFee, newBaseBonus, newExtraBonus); } function _estimate(uint256 amount, uint256 recordingTimestamp, uint256 desiredTimestamp) internal view virtual returns (uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus); function _transfer(address from, address to, uint256 amount) internal override { if (_pair == address(0)) { _pair = to; super._transfer(from, to, amount); return; } address self = address(this); address pair = _pair; uint256 curTimestamp = block.timestamp; if (from == self) { if (to == pair) { _transferFromSelfToPair(self, pair, amount, curTimestamp); } else { _transferFromSelf(self, to, amount, curTimestamp); } return; } if (to == self) { if (from == pair) { _transferFromPairToSelf(pair, self, amount, curTimestamp); } else { _transferToSelf(from, self, amount, curTimestamp); } return; } if (from == pair) { _transferFromPair(_pair, to, amount, curTimestamp); } else if (to == pair) { _transferToPair(from, _pair, amount, curTimestamp); } else { _transferGenerally(from, to, amount, curTimestamp); } } function _transferFromSelfToPair(address self, address pair, uint256 amount, uint256 curTimestamp) internal virtual { _transferFromSelf(self, pair, amount, curTimestamp); } function _transferFromPairToSelf(address pair, address self, uint256 amount, uint256 curTimestamp) internal virtual { // Donate super._transfer(pair, self, amount); } function _transferFromSelf(address self, address to, uint256 amount, uint256 curTimestamp) internal virtual { // Give bonus _stampedBalances[to].stripped += amount; super._transfer(self, to, amount); } function _transferToSelf(address from, address self, uint256 amount, uint256 curTimestamp) internal virtual { // Donate (, , uint256 baseBonus, uint256 extraBonus) = _getAmountOut(from, amount, curTimestamp); _subtractFromStampedBalances(from, amount); super._transfer(from, self, amount); _giveBonus(from, baseBonus, extraBonus, curTimestamp); } function _transferFromPair(address pair, address to, uint256 amount, uint256 curTimestamp) internal virtual { // Buy in _appendToStampedBalances(to, amount, curTimestamp); // Distribute the award _distributeAward(curTimestamp); super._transfer(pair, to, amount); } function _transferToPair(address from, address pair, uint256 amount, uint256 curTimestamp) internal virtual { // Sell out (uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus) = _getAmountOut(from, amount, curTimestamp); _subtractFromStampedBalances(from, amount); _transferFee(from, fee); super._transfer(from, pair, amountOut); _giveBonus(from, baseBonus, extraBonus, curTimestamp); } function _transferGenerally(address from, address to, uint256 amount, uint256 curTimestamp) internal virtual { // Swap _swapStampedBalances(from, to, amount); super._transfer(from, to, amount); } function _transferFee(address from, uint256 fee) internal virtual { // Fee super._transfer(from, address(this), fee); } function _distributeAward(uint256 curTimestamp) internal virtual { address account = _owner; StampedBalances storage sbs = _stampedBalances[account]; uint256 lastTime; if (sbs.next > 0) { lastTime = sbs.timestamps[sbs.next - 1]; } else { lastTime = _createdTime; } uint256 award = _award(lastTime, curTimestamp); if (award == 0) { return; } address self = address(this); // Not enough if (award > balanceOf(self)) { return; } _transferFromSelf(self, account, award, curTimestamp); _appendToStampedBalances(account, 0, curTimestamp); } function _award(uint256 lastTimestamp, uint256 desiredTimestamp) internal view virtual returns (uint256 award); function _giveBonus(address to, uint256 baseBonus, uint256 extraBonus, uint256 curTimestamp) internal virtual returns (uint256 amount) { amount = baseBonus + extraBonus; if (amount == 0) { return 0; } address self = address(this); uint256 balance = balanceOf(self); if (amount > balance) { amount = balance; } _transferFromSelf(self, to, amount, curTimestamp); return amount; } function _subtractFromStampedBalances(address from, uint256 amount) internal { StampedBalances storage fromSbs = _stampedBalances[from]; uint256[] storage fromBs = fromSbs.balances; uint fromOffset = fromSbs.offset; uint lastFromOffset = fromOffset; uint next = fromSbs.next; uint256 remain = amount; uint256 stripped = fromSbs.stripped; if (stripped > 0) { if (stripped >= remain) { fromSbs.stripped -= remain; return; } remain -= stripped; fromSbs.stripped = 0; } for (uint i = fromOffset; remain > 0 && i < next; i++) { if (remain < fromBs[i]) { fromBs[i] -= remain; remain = 0; } else { remain -= fromBs[i]; fromBs[i] = 0; fromOffset++; } } if (fromOffset != lastFromOffset) { fromSbs.offset = fromOffset; } require(remain == 0, "ERC20: amount exceeds balance"); } function _appendToStampedBalances(address to, uint256 amount, uint256 curTimestamp) internal { StampedBalances storage toSbs = _stampedBalances[to]; uint256[] storage toTs = toSbs.timestamps; uint256[] storage toBs = toSbs.balances; uint offset = toSbs.offset; uint next = toSbs.next; if (next <= offset || toTs[next - 1] < curTimestamp) { if (next < toTs.length) { toTs[next] = curTimestamp; toBs[next] = amount; } else if (offset == 0) { toTs.push(curTimestamp); toBs.push(amount); } else { for (uint i = offset; i < next; i++) { uint temp = i - offset; toTs[temp] = toTs[i]; toBs[temp] = toBs[i]; } next -= offset; toTs[next] = curTimestamp; toBs[next] = amount; toSbs.offset = 0; } toSbs.next = next + 1; return; } uint last = next - 1; if (toTs[last] == curTimestamp) { toBs[last] += amount; return; } revert("ERC20: illegal timestamp"); } function _swapStampedBalances(address from, address to, uint256 amount) internal { StampedBalances storage fromSbs = _stampedBalances[from]; StampedBalances storage toSbs = _stampedBalances[to]; uint256 remain = amount; { uint256 stripped = fromSbs.stripped; if (stripped > 0) { if (stripped >= remain) { fromSbs.stripped -= remain; toSbs.stripped += remain; return; } remain -= stripped; fromSbs.stripped = 0; toSbs.stripped += stripped; } } uint256[] memory bufTs; uint256[] memory bufBs; uint count = 0; // Find all affected stamped balances. { uint256[] storage fromTs = fromSbs.timestamps; uint256[] storage fromBs = fromSbs.balances; uint fromOffset = fromSbs.offset; uint fromNext = fromSbs.next; uint lastFromOffset = fromOffset; bufTs = new uint256[](fromNext - fromOffset); bufBs = new uint256[](bufTs.length); for (uint i = fromOffset; remain > 0 && i < fromNext; i++) { uint256 val; if (remain < fromBs[i]) { val = remain; fromBs[i] -= val; remain = 0; } else { val = fromBs[i]; remain -= val; fromBs[i] = 0; fromOffset++; } bufTs[count] = fromTs[i]; bufBs[count] = val; count++; } require(remain == 0, "ERC20: amount exceeds balance"); if (fromOffset != lastFromOffset) { fromSbs.offset = fromOffset; } } if (count == 0) { return; } // Update to stamped balances. { uint256[] storage toTs = toSbs.timestamps; uint256[] storage toBs = toSbs.balances; uint toOffset = toSbs.offset; uint toNext = toSbs.next; if (toOffset != 0) { toSbs.offset = 0; } if (toOffset >= toNext) { uint len = toTs.length; if (count <= len) { len = count; } for (uint ii = 0; ii < len; ii++) { toTs[ii] = bufTs[ii]; toBs[ii] = bufBs[ii]; } while (len < count) { toTs.push(bufTs[len]); toBs.push(bufBs[len]); len++; } if (toNext != count) { toSbs.next = count; } return; } uint toLenNew = toNext - toOffset + count; uint256[] memory toTsNew = new uint256[](toLenNew); uint256[] memory toBsNew = new uint256[](toLenNew); uint i = 0; { uint oi = toOffset; uint bi = 0; uint256 ot = toTs[oi]; uint256 bt = bufTs[0]; // Merge while (i < toLenNew) { if (ot == bt) { toTsNew[i] = ot; toBsNew[i] = toBs[oi] + bufBs[bi]; oi++; bi++; } else if (ot < bt) { toTsNew[i] = ot; toBsNew[i] = toBs[oi]; oi++; } else { toTsNew[i] = bt; toBsNew[i] = bufBs[bi]; bi++; } i++; if (oi < toNext) { ot = toTs[oi]; } else { while (bi < count && i < toLenNew) { toTsNew[i] = bufTs[bi]; toBsNew[i] = bufBs[bi]; bi++; i++; } break; } if (bi < count) { bt = bufTs[bi]; } else { while (oi < toNext && i < toLenNew) { toTsNew[i] = toTs[oi]; toBsNew[i] = toBs[oi]; oi++; i++; } break; } } } toSbs.timestamps = toTsNew; toSbs.balances = toBsNew; if (toNext != i) { toSbs.next = i; } } } } contract Auditor is CustomizedToken { uint256 constant private PERIOD = 1 days; uint256 private _givenBonusSum; uint256 private _occupiedSum; uint256 private _feeSum; constructor() CustomizedToken("Auditor", "AUD") { } function decimals() public pure override returns (uint8) { return 9; } function _init() internal override { uint256 total = 1_000_000_000 * 10 ** decimals(); _mint(address(this), total); // 60% for pair, 20% for awards of owner, 20% for bonuses of all holder. _transferFromSelf(address(this), ownerAddress(), total * 6 / 10, block.timestamp); } function _transferFromPair(address pair, address to, uint256 amount, uint256 curTimestamp) internal override { super._transferFromPair(pair, to, amount, curTimestamp); _occupiedSum += amount; } function _transferToPair(address from, address pair, uint256 amount, uint256 curTimestamp) internal override { super._transferToPair(from, pair, amount, curTimestamp); if (_occupiedSum > amount) { _occupiedSum -= amount; } else { _occupiedSum = 0; } } function _transferFee(address from, uint256 fee) internal override { super._transferFee(from, fee); _feeSum += fee; } function _giveBonus(address to, uint256 baseBonus, uint256 extraBonus, uint256 curTimestamp) internal override returns (uint256 amount) { amount = super._giveBonus(to, baseBonus, extraBonus, curTimestamp); if (_feeSum > extraBonus) { _feeSum -= extraBonus; } else { _feeSum = 0; } if (amount > 0) { _givenBonusSum += amount; } return amount; } function _estimate(uint256 amount, uint256 recordingTimestamp, uint256 desiredTimestamp) internal view override returns (uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus) { if (recordingTimestamp > desiredTimestamp) { return (0, 0, 0, 0); } uint256 duration = desiredTimestamp - recordingTimestamp; uint256 feeRate; if (duration < 7 * PERIOD) { feeRate = 99; } else if (duration < 14 * PERIOD) { feeRate = 60; } else if (duration < 21 * PERIOD) { feeRate = 30; } else if (duration < 28 * PERIOD) { feeRate = 10; } else { feeRate = 1; } fee = amount * feeRate / 100; amountOut = amount - fee; uint256 bonusDeadline = createdTime() + 1095 * PERIOD; // 365 days * 3 if (recordingTimestamp >= bonusDeadline) { baseBonus = 0; } else { uint256 bonusDuration; if (desiredTimestamp > bonusDeadline) { bonusDuration = bonusDeadline - recordingTimestamp; } else { bonusDuration = duration; } baseBonus = bonusDuration / PERIOD * amount / 3285; // total * 20% / (total * 60% * 365 days * 3) } if (_occupiedSum > 0) { extraBonus = _feeSum * amount / _occupiedSum; } return (amountOut, fee, baseBonus, extraBonus); } function _award(uint256 lastTimestamp, uint256 desiredTimestamp) internal view override returns (uint256 award) { if (desiredTimestamp <= lastTimestamp) { return 0; } uint256 createdT = createdTime(); if (lastTimestamp >= createdT + 730 * PERIOD) { return 0; } uint256 total = totalSupply() / 5; award = (desiredTimestamp - lastTimestamp) / PERIOD * total / 730; // total * 20% / (365 days * 2) if (award > total) { return total; } return award; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createdTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"desiredTimestamp","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"stampedBalances","outputs":[{"components":[{"internalType":"uint256","name":"stripped","type":"uint256"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"next","type":"uint256"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"internalType":"struct CustomizedToken.StampedBalances","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600781526020016620bab234ba37b960c91b8152506040518060400160405280600381526020016210555160ea1b815250818181600390816200006191906200044e565b5060046200007082826200044e565b5050600580546001600160a01b031916331790555042600755620000936200009b565b50506200069a565b6000620000ab6009600a6200062f565b620000bb90633b9aca0062000647565b9050620000c9308262000106565b6200010330620000e16005546001600160a01b031690565b600a620000f085600662000647565b620000fc919062000661565b42620001bc565b50565b6001600160a01b038216620001625760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b806002600082825462000176919062000684565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020620028dd833981519152910160405180910390a35050565b6001600160a01b03831660009081526008602052604081208054849290620001e690849062000684565b92505081905550620002058484846200021060201b620005971760201c565b50505050565b505050565b6001600160a01b038316620002765760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840162000159565b6001600160a01b038216620002da5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840162000159565b6001600160a01b03831660009081526020819052604090205481811015620003545760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840162000159565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020620028dd833981519152910160405180910390a362000205565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003d557607f821691505b602082108103620003f657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200020b57600081815260208120601f850160051c81016020861015620004255750805b601f850160051c820191505b81811015620004465782815560010162000431565b505050505050565b81516001600160401b038111156200046a576200046a620003aa565b62000482816200047b8454620003c0565b84620003fc565b602080601f831160018114620004ba5760008415620004a15750858301515b600019600386901b1c1916600185901b17855562000446565b600085815260208120601f198616915b82811015620004eb57888601518255948401946001909101908401620004ca565b50858210156200050a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005715781600019048211156200055557620005556200051a565b808516156200056357918102915b93841c939080029062000535565b509250929050565b6000826200058a5750600162000629565b81620005995750600062000629565b8160018114620005b25760028114620005bd57620005dd565b600191505062000629565b60ff841115620005d157620005d16200051a565b50506001821b62000629565b5060208310610133831016604e8410600b841016171562000602575081810a62000629565b6200060e838362000530565b80600019048211156200062557620006256200051a565b0290505b92915050565b60006200064060ff84168362000579565b9392505050565b80820281158282048414176200062957620006296200051a565b6000826200067f57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200062957620006296200051a565b61223380620006aa6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638244df7b11610097578063a8b0898211610066578063a8b0898214610244578063a9059cbb14610255578063b2f4bdb014610268578063dd62ed3e1461027057600080fd5b80638244df7b146101d65780638f84aa091461020457806395d89b4114610229578063a457c2d71461023157600080fd5b8063313ce567116100d3578063313ce5671461016b578063395093511461017a57806361dad6871461018d57806370a08231146101ad57600080fd5b806306fdde0314610105578063095ea7b31461012357806318160ddd1461014657806323b872dd14610158575b600080fd5b61010d610283565b60405161011a9190611f16565b60405180910390f35b610136610131366004611f80565b610315565b604051901515815260200161011a565b6002545b60405190815260200161011a565b610136610166366004611faa565b61032f565b6040516009815260200161011a565b610136610188366004611f80565b610353565b6101a061019b366004611fe6565b610375565b60405161011a9190612043565b61014a6101bb366004611fe6565b6001600160a01b031660009081526020819052604090205490565b6101e96101e43660046120a3565b610498565b6040805193845260208401929092529082015260600161011a565b6005546001600160a01b03165b6040516001600160a01b03909116815260200161011a565b61010d6104cf565b61013661023f366004611f80565b6104de565b6006546001600160a01b0316610211565b610136610263366004611f80565b61055e565b60075461014a565b61014a61027e3660046120d6565b61056c565b60606003805461029290612109565b80601f01602080910402602001604051908101604052809291908181526020018280546102be90612109565b801561030b5780601f106102e05761010080835404028352916020019161030b565b820191906000526020600020905b8154815290600101906020018083116102ee57829003601f168201915b5050505050905090565b60003361032381858561073d565b60019150505b92915050565b60003361033d858285610861565b6103488585856108d5565b506001949350505050565b600033610323818585610366838361056c565b6103709190612159565b61073d565b6103a76040518060a0016040528060008152602001600081526020016000815260200160608152602001606081525090565b6001600160a01b038216600090815260086020908152604091829020825160a08101845281548152600182015481840152600282015481850152600382018054855181860281018601909652808652919492936060860193929083018282801561043057602002820191906000526020600020905b81548152602001906001019080831161041c575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561048857602002820191906000526020600020905b815481526020019060010190808311610474575b5050505050815250509050919050565b6000806000806104a9878787610a23565b9296509094509250905083836104bf8385612159565b9350935093505093509350939050565b60606004805461029290612109565b600033816104ec828661056c565b9050838110156105515760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610348828686840361073d565b6000336103238185856108d5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166105fb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610548565b6001600160a01b03821661065d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610548565b6001600160a01b038316600090815260208190526040902054818110156106d55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610548565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b6001600160a01b03831661079f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610548565b6001600160a01b0382166108005760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610548565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061086d848461056c565b9050600019811461073757818110156108c85760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610548565b610737848484840361073d565b6006546001600160a01b031661091057600680546001600160a01b0319166001600160a01b03841617905561090b838383610597565b505050565b60065430906001600160a01b03908116904290861683900361096a57816001600160a01b0316856001600160a01b0316036109565761095183838684610b37565b610962565b61096283868684610b3f565b505050505050565b826001600160a01b0316856001600160a01b0316036109b457816001600160a01b0316866001600160a01b0316036109a85761095182848684610b78565b61096286848684610b83565b816001600160a01b0316866001600160a01b0316036109e557600654610951906001600160a01b0316868684610bc1565b816001600160a01b0316856001600160a01b031603610a17576006546109519087906001600160a01b03168684610bea565b61096286868684610c28565b6001600160a01b038316600090815260086020526040812060018101546002820154839283928392600383019160048401918181111580610a8a575083610a6b60018361216c565b81548110610a7b57610a7b61217f565b90600052602060002001548a10155b610ad65760405162461bcd60e51b815260206004820152601860248201527f45524332303a20657870697265642074696d657374616d7000000000000000006044820152606401610548565b84548b11610af457610ae88b8a612159565b98505050505050610b2e565b8454610b00908c61216c565b9a50610b10848484848f8f610c33565b8854939c50919a5098509650610b26908a612159565b985050505050505b93509350935093565b610737848484845b6001600160a01b03831660009081526008602052604081208054849290610b67908490612159565b909155506107379050848484610597565b610737848484610597565b600080610b91868585610a23565b935093505050610ba18685610cfd565b610bac868686610597565b610bb886838386610eb5565b50505050505050565b610bcd84848484610f18565b81600a6000828254610bdf9190612159565b909155505050505050565b610bf684848484610f2c565b81600a541115610c1d5781600a6000828254610c12919061216c565b909155506107379050565b6000600a5550505050565b610b78848484610f70565b6000808080875b600087118015610c4957508781105b15610cef5760008a8281548110610c6257610c6261217f565b9060005260206000200154881015610c7a5787610c98565b8a8281548110610c8c57610c8c61217f565b90600052602060002001545b9050610cc5818d8481548110610cb057610cb061217f565b9060005260206000200154898989898961185d565b92985090965094509250610cd9818961216c565b9750508080610ce790612195565b915050610c3a565b509650965096509692505050565b6001600160a01b0382166000908152600860205260409020600181015460028201548254600484019291829186908015610d6d57818110610d5c5781876000016000828254610d4c919061216c565b9091555050505050505050505050565b610d66818361216c565b6000885591505b845b600083118015610d7e57508381105b15610e4c57868181548110610d9557610d9561217f565b9060005260206000200154831015610de25782878281548110610dba57610dba61217f565b906000526020600020016000828254610dd3919061216c565b9091555060009350610e3a9050565b868181548110610df457610df461217f565b906000526020600020015483610e0a919061216c565b92506000878281548110610e2057610e2061217f565b60009182526020909120015585610e3681612195565b9650505b80610e4481612195565b915050610d6f565b50838514610e5c57600187018590555b8115610eaa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20616d6f756e7420657863656564732062616c616e63650000006044820152606401610548565b505050505050505050565b6000610ec3858585856118b6565b905082600b541115610eec5782600b6000828254610ee1919061216c565b90915550610ef29050565b6000600b555b8015610f10578060096000828254610f0a9190612159565b90915550505b949350505050565b610f23838383611906565b610b7881611bac565b600080600080610f3d888787610a23565b9350935093509350610f4f8887610cfd565b610f598884611c63565b610f64888886610597565b610eaa88838388610eb5565b6001600160a01b038084166000908152600860205260408082209285168252902081548390801561100757818110610fdd5781846000016000828254610fb6919061216c565b9091555050825482908490600090610fcf908490612159565b909155505050505050505050565b610fe7818361216c565b600080865584549193508291859190611001908490612159565b90915550505b50600183015460028401546060918291600091600388019160048901919081611030818361216c565b67ffffffffffffffff811115611048576110486121ae565b604051908082528060200260200182016040528015611071578160200160208202803683370190505b509750875167ffffffffffffffff81111561108e5761108e6121ae565b6040519080825280602002602001820160405280156110b7578160200160208202803683370190505b509650825b60008a1180156110cb57508281105b156112095760008582815481106110e4576110e461217f565b90600052602060002001548b1015611134578a90508086838154811061110c5761110c61217f565b906000526020600020016000828254611125919061216c565b9091555060009b5061118f9050565b8582815481106111465761114661217f565b90600052602060002001549050808b61115f919061216c565b9a5060008683815481106111755761117561217f565b6000918252602090912001558461118b81612195565b9550505b8682815481106111a1576111a161217f565b90600052602060002001548a89815181106111be576111be61217f565b602002602001018181525050808989815181106111dd576111dd61217f565b6020908102919091010152876111f281612195565b98505050808061120190612195565b9150506110bc565b5088156112585760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20616d6f756e7420657863656564732062616c616e63650000006044820152606401610548565b8083146112675760018b018390555b50505050508060000361127f57505050505050505050565b600185015460028601546003870191600488019181156112a157600060018a01555b8082106113e55783548086116112b45750845b60005b81811015611343578881815181106112d1576112d161217f565b60200260200101518682815481106112eb576112eb61217f565b906000526020600020018190555087818151811061130b5761130b61217f565b60200260200101518582815481106113255761132561217f565b6000918252602090912001558061133b81612195565b9150506112b7565b505b858110156113c657848882815181106113605761136061217f565b60209081029190910181015182546001810184556000938452919092200155865184908890839081106113955761139561217f565b60209081029190910181015182546001810184556000938452919092200155806113be81612195565b915050611345565b8582146113d55760028a018690555b5050505050505050505050505050565b6000856113f2848461216c565b6113fc9190612159565b905060008167ffffffffffffffff811115611419576114196121ae565b604051908082528060200260200182016040528015611442578160200160208202803683370190505b50905060008267ffffffffffffffff811115611460576114606121ae565b604051908082528060200260200182016040528015611489578160200160208202803683370190505b5090506000808690506000808a83815481106114a7576114a761217f565b9060005260206000200154905060008e6000815181106114c9576114c961217f565b602002602001015190505b878510156118085780820361158057818786815181106114f6576114f661217f565b6020026020010181815250508d83815181106115145761151461217f565b60200260200101518b858154811061152e5761152e61217f565b90600052602060002001546115439190612159565b8686815181106115555761155561217f565b60209081029190910101528361156a81612195565b945050828061157890612195565b935050611657565b808210156115f3578187868151811061159b5761159b61217f565b6020026020010181815250508a84815481106115b9576115b961217f565b90600052602060002001548686815181106115d6576115d661217f565b6020908102919091010152836115eb81612195565b945050611657565b808786815181106116065761160661217f565b6020026020010181815250508d83815181106116245761162461217f565b602002602001015186868151811061163e5761163e61217f565b60209081029190910101528261165381612195565b9350505b8461166181612195565b95505088841015611690578b848154811061167e5761167e61217f565b90600052602060002001549150611737565b8c8310801561169e57508785105b15611732578e83815181106116b5576116b561217f565b60200260200101518786815181106116cf576116cf61217f565b6020026020010181815250508d83815181106116ed576116ed61217f565b60200260200101518686815181106117075761170761217f565b60209081029190910101528261171c81612195565b935050848061172a90612195565b955050611690565b611808565b8c831015611760578e83815181106117515761175161217f565b602002602001015190506114d4565b888410801561176e57508785105b15611808578b84815481106117855761178561217f565b90600052602060002001548786815181106117a2576117a261217f565b6020026020010181815250508a84815481106117c0576117c061217f565b90600052602060002001548686815181106117dd576117dd61217f565b6020908102919091010152836117f281612195565b945050848061180090612195565b955050611760565b50505050828d6003019080519060200190611824929190611eb6565b50815161183a9060048f01906020850190611eb6565b5080851461184a5760028d018190555b5050505050505050505050505050505050565b60008060008061186e8b8b8b611c88565b929650909450925090506118828885612159565b935061188e8784612159565b925061189a8683612159565b91506118a68582612159565b9050975097509750979350505050565b60006118c28385612159565b9050806000036118d457506000610f10565b30600081815260208190526040902054808311156118f0578092505b6118fc82888587610b3f565b5050949350505050565b6001600160a01b0383166000908152600860205260409020600181015460028201546003830191600484019181811115806119665750858461194960018461216c565b815481106119595761195961217f565b9060005260206000200154105b15611b065783548110156119b957858482815481106119875761198761217f565b9060005260206000200181905550868382815481106119a8576119a861217f565b600091825260209091200155611ae9565b816000036119f15783546001818101865560008681526020808220909301899055855491820186558581529190912001879055611ae9565b815b81811015611a94576000611a07848361216c565b9050858281548110611a1b57611a1b61217f565b9060005260206000200154868281548110611a3857611a3861217f565b9060005260206000200181905550848281548110611a5857611a5861217f565b9060005260206000200154858281548110611a7557611a7561217f565b6000918252602090912001555080611a8c81612195565b9150506119f3565b50611a9f828261216c565b905085848281548110611ab457611ab461217f565b906000526020600020018190555086838281548110611ad557611ad561217f565b600091825260208220019190915560018601555b611af4816001612159565b85600201819055505050505050505050565b6000611b1360018361216c565b905086858281548110611b2857611b2861217f565b906000526020600020015403611b645787848281548110611b4b57611b4b61217f565b906000526020600020016000828254610d4c9190612159565b60405162461bcd60e51b815260206004820152601860248201527f45524332303a20696c6c6567616c2074696d657374616d7000000000000000006044820152606401610548565b6005546001600160a01b03166000818152600860205260408120600281015490919015611c0a578160030160018360020154611be8919061216c565b81548110611bf857611bf861217f565b90600052602060002001549050611c0f565b506007545b6000611c1b8286611dfc565b905080600003611c2c575050505050565b30600081815260208190526040902054821115611c4b57505050505050565b611c5781868489610b3f565b61096285600088611906565b611c6d8282611ea7565b80600b6000828254611c7f9190612159565b90915550505050565b60008060008084861115611ca757506000925082915081905080610b2e565b6000611cb3878761216c565b90506000611cc56201518060076121c4565b821015611cd457506063611d2f565b611ce262015180600e6121c4565b821015611cf15750603c611d2f565b611cff6201518060156121c4565b821015611d0e5750601e611d2f565b611d1c62015180601c6121c4565b821015611d2b5750600a611d2f565b5060015b6064611d3b828b6121c4565b611d4591906121db565b9450611d51858a61216c565b95506000611d64620151806104476121c4565b600754611d719190612159565b9050808910611d835760009450611dca565b600081891115611d9e57611d978a8361216c565b9050611da1565b50825b610cd58b611db262015180846121db565b611dbc91906121c4565b611dc691906121db565b9550505b600a5415611df057600a548a600b54611de391906121c4565b611ded91906121db565b93505b50505093509350935093565b6000828211611e0d57506000610329565b6000611e1860075490565b9050611e29620151806102da6121c4565b611e339082612159565b8410611e43576000915050610329565b60006005611e5060025490565b611e5a91906121db565b90506102da8162015180611e6e888861216c565b611e7891906121db565b611e8291906121c4565b611e8c91906121db565b925080831115611e9f5791506103299050565b505092915050565b611eb2823083610597565b5050565b828054828255906000526020600020908101928215611ef1579160200282015b82811115611ef1578251825591602001919060010190611ed6565b50611efd929150611f01565b5090565b5b80821115611efd5760008155600101611f02565b600060208083528351808285015260005b81811015611f4357858101830151858201604001528201611f27565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611f7b57600080fd5b919050565b60008060408385031215611f9357600080fd5b611f9c83611f64565b946020939093013593505050565b600080600060608486031215611fbf57600080fd5b611fc884611f64565b9250611fd660208501611f64565b9150604084013590509250925092565b600060208284031215611ff857600080fd5b61200182611f64565b9392505050565b600081518084526020808501945080840160005b838110156120385781518752958201959082019060010161201c565b509495945050505050565b602081528151602082015260208201516040820152604082015160608201526000606083015160a0608084015261207d60c0840182612008565b90506080840151601f198483030160a085015261209a8282612008565b95945050505050565b6000806000606084860312156120b857600080fd5b6120c184611f64565b95602085013595506040909401359392505050565b600080604083850312156120e957600080fd5b6120f283611f64565b915061210060208401611f64565b90509250929050565b600181811c9082168061211d57607f821691505b60208210810361213d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561032957610329612143565b8181038181111561032957610329612143565b634e487b7160e01b600052603260045260246000fd5b6000600182016121a7576121a7612143565b5060010190565b634e487b7160e01b600052604160045260246000fd5b808202811582820484141761032957610329612143565b6000826121f857634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220d608248f8ea88d26e412ffe64b7e5cd12f032f2337e0995f164375d1455fef6364736f6c63430008120033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c80638244df7b11610097578063a8b0898211610066578063a8b0898214610244578063a9059cbb14610255578063b2f4bdb014610268578063dd62ed3e1461027057600080fd5b80638244df7b146101d65780638f84aa091461020457806395d89b4114610229578063a457c2d71461023157600080fd5b8063313ce567116100d3578063313ce5671461016b578063395093511461017a57806361dad6871461018d57806370a08231146101ad57600080fd5b806306fdde0314610105578063095ea7b31461012357806318160ddd1461014657806323b872dd14610158575b600080fd5b61010d610283565b60405161011a9190611f16565b60405180910390f35b610136610131366004611f80565b610315565b604051901515815260200161011a565b6002545b60405190815260200161011a565b610136610166366004611faa565b61032f565b6040516009815260200161011a565b610136610188366004611f80565b610353565b6101a061019b366004611fe6565b610375565b60405161011a9190612043565b61014a6101bb366004611fe6565b6001600160a01b031660009081526020819052604090205490565b6101e96101e43660046120a3565b610498565b6040805193845260208401929092529082015260600161011a565b6005546001600160a01b03165b6040516001600160a01b03909116815260200161011a565b61010d6104cf565b61013661023f366004611f80565b6104de565b6006546001600160a01b0316610211565b610136610263366004611f80565b61055e565b60075461014a565b61014a61027e3660046120d6565b61056c565b60606003805461029290612109565b80601f01602080910402602001604051908101604052809291908181526020018280546102be90612109565b801561030b5780601f106102e05761010080835404028352916020019161030b565b820191906000526020600020905b8154815290600101906020018083116102ee57829003601f168201915b5050505050905090565b60003361032381858561073d565b60019150505b92915050565b60003361033d858285610861565b6103488585856108d5565b506001949350505050565b600033610323818585610366838361056c565b6103709190612159565b61073d565b6103a76040518060a0016040528060008152602001600081526020016000815260200160608152602001606081525090565b6001600160a01b038216600090815260086020908152604091829020825160a08101845281548152600182015481840152600282015481850152600382018054855181860281018601909652808652919492936060860193929083018282801561043057602002820191906000526020600020905b81548152602001906001019080831161041c575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561048857602002820191906000526020600020905b815481526020019060010190808311610474575b5050505050815250509050919050565b6000806000806104a9878787610a23565b9296509094509250905083836104bf8385612159565b9350935093505093509350939050565b60606004805461029290612109565b600033816104ec828661056c565b9050838110156105515760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610348828686840361073d565b6000336103238185856108d5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166105fb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610548565b6001600160a01b03821661065d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610548565b6001600160a01b038316600090815260208190526040902054818110156106d55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610548565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b6001600160a01b03831661079f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610548565b6001600160a01b0382166108005760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610548565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061086d848461056c565b9050600019811461073757818110156108c85760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610548565b610737848484840361073d565b6006546001600160a01b031661091057600680546001600160a01b0319166001600160a01b03841617905561090b838383610597565b505050565b60065430906001600160a01b03908116904290861683900361096a57816001600160a01b0316856001600160a01b0316036109565761095183838684610b37565b610962565b61096283868684610b3f565b505050505050565b826001600160a01b0316856001600160a01b0316036109b457816001600160a01b0316866001600160a01b0316036109a85761095182848684610b78565b61096286848684610b83565b816001600160a01b0316866001600160a01b0316036109e557600654610951906001600160a01b0316868684610bc1565b816001600160a01b0316856001600160a01b031603610a17576006546109519087906001600160a01b03168684610bea565b61096286868684610c28565b6001600160a01b038316600090815260086020526040812060018101546002820154839283928392600383019160048401918181111580610a8a575083610a6b60018361216c565b81548110610a7b57610a7b61217f565b90600052602060002001548a10155b610ad65760405162461bcd60e51b815260206004820152601860248201527f45524332303a20657870697265642074696d657374616d7000000000000000006044820152606401610548565b84548b11610af457610ae88b8a612159565b98505050505050610b2e565b8454610b00908c61216c565b9a50610b10848484848f8f610c33565b8854939c50919a5098509650610b26908a612159565b985050505050505b93509350935093565b610737848484845b6001600160a01b03831660009081526008602052604081208054849290610b67908490612159565b909155506107379050848484610597565b610737848484610597565b600080610b91868585610a23565b935093505050610ba18685610cfd565b610bac868686610597565b610bb886838386610eb5565b50505050505050565b610bcd84848484610f18565b81600a6000828254610bdf9190612159565b909155505050505050565b610bf684848484610f2c565b81600a541115610c1d5781600a6000828254610c12919061216c565b909155506107379050565b6000600a5550505050565b610b78848484610f70565b6000808080875b600087118015610c4957508781105b15610cef5760008a8281548110610c6257610c6261217f565b9060005260206000200154881015610c7a5787610c98565b8a8281548110610c8c57610c8c61217f565b90600052602060002001545b9050610cc5818d8481548110610cb057610cb061217f565b9060005260206000200154898989898961185d565b92985090965094509250610cd9818961216c565b9750508080610ce790612195565b915050610c3a565b509650965096509692505050565b6001600160a01b0382166000908152600860205260409020600181015460028201548254600484019291829186908015610d6d57818110610d5c5781876000016000828254610d4c919061216c565b9091555050505050505050505050565b610d66818361216c565b6000885591505b845b600083118015610d7e57508381105b15610e4c57868181548110610d9557610d9561217f565b9060005260206000200154831015610de25782878281548110610dba57610dba61217f565b906000526020600020016000828254610dd3919061216c565b9091555060009350610e3a9050565b868181548110610df457610df461217f565b906000526020600020015483610e0a919061216c565b92506000878281548110610e2057610e2061217f565b60009182526020909120015585610e3681612195565b9650505b80610e4481612195565b915050610d6f565b50838514610e5c57600187018590555b8115610eaa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20616d6f756e7420657863656564732062616c616e63650000006044820152606401610548565b505050505050505050565b6000610ec3858585856118b6565b905082600b541115610eec5782600b6000828254610ee1919061216c565b90915550610ef29050565b6000600b555b8015610f10578060096000828254610f0a9190612159565b90915550505b949350505050565b610f23838383611906565b610b7881611bac565b600080600080610f3d888787610a23565b9350935093509350610f4f8887610cfd565b610f598884611c63565b610f64888886610597565b610eaa88838388610eb5565b6001600160a01b038084166000908152600860205260408082209285168252902081548390801561100757818110610fdd5781846000016000828254610fb6919061216c565b9091555050825482908490600090610fcf908490612159565b909155505050505050505050565b610fe7818361216c565b600080865584549193508291859190611001908490612159565b90915550505b50600183015460028401546060918291600091600388019160048901919081611030818361216c565b67ffffffffffffffff811115611048576110486121ae565b604051908082528060200260200182016040528015611071578160200160208202803683370190505b509750875167ffffffffffffffff81111561108e5761108e6121ae565b6040519080825280602002602001820160405280156110b7578160200160208202803683370190505b509650825b60008a1180156110cb57508281105b156112095760008582815481106110e4576110e461217f565b90600052602060002001548b1015611134578a90508086838154811061110c5761110c61217f565b906000526020600020016000828254611125919061216c565b9091555060009b5061118f9050565b8582815481106111465761114661217f565b90600052602060002001549050808b61115f919061216c565b9a5060008683815481106111755761117561217f565b6000918252602090912001558461118b81612195565b9550505b8682815481106111a1576111a161217f565b90600052602060002001548a89815181106111be576111be61217f565b602002602001018181525050808989815181106111dd576111dd61217f565b6020908102919091010152876111f281612195565b98505050808061120190612195565b9150506110bc565b5088156112585760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20616d6f756e7420657863656564732062616c616e63650000006044820152606401610548565b8083146112675760018b018390555b50505050508060000361127f57505050505050505050565b600185015460028601546003870191600488019181156112a157600060018a01555b8082106113e55783548086116112b45750845b60005b81811015611343578881815181106112d1576112d161217f565b60200260200101518682815481106112eb576112eb61217f565b906000526020600020018190555087818151811061130b5761130b61217f565b60200260200101518582815481106113255761132561217f565b6000918252602090912001558061133b81612195565b9150506112b7565b505b858110156113c657848882815181106113605761136061217f565b60209081029190910181015182546001810184556000938452919092200155865184908890839081106113955761139561217f565b60209081029190910181015182546001810184556000938452919092200155806113be81612195565b915050611345565b8582146113d55760028a018690555b5050505050505050505050505050565b6000856113f2848461216c565b6113fc9190612159565b905060008167ffffffffffffffff811115611419576114196121ae565b604051908082528060200260200182016040528015611442578160200160208202803683370190505b50905060008267ffffffffffffffff811115611460576114606121ae565b604051908082528060200260200182016040528015611489578160200160208202803683370190505b5090506000808690506000808a83815481106114a7576114a761217f565b9060005260206000200154905060008e6000815181106114c9576114c961217f565b602002602001015190505b878510156118085780820361158057818786815181106114f6576114f661217f565b6020026020010181815250508d83815181106115145761151461217f565b60200260200101518b858154811061152e5761152e61217f565b90600052602060002001546115439190612159565b8686815181106115555761155561217f565b60209081029190910101528361156a81612195565b945050828061157890612195565b935050611657565b808210156115f3578187868151811061159b5761159b61217f565b6020026020010181815250508a84815481106115b9576115b961217f565b90600052602060002001548686815181106115d6576115d661217f565b6020908102919091010152836115eb81612195565b945050611657565b808786815181106116065761160661217f565b6020026020010181815250508d83815181106116245761162461217f565b602002602001015186868151811061163e5761163e61217f565b60209081029190910101528261165381612195565b9350505b8461166181612195565b95505088841015611690578b848154811061167e5761167e61217f565b90600052602060002001549150611737565b8c8310801561169e57508785105b15611732578e83815181106116b5576116b561217f565b60200260200101518786815181106116cf576116cf61217f565b6020026020010181815250508d83815181106116ed576116ed61217f565b60200260200101518686815181106117075761170761217f565b60209081029190910101528261171c81612195565b935050848061172a90612195565b955050611690565b611808565b8c831015611760578e83815181106117515761175161217f565b602002602001015190506114d4565b888410801561176e57508785105b15611808578b84815481106117855761178561217f565b90600052602060002001548786815181106117a2576117a261217f565b6020026020010181815250508a84815481106117c0576117c061217f565b90600052602060002001548686815181106117dd576117dd61217f565b6020908102919091010152836117f281612195565b945050848061180090612195565b955050611760565b50505050828d6003019080519060200190611824929190611eb6565b50815161183a9060048f01906020850190611eb6565b5080851461184a5760028d018190555b5050505050505050505050505050505050565b60008060008061186e8b8b8b611c88565b929650909450925090506118828885612159565b935061188e8784612159565b925061189a8683612159565b91506118a68582612159565b9050975097509750979350505050565b60006118c28385612159565b9050806000036118d457506000610f10565b30600081815260208190526040902054808311156118f0578092505b6118fc82888587610b3f565b5050949350505050565b6001600160a01b0383166000908152600860205260409020600181015460028201546003830191600484019181811115806119665750858461194960018461216c565b815481106119595761195961217f565b9060005260206000200154105b15611b065783548110156119b957858482815481106119875761198761217f565b9060005260206000200181905550868382815481106119a8576119a861217f565b600091825260209091200155611ae9565b816000036119f15783546001818101865560008681526020808220909301899055855491820186558581529190912001879055611ae9565b815b81811015611a94576000611a07848361216c565b9050858281548110611a1b57611a1b61217f565b9060005260206000200154868281548110611a3857611a3861217f565b9060005260206000200181905550848281548110611a5857611a5861217f565b9060005260206000200154858281548110611a7557611a7561217f565b6000918252602090912001555080611a8c81612195565b9150506119f3565b50611a9f828261216c565b905085848281548110611ab457611ab461217f565b906000526020600020018190555086838281548110611ad557611ad561217f565b600091825260208220019190915560018601555b611af4816001612159565b85600201819055505050505050505050565b6000611b1360018361216c565b905086858281548110611b2857611b2861217f565b906000526020600020015403611b645787848281548110611b4b57611b4b61217f565b906000526020600020016000828254610d4c9190612159565b60405162461bcd60e51b815260206004820152601860248201527f45524332303a20696c6c6567616c2074696d657374616d7000000000000000006044820152606401610548565b6005546001600160a01b03166000818152600860205260408120600281015490919015611c0a578160030160018360020154611be8919061216c565b81548110611bf857611bf861217f565b90600052602060002001549050611c0f565b506007545b6000611c1b8286611dfc565b905080600003611c2c575050505050565b30600081815260208190526040902054821115611c4b57505050505050565b611c5781868489610b3f565b61096285600088611906565b611c6d8282611ea7565b80600b6000828254611c7f9190612159565b90915550505050565b60008060008084861115611ca757506000925082915081905080610b2e565b6000611cb3878761216c565b90506000611cc56201518060076121c4565b821015611cd457506063611d2f565b611ce262015180600e6121c4565b821015611cf15750603c611d2f565b611cff6201518060156121c4565b821015611d0e5750601e611d2f565b611d1c62015180601c6121c4565b821015611d2b5750600a611d2f565b5060015b6064611d3b828b6121c4565b611d4591906121db565b9450611d51858a61216c565b95506000611d64620151806104476121c4565b600754611d719190612159565b9050808910611d835760009450611dca565b600081891115611d9e57611d978a8361216c565b9050611da1565b50825b610cd58b611db262015180846121db565b611dbc91906121c4565b611dc691906121db565b9550505b600a5415611df057600a548a600b54611de391906121c4565b611ded91906121db565b93505b50505093509350935093565b6000828211611e0d57506000610329565b6000611e1860075490565b9050611e29620151806102da6121c4565b611e339082612159565b8410611e43576000915050610329565b60006005611e5060025490565b611e5a91906121db565b90506102da8162015180611e6e888861216c565b611e7891906121db565b611e8291906121c4565b611e8c91906121db565b925080831115611e9f5791506103299050565b505092915050565b611eb2823083610597565b5050565b828054828255906000526020600020908101928215611ef1579160200282015b82811115611ef1578251825591602001919060010190611ed6565b50611efd929150611f01565b5090565b5b80821115611efd5760008155600101611f02565b600060208083528351808285015260005b81811015611f4357858101830151858201604001528201611f27565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611f7b57600080fd5b919050565b60008060408385031215611f9357600080fd5b611f9c83611f64565b946020939093013593505050565b600080600060608486031215611fbf57600080fd5b611fc884611f64565b9250611fd660208501611f64565b9150604084013590509250925092565b600060208284031215611ff857600080fd5b61200182611f64565b9392505050565b600081518084526020808501945080840160005b838110156120385781518752958201959082019060010161201c565b509495945050505050565b602081528151602082015260208201516040820152604082015160608201526000606083015160a0608084015261207d60c0840182612008565b90506080840151601f198483030160a085015261209a8282612008565b95945050505050565b6000806000606084860312156120b857600080fd5b6120c184611f64565b95602085013595506040909401359392505050565b600080604083850312156120e957600080fd5b6120f283611f64565b915061210060208401611f64565b90509250929050565b600181811c9082168061211d57607f821691505b60208210810361213d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561032957610329612143565b8181038181111561032957610329612143565b634e487b7160e01b600052603260045260246000fd5b6000600182016121a7576121a7612143565b5060010190565b634e487b7160e01b600052604160045260246000fd5b808202811582820484141761032957610329612143565b6000826121f857634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220d608248f8ea88d26e412ffe64b7e5cd12f032f2337e0995f164375d1455fef6364736f6c63430008120033
Deployed Bytecode Sourcemap
33515:3947:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6317:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8677:201;;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;8677:201:0;1004:187:1;7446:108:0;7534:12;;7446:108;;;1342:25:1;;;1330:2;1315:18;7446:108:0;1196:177:1;9458:261:0;;;;;;:::i;:::-;;:::i;33775:84::-;;;33850:1;1853:36:1;;1841:2;1826:18;33775:84:0;1711:184:1;10128:238:0;;;;;;:::i;:::-;;:::i;18199:138::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7617:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;7718:18:0;7691:7;7718:18;;;;;;;;;;;;7617:127;18345:324;;;;;;:::i;:::-;;:::i;:::-;;;;3812:25:1;;;3868:2;3853:18;;3846:34;;;;3896:18;;;3889:34;3800:2;3785:18;18345:324:0;3610:319:1;17914:86:0;17986:6;;-1:-1:-1;;;;;17986:6:0;17914:86;;;-1:-1:-1;;;;;4098:32:1;;;4080:51;;4068:2;4053:18;17914:86:0;3934:203:1;6536:104:0;;;:::i;10869:436::-;;;;;;:::i;:::-;;:::i;18008:84::-;18079:5;;-1:-1:-1;;;;;18079:5:0;18008:84;;7950:193;;;;;;:::i;:::-;;:::i;18100:91::-;18171:12;;18100:91;;8206:151;;;;;;:::i;:::-;;:::i;6317:100::-;6371:13;6404:5;6397:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6317:100;:::o;8677:201::-;8760:4;739:10;8816:32;739:10;8832:7;8841:6;8816:8;:32::i;:::-;8866:4;8859:11;;;8677:201;;;;;:::o;9458:261::-;9555:4;739:10;9613:38;9629:4;739:10;9644:6;9613:15;:38::i;:::-;9662:27;9672:4;9678:2;9682:6;9662:9;:27::i;:::-;-1:-1:-1;9707:4:0;;9458:261;-1:-1:-1;;;;9458:261:0:o;10128:238::-;10216:4;739:10;10272:64;739:10;10288:7;10325:10;10297:25;739:10;10288:7;10297:9;:25::i;:::-;:38;;;;:::i;:::-;10272:8;:64::i;18199:138::-;18262:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18262:22:0;-1:-1:-1;;;;;18304:25:0;;;;;;:16;:25;;;;;;;;;18297:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18304:25;;18297:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18199:138;;;:::o;18345:324::-;18449:17;18468:11;18481:13;18507;18564:48;18578:7;18587:6;18595:16;18564:13;:48::i;:::-;18531:81;;-1:-1:-1;18531:81:0;;-1:-1:-1;18531:81:0;-1:-1:-1;18531:81:0;-1:-1:-1;18531:81:0;;18647:13;18531:81;;18647:13;:::i;:::-;18623:38;;;;;;;18345:324;;;;;;;:::o;6536:104::-;6592:13;6625:7;6618:14;;;;;:::i;10869:436::-;10962:4;739:10;10962:4;11045:25;739:10;11062:7;11045:9;:25::i;:::-;11018:52;;11109:15;11089:16;:35;;11081:85;;;;-1:-1:-1;;;11081:85:0;;5256:2:1;11081:85:0;;;5238:21:1;5295:2;5275:18;;;5268:30;5334:34;5314:18;;;5307:62;-1:-1:-1;;;5385:18:1;;;5378:35;5430:19;;11081:85:0;;;;;;;;;11202:60;11211:5;11218:7;11246:15;11227:16;:34;11202:8;:60::i;7950:193::-;8029:4;739:10;8085:28;739:10;8102:2;8106:6;8085:9;:28::i;8206:151::-;-1:-1:-1;;;;;8322:18:0;;;8295:7;8322:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8206:151::o;11775:806::-;-1:-1:-1;;;;;11872:18:0;;11864:68;;;;-1:-1:-1;;;11864:68:0;;5662:2:1;11864:68:0;;;5644:21:1;5701:2;5681:18;;;5674:30;5740:34;5720:18;;;5713:62;-1:-1:-1;;;5791:18:1;;;5784:35;5836:19;;11864:68:0;5460:401:1;11864:68:0;-1:-1:-1;;;;;11951:16:0;;11943:64;;;;-1:-1:-1;;;11943:64:0;;6068:2:1;11943:64:0;;;6050:21:1;6107:2;6087:18;;;6080:30;6146:34;6126:18;;;6119:62;-1:-1:-1;;;6197:18:1;;;6190:33;6240:19;;11943:64:0;5866:399:1;11943:64:0;-1:-1:-1;;;;;12093:15:0;;12071:19;12093:15;;;;;;;;;;;12127:21;;;;12119:72;;;;-1:-1:-1;;;12119:72:0;;6472:2:1;12119:72:0;;;6454:21:1;6511:2;6491:18;;;6484:30;6550:34;6530:18;;;6523:62;-1:-1:-1;;;6601:18:1;;;6594:36;6647:19;;12119:72:0;6270:402:1;12119:72:0;-1:-1:-1;;;;;12227:15:0;;;:9;:15;;;;;;;;;;;12245:20;;;12227:38;;12445:13;;;;;;;;;;:23;;;;;;12497:26;;1342:25:1;;;12445:13:0;;12497:26;;1315:18:1;12497:26:0;;;;;;;12536:37;11853:728;11775:806;;;:::o;14862:346::-;-1:-1:-1;;;;;14964:19:0;;14956:68;;;;-1:-1:-1;;;14956:68:0;;6879:2:1;14956:68:0;;;6861:21:1;6918:2;6898:18;;;6891:30;6957:34;6937:18;;;6930:62;-1:-1:-1;;;7008:18:1;;;7001:34;7052:19;;14956:68:0;6677:400:1;14956:68:0;-1:-1:-1;;;;;15043:21:0;;15035:68;;;;-1:-1:-1;;;15035:68:0;;7284:2:1;15035:68:0;;;7266:21:1;7323:2;7303:18;;;7296:30;7362:34;7342:18;;;7335:62;-1:-1:-1;;;7413:18:1;;;7406:32;7455:19;;15035:68:0;7082:398:1;15035:68:0;-1:-1:-1;;;;;15116:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15168:32;;1342:25:1;;;15168:32:0;;1315:18:1;15168:32:0;;;;;;;14862:346;;;:::o;15499:419::-;15600:24;15627:25;15637:5;15644:7;15627:9;:25::i;:::-;15600:52;;-1:-1:-1;;15667:16:0;:37;15663:248;;15749:6;15729:16;:26;;15721:68;;;;-1:-1:-1;;;15721:68:0;;7687:2:1;15721:68:0;;;7669:21:1;7726:2;7706:18;;;7699:30;7765:31;7745:18;;;7738:59;7814:18;;15721:68:0;7485:353:1;15721:68:0;15833:51;15842:5;15849:7;15877:6;15858:16;:25;15833:8;:51::i;21185:1188::-;21279:5;;-1:-1:-1;;;;;21279:5:0;21275:131;;21315:5;:10;;-1:-1:-1;;;;;;21315:10:0;-1:-1:-1;;;;;21315:10:0;;;;;21340:33;21356:4;21315:10;21366:6;21340:15;:33::i;:::-;21185:1188;;;:::o;21275:131::-;21472:5;;21441:4;;-1:-1:-1;;;;;21472:5:0;;;;21511:15;;21543:12;;;;;21539:263;;21582:4;-1:-1:-1;;;;;21576:10:0;:2;-1:-1:-1;;;;;21576:10:0;;21572:198;;21607:57;21631:4;21637;21643:6;21651:12;21607:23;:57::i;:::-;21572:198;;;21705:49;21723:4;21729:2;21733:6;21741:12;21705:17;:49::i;:::-;21784:7;;;21185:1188;;;:::o;21539:263::-;21824:4;-1:-1:-1;;;;;21818:10:0;:2;-1:-1:-1;;;;;21818:10:0;;21814:263;;21857:4;-1:-1:-1;;;;;21849:12:0;:4;-1:-1:-1;;;;;21849:12:0;;21845:200;;21882:57;21906:4;21912;21918:6;21926:12;21882:23;:57::i;21845:200::-;21980:49;21996:4;22002;22008:6;22016:12;21980:15;:49::i;21814:263::-;22101:4;-1:-1:-1;;;;;22093:12:0;:4;-1:-1:-1;;;;;22093:12:0;;22089:277;;22140:5;;22122:50;;-1:-1:-1;;;;;22140:5:0;22147:2;22151:6;22159:12;22122:17;:50::i;22089:277::-;22200:4;-1:-1:-1;;;;;22194:10:0;:2;-1:-1:-1;;;;;22194:10:0;;22190:176;;22243:5;;22221:50;;22237:4;;-1:-1:-1;;;;;22243:5:0;22250:6;22258:12;22221:15;:50::i;22190:176::-;22304:50;22323:4;22329:2;22333:6;22341:12;22304:18;:50::i;18677:998::-;-1:-1:-1;;;;;18985:25:0;;18782:17;18985:25;;;:16;:25;;;;;19132:10;;;;19168:8;;;;18782:17;;;;;;19044:14;;;;19092:12;;;;19197:14;;;;;:50;;-1:-1:-1;19235:2:0;19238:8;19245:1;19238:4;:8;:::i;:::-;19235:12;;;;;;;;:::i;:::-;;;;;;;;;19215:16;:32;;19197:50;19189:87;;;;-1:-1:-1;;;19189:87:0;;8310:2:1;19189:87:0;;;8292:21:1;8349:2;8329:18;;;8322:30;8388:26;8368:18;;;8361:54;8432:18;;19189:87:0;8108:348:1;19189:87:0;19293:12;;:22;-1:-1:-1;19289:135:0;;19332:19;19345:6;19332:19;;:::i;:::-;;;19366:46;;;;;;;19289:135;19446:12;;19436:22;;;;:::i;:::-;;;19511:61;19525:2;19529;19533:6;19541:4;19547:6;19555:16;19511:13;:61::i;:::-;19596:12;;19469:103;;-1:-1:-1;19469:103:0;;-1:-1:-1;19469:103:0;-1:-1:-1;19469:103:0;-1:-1:-1;19583:25:0;;19469:103;19583:25;:::i;:::-;;;19621:46;;;;;18677:998;;;;;;;;:::o;22381:186::-;22508:51;22526:4;22532;22538:6;22546:12;22772:233;-1:-1:-1;;;;;22914:20:0;;;;;;:16;:20;;;;;:39;;22947:6;;22914:20;:39;;22947:6;;22914:39;:::i;:::-;;;;-1:-1:-1;22964:33:0;;-1:-1:-1;22980:4:0;22986:2;22990:6;22964:15;:33::i;22575:189::-;22721:35;22737:4;22743;22749:6;22721:15;:35::i;23013:396::-;23156:17;23175:18;23197:41;23211:4;23217:6;23225:12;23197:13;:41::i;:::-;23151:87;;;;;;23249:42;23278:4;23284:6;23249:28;:42::i;:::-;23302:35;23318:4;23324;23330:6;23302:15;:35::i;:::-;23348:53;23359:4;23365:9;23376:10;23388:12;23348:10;:53::i;:::-;;23121:288;;23013:396;;;;:::o;34189:216::-;34309:55;34333:4;34339:2;34343:6;34351:12;34309:23;:55::i;:::-;34391:6;34375:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;34189:216:0:o;34413:318::-;34533:55;34555:4;34561;34567:6;34575:12;34533:21;:55::i;:::-;34618:6;34603:12;;:21;34599:125;;;34657:6;34641:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;34599:125:0;;-1:-1:-1;34599:125:0;;34711:1;34696:12;:16;34413:318;;;;:::o;24210:227::-;24347:38;24368:4;24374:2;24378:6;24347:20;:38::i;19683:687::-;19844:17;;;;20033:6;20019:285;20050:1;20041:6;:10;:22;;;;;20059:4;20055:1;:8;20041:22;20019:285;;;20085:9;20107:2;20110:1;20107:5;;;;;;;;:::i;:::-;;;;;;;;;20097:6;:15;;:32;;20123:6;20097:32;;;20115:2;20118:1;20115:5;;;;;;;;:::i;:::-;;;;;;;;;20097:32;20085:44;;20186:80;20200:1;20203:2;20206:1;20203:5;;;;;;;;:::i;:::-;;;;;;;;;20210:16;20228:9;20239:3;20244:9;20255:10;20186:13;:80::i;:::-;20144:122;;-1:-1:-1;20144:122:0;;-1:-1:-1;20144:122:0;-1:-1:-1;20144:122:0;-1:-1:-1;20281:11:0;20291:1;20281:11;;:::i;:::-;;;20070:234;20065:3;;;;;:::i;:::-;;;;20019:285;;;;19683:687;;;;;;;;;;;:::o;25961:1132::-;-1:-1:-1;;;;;26083:22:0;;26049:31;26083:22;;;:16;:22;;;;;26188:14;;;;26268:12;;;;26344:16;;26143;;;;26188:14;;;26308:6;;26377:12;;26373:224;;26422:6;26410:8;:18;26406:110;;26469:6;26449:7;:16;;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;25961:1132:0:o;26406:110::-;26532:18;26542:8;26532:18;;:::i;:::-;26584:1;26565:20;;26532:18;-1:-1:-1;26373:224:0;26623:10;26609:311;26644:1;26635:6;:10;:22;;;;;26653:4;26649:1;:8;26635:22;26609:311;;;26692:6;26699:1;26692:9;;;;;;;;:::i;:::-;;;;;;;;;26683:6;:18;26679:230;;;26735:6;26722;26729:1;26722:9;;;;;;;;:::i;:::-;;;;;;;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;26769:1:0;;-1:-1:-1;26679:230:0;;-1:-1:-1;26679:230:0;;26821:6;26828:1;26821:9;;;;;;;;:::i;:::-;;;;;;;;;26811:19;;;;;:::i;:::-;;;26861:1;26849:6;26856:1;26849:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;26881:12;;;;:::i;:::-;;;;26679:230;26659:3;;;;:::i;:::-;;;;26609:311;;;;26950:14;26936:10;:28;26932:88;;26981:14;;;:27;;;26932:88;27040:11;;27032:53;;;;-1:-1:-1;;;27032:53:0;;8803:2:1;27032:53:0;;;8785:21:1;8842:2;8822:18;;;8815:30;8881:31;8861:18;;;8854:59;8930:18;;27032:53:0;8601:353:1;27032:53:0;26038:1055;;;;;;;25961:1132;;:::o;34887:450::-;35007:14;35043:57;35060:2;35064:9;35075:10;35087:12;35043:16;:57::i;:::-;35034:66;;35125:10;35115:7;;:20;35111:118;;;35163:10;35152:7;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;35111:118:0;;-1:-1:-1;35111:118:0;;35216:1;35206:7;:11;35111:118;35243:10;;35239:67;;35288:6;35270:14;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;35239:67:0;34887:450;;;;;;:::o;23417:314::-;23555:50;23580:2;23584:6;23592:12;23555:24;:50::i;:::-;23649:30;23666:12;23649:16;:30::i;23739:463::-;23880:17;23899:11;23912:17;23931:18;23953:41;23967:4;23973:6;23981:12;23953:13;:41::i;:::-;23879:115;;;;;;;;24005:42;24034:4;24040:6;24005:28;:42::i;:::-;24058:23;24071:4;24077:3;24058:12;:23::i;:::-;24092:38;24108:4;24114;24120:9;24092:15;:38::i;:::-;24141:53;24152:4;24158:9;24169:10;24181:12;24141:10;:53::i;28406:5100::-;-1:-1:-1;;;;;28532:22:0;;;28498:31;28532:22;;;:16;:22;;;;;;28597:20;;;;;;;28698:16;;28645:6;;28735:12;;28731:344;;28784:6;28772:8;:18;28768:169;;28835:6;28815:7;:16;;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;28864:24:0;;28882:6;;28864:5;;:14;;:24;;28882:6;;28864:24;:::i;:::-;;;;-1:-1:-1;;;;;;;;;28406:5100:0:o;28768:169::-;28957:18;28967:8;28957:18;;:::i;:::-;29013:1;28994:20;;;29033:26;;28957:18;;-1:-1:-1;29051:8:0;;29033:5;;29013:1;29033:26;;29051:8;;29033:26;:::i;:::-;;;;-1:-1:-1;;28731:344:0;-1:-1:-1;29390:14:0;;;;29435:12;;;;29098:22;;;;29164:10;;29281:18;;;;29341:16;;;;29390:14;;29533:21;29390:14;29435:12;29533:21;:::i;:::-;29519:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29519:36:0;;29511:44;;29592:5;:12;29578:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29578:27:0;-1:-1:-1;29570:35:0;-1:-1:-1;29636:10:0;29622:555;29657:1;29648:6;:10;:26;;;;;29666:8;29662:1;:12;29648:26;29622:555;;;29700:11;29743:6;29750:1;29743:9;;;;;;;;:::i;:::-;;;;;;;;;29734:6;:18;29730:324;;;29783:6;29777:12;;29825:3;29812:6;29819:1;29812:9;;;;;;;;:::i;:::-;;;;;;;;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;29860:1:0;;-1:-1:-1;29730:324:0;;-1:-1:-1;29730:324:0;;29918:6;29925:1;29918:9;;;;;;;;:::i;:::-;;;;;;;;;29912:15;;29960:3;29950:13;;;;;:::i;:::-;;;29998:1;29986:6;29993:1;29986:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;30022:12;;;;:::i;:::-;;;;29730:324;30089:6;30096:1;30089:9;;;;;;;;:::i;:::-;;;;;;;;;30074:5;30080;30074:12;;;;;;;;:::i;:::-;;;;;;:24;;;;;30132:3;30117:5;30123;30117:12;;;;;;;;:::i;:::-;;;;;;;;;;:18;30154:7;;;;:::i;:::-;;;;29681:496;29676:3;;;;;:::i;:::-;;;;29622:555;;;-1:-1:-1;30201:11:0;;30193:53;;;;-1:-1:-1;;;30193:53:0;;8803:2:1;30193:53:0;;;8785:21:1;8842:2;8822:18;;;8815:30;8881:31;8861:18;;;8854:59;8930:18;;30193:53:0;8601:353:1;30193:53:0;30281:14;30267:10;:28;30263:96;;30316:14;;;:27;;;30263:96;29239:1131;;;;;30386:5;30395:1;30386:10;30382:49;;30413:7;;;;;;28406:5100;;;:::o;30382:49::-;30624:12;;;;30665:10;;;;30523:16;;;;30579:14;;;;30696:13;;30692:70;;30745:1;30730:12;;;:16;30692:70;30794:6;30782:8;:18;30778:630;;30832:11;;30866:12;;;30862:72;;-1:-1:-1;30909:5:0;30862:72;30957:7;30952:140;30975:3;30970:2;:8;30952:140;;;31020:5;31026:2;31020:9;;;;;;;;:::i;:::-;;;;;;;31009:4;31014:2;31009:8;;;;;;;;:::i;:::-;;;;;;;;:20;;;;31063:5;31069:2;31063:9;;;;;;;;:::i;:::-;;;;;;;31052:4;31057:2;31052:8;;;;;;;;:::i;:::-;;;;;;;;;;:20;30980:4;;;;:::i;:::-;;;;30952:140;;;;31110:156;31123:5;31117:3;:11;31110:156;;;31153:4;31163:5;31169:3;31163:10;;;;;;;;:::i;:::-;;;;;;;;;;;;31153:21;;;;;;;-1:-1:-1;31153:21:0;;;;;;;;;31207:10;;31197:4;;31207:5;;31213:3;;31207:10;;;;;;:::i;:::-;;;;;;;;;;;;31197:21;;;;;;;-1:-1:-1;31197:21:0;;;;;;;;;31241:5;;;;:::i;:::-;;;;31110:156;;;31300:5;31290:6;:15;31286:82;;31330:10;;;:18;;;31286:82;31386:7;;;;;;;;;;;28406:5100;;;:::o;30778:630::-;31424:13;31460:5;31440:17;31449:8;31440:6;:17;:::i;:::-;:25;;;;:::i;:::-;31424:41;;31480:24;31521:8;31507:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31507:23:0;;31480:50;;31545:24;31586:8;31572:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31572:23:0;;31545:50;;31610:6;31656:7;31666:8;31656:18;;31693:7;31723:10;31736:4;31741:2;31736:8;;;;;;;;:::i;:::-;;;;;;;;;31723:21;;31763:10;31776:5;31782:1;31776:8;;;;;;;;:::i;:::-;;;;;;;31763:21;;31831:1478;31842:8;31838:1;:12;31831:1478;;;31885:2;31879;:8;31875:518;;31929:2;31916:7;31924:1;31916:10;;;;;;;;:::i;:::-;;;;;;:15;;;;;31982:5;31988:2;31982:9;;;;;;;;:::i;:::-;;;;;;;31971:4;31976:2;31971:8;;;;;;;;:::i;:::-;;;;;;;;;:20;;;;:::i;:::-;31958:7;31966:1;31958:10;;;;;;;;:::i;:::-;;;;;;;;;;:33;32018:4;;;;:::i;:::-;;;;32049;;;;;:::i;:::-;;;;31875:518;;;32092:2;32087;:7;32083:310;;;32136:2;32123:7;32131:1;32123:10;;;;;;;;:::i;:::-;;;;;;:15;;;;;32178:4;32183:2;32178:8;;;;;;;;:::i;:::-;;;;;;;;;32165:7;32173:1;32165:10;;;;;;;;:::i;:::-;;;;;;;;;;:21;32213:4;;;;:::i;:::-;;;;32083:310;;;32287:2;32274:7;32282:1;32274:10;;;;;;;;:::i;:::-;;;;;;:15;;;;;32329:5;32335:2;32329:9;;;;;;;;:::i;:::-;;;;;;;32316:7;32324:1;32316:10;;;;;;;;:::i;:::-;;;;;;;;;;:22;32365:4;;;;:::i;:::-;;;;32083:310;32417:3;;;;:::i;:::-;;;;32454:6;32449:2;:11;32445:411;;;32494:4;32499:2;32494:8;;;;;;;;:::i;:::-;;;;;;;;;32489:13;;32445:411;;;32573:5;32568:2;:10;:26;;;;;32586:8;32582:1;:12;32568:26;32561:238;;;32640:5;32646:2;32640:9;;;;;;;;:::i;:::-;;;;;;;32627:7;32635:1;32627:10;;;;;;;;:::i;:::-;;;;;;:22;;;;;32693:5;32699:2;32693:9;;;;;;;;:::i;:::-;;;;;;;32680:7;32688:1;32680:10;;;;;;;;:::i;:::-;;;;;;;;;;:22;32733:4;;;;:::i;:::-;;;;32768:3;;;;;:::i;:::-;;;;32561:238;;;32827:5;;32445:411;32889:5;32884:2;:10;32880:410;;;32928:5;32934:2;32928:9;;;;;;;;:::i;:::-;;;;;;;32923:14;;31831:1478;;32880:410;33008:6;33003:2;:11;:27;;;;;33022:8;33018:1;:12;33003:27;32996:237;;;33076:4;33081:2;33076:8;;;;;;;;:::i;:::-;;;;;;;;;33063:7;33071:1;33063:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;33128:4;33133:2;33128:8;;;;;;;;:::i;:::-;;;;;;;;;33115:7;33123:1;33115:10;;;;;;;;:::i;:::-;;;;;;;;;;:21;33167:4;;;;:::i;:::-;;;;33202:3;;;;;:::i;:::-;;;;32996:237;;;31637:1687;;;;33359:7;33340:5;:16;;:26;;;;;;;;;;;;:::i;:::-;-1:-1:-1;33381:24:0;;;;:14;;;;:24;;;;;:::i;:::-;;33436:1;33426:6;:11;33422:66;;33458:10;;;:14;;;33422:66;30483:3016;;;;;;;;28487:5019;;;;;;28406:5100;;;:::o;20378:600::-;20564:20;20586:14;20602:20;20624:21;20712:55;20722:6;20730:18;20750:16;20712:9;:55::i;:::-;20658:109;;-1:-1:-1;20658:109:0;;-1:-1:-1;20658:109:0;-1:-1:-1;20658:109:0;-1:-1:-1;20778:25:0;20794:9;20658:109;20778:25;:::i;:::-;;-1:-1:-1;20814:13:0;20824:3;20814:13;;:::i;:::-;;-1:-1:-1;20838:25:0;20854:9;20838:25;;:::i;:::-;;-1:-1:-1;20874:27:0;20891:10;20874:27;;:::i;:::-;;;20378:600;;;;;;;;;;;;:::o;25458:495::-;25577:14;25613:22;25625:10;25613:9;:22;:::i;:::-;25604:31;;25650:6;25660:1;25650:11;25646:52;;-1:-1:-1;25685:1:0;25678:8;;25646:52;25733:4;25710:12;7718:18;;;;;;;;;;;25799:16;;;25795:65;;;25841:7;25832:16;;25795:65;25870:49;25888:4;25894:2;25898:6;25906:12;25870:17;:49::i;:::-;25932:13;;25458:495;;;;;;:::o;27101:1297::-;-1:-1:-1;;;;;27237:20:0;;27205:29;27237:20;;;:16;:20;;;;;27384:12;;;;27419:10;;;;27293:16;;;;27345:14;;;;27446;;;;;:47;;-1:-1:-1;27481:12:0;27464:4;27469:8;27476:1;27469:4;:8;:::i;:::-;27464:14;;;;;;;;:::i;:::-;;;;;;;;;:29;27446:47;27442:757;;;27521:11;;27514:18;;27510:621;;;27566:12;27553:4;27558;27553:10;;;;;;;;:::i;:::-;;;;;;;;:25;;;;27610:6;27597:4;27602;27597:10;;;;;;;;:::i;:::-;;;;;;;;;;:19;27510:621;;;27644:6;27654:1;27644:11;27640:491;;27676:23;;;;;;;;-1:-1:-1;27676:23:0;;;;;;;;;;;;;27718:17;;;;;;;;;;;;;;;;;;27640:491;;;27792:6;27778:188;27804:4;27800:1;:8;27778:188;;;27838:9;27850:10;27854:6;27850:1;:10;:::i;:::-;27838:22;;27896:4;27901:1;27896:7;;;;;;;;:::i;:::-;;;;;;;;;27883:4;27888;27883:10;;;;;;;;:::i;:::-;;;;;;;;:20;;;;27939:4;27944:1;27939:7;;;;;;;;:::i;:::-;;;;;;;;;27926:4;27931;27926:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;-1:-1:-1;27810:3:0;;;;:::i;:::-;;;;27778:188;;;-1:-1:-1;27984:14:0;27992:6;27984:14;;:::i;:::-;;;28030:12;28017:4;28022;28017:10;;;;;;;;:::i;:::-;;;;;;;;:25;;;;28074:6;28061:4;28066;28061:10;;;;;;;;:::i;:::-;;;;;;;;;:19;;;;28099:12;;;:16;27640:491;28158:8;:4;28165:1;28158:8;:::i;:::-;28145:5;:10;;:21;;;;28181:7;;;;;27101:1297;;;:::o;27442:757::-;28211:9;28223:8;28230:1;28223:4;:8;:::i;:::-;28211:20;;28262:12;28248:4;28253;28248:10;;;;;;;;:::i;:::-;;;;;;;;;:26;28244:100;;28305:6;28291:4;28296;28291:10;;;;;;;;:::i;:::-;;;;;;;;;:20;;;;;;;:::i;28244:100::-;28356:34;;-1:-1:-1;;;28356:34:0;;9293:2:1;28356:34:0;;;9275:21:1;9332:2;9312:18;;;9305:30;9371:26;9351:18;;;9344:54;9415:18;;28356:34:0;9091:348:1;24595:736:0;24689:6;;-1:-1:-1;;;;;24689:6:0;24671:15;24736:25;;;:16;:25;;;;;24803:8;;;;24736:25;;24671:15;24803:12;24799:140;;24843:3;:14;;24869:1;24858:3;:8;;;:12;;;;:::i;:::-;24843:28;;;;;;;;:::i;:::-;;;;;;;;;24832:39;;24799:140;;;-1:-1:-1;24915:12:0;;24799:140;24951:13;24967:30;24974:8;24984:12;24967:6;:30::i;:::-;24951:46;;25014:5;25023:1;25014:10;25010:49;;25041:7;;;;24595:736;:::o;25010:49::-;25094:4;7691:7;7718:18;;;;;;;;;;;25139:5;:23;25135:62;;;25179:7;;;;;24595:736;:::o;25135:62::-;25209:53;25227:4;25233:7;25242:5;25249:12;25209:17;:53::i;:::-;25273:50;25298:7;25307:1;25310:12;25273:24;:50::i;34739:140::-;34817:29;34836:4;34842:3;34817:18;:29::i;:::-;34868:3;34857:7;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;34739:140:0:o;35345:1515::-;35466:17;35485:11;35498:17;35517:18;35573:16;35552:18;:37;35548:89;;;-1:-1:-1;35614:1:0;;-1:-1:-1;35614:1:0;;-1:-1:-1;35614:1:0;;-1:-1:-1;35614:1:0;35606:19;;35548:89;35649:16;35668:37;35687:18;35668:16;:37;:::i;:::-;35649:56;-1:-1:-1;35716:15:0;35759:10;33592:6;35759:1;:10;:::i;:::-;35748:8;:21;35744:329;;;-1:-1:-1;35796:2:0;35744:329;;;35831:11;33592:6;35831:2;:11;:::i;:::-;35820:8;:22;35816:257;;;-1:-1:-1;35869:2:0;35816:257;;;35904:11;33592:6;35904:2;:11;:::i;:::-;35893:8;:22;35889:184;;;-1:-1:-1;35942:2:0;35889:184;;;35977:11;33592:6;35977:2;:11;:::i;:::-;35966:8;:22;35962:111;;;-1:-1:-1;36015:2:0;35962:111;;;-1:-1:-1;36060:1:0;35962:111;36110:3;36091:16;36100:7;36091:6;:16;:::i;:::-;:22;;;;:::i;:::-;36085:28;-1:-1:-1;36136:12:0;36085:28;36136:6;:12;:::i;:::-;36124:24;-1:-1:-1;36161:21:0;36201:13;33592:6;36201:4;:13;:::i;:::-;18171:12;;36185:29;;;;:::i;:::-;36161:53;;36267:13;36245:18;:35;36241:448;;36309:1;36297:13;;36241:448;;;36343:21;36402:13;36383:16;:32;36379:188;;;36452:34;36468:18;36452:13;:34;:::i;:::-;36436:50;;36379:188;;;-1:-1:-1;36543:8:0;36379:188;36627:4;36618:6;36593:22;33592:6;36593:13;:22;:::i;:::-;:31;;;;:::i;:::-;:38;;;;:::i;:::-;36581:50;;36328:361;36241:448;36705:12;;:16;36701:93;;36770:12;;36761:6;36751:7;;:16;;;;:::i;:::-;:31;;;;:::i;:::-;36738:44;;36701:93;36806:46;;;35345:1515;;;;;;;:::o;36868:591::-;36965:13;37015;36995:16;:33;36991:74;;-1:-1:-1;37052:1:0;37045:8;;36991:74;37077:16;37096:13;18171:12;;;18100:91;37096:13;37077:32;-1:-1:-1;37154:12:0;33592:6;37154:3;:12;:::i;:::-;37143:23;;:8;:23;:::i;:::-;37126:13;:40;37122:81;;37190:1;37183:8;;;;;37122:81;37215:13;37247:1;37231:13;7534:12;;;7446:108;37231:13;:17;;;;:::i;:::-;37215:33;-1:-1:-1;37321:3:0;37215:33;33592:6;37268:32;37287:13;37268:16;:32;:::i;:::-;37267:43;;;;:::i;:::-;:51;;;;:::i;:::-;:57;;;;:::i;:::-;37259:65;;37381:5;37373;:13;37369:58;;;37410:5;-1:-1:-1;37403:12:0;;-1:-1:-1;37403:12:0;37369:58;37439:12;;36868:591;;;;:::o;24445:142::-;24538:41;24554:4;24568;24575:3;24538:15;:41::i;:::-;24445:142;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:548:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1378:328::-;1455:6;1463;1471;1524:2;1512:9;1503:7;1499:23;1495:32;1492:52;;;1540:1;1537;1530:12;1492:52;1563:29;1582:9;1563:29;:::i;:::-;1553:39;;1611:38;1645:2;1634:9;1630:18;1611:38;:::i;:::-;1601:48;;1696:2;1685:9;1681:18;1668:32;1658:42;;1378:328;;;;;:::o;1900:186::-;1959:6;2012:2;2000:9;1991:7;1987:23;1983:32;1980:52;;;2028:1;2025;2018:12;1980:52;2051:29;2070:9;2051:29;:::i;:::-;2041:39;1900:186;-1:-1:-1;;;1900:186:1:o;2091:435::-;2144:3;2182:5;2176:12;2209:6;2204:3;2197:19;2235:4;2264:2;2259:3;2255:12;2248:19;;2301:2;2294:5;2290:14;2322:1;2332:169;2346:6;2343:1;2340:13;2332:169;;;2407:13;;2395:26;;2441:12;;;;2476:15;;;;2368:1;2361:9;2332:169;;;-1:-1:-1;2517:3:1;;2091:435;-1:-1:-1;;;;;2091:435:1:o;2531:747::-;2724:2;2713:9;2706:21;2769:6;2763:13;2758:2;2747:9;2743:18;2736:41;2831:2;2823:6;2819:15;2813:22;2808:2;2797:9;2793:18;2786:50;2890:2;2882:6;2878:15;2872:22;2867:2;2856:9;2852:18;2845:50;2687:4;2942:2;2934:6;2930:15;2924:22;2983:4;2977:3;2966:9;2962:19;2955:33;3011:63;3069:3;3058:9;3054:19;3040:12;3011:63;:::i;:::-;2997:77;;3123:3;3115:6;3111:16;3105:23;3198:2;3194:7;3182:9;3174:6;3170:22;3166:36;3159:4;3148:9;3144:20;3137:66;3220:52;3265:6;3249:14;3220:52;:::i;:::-;3212:60;2531:747;-1:-1:-1;;;;;2531:747:1:o;3283:322::-;3360:6;3368;3376;3429:2;3417:9;3408:7;3404:23;3400:32;3397:52;;;3445:1;3442;3435:12;3397:52;3468:29;3487:9;3468:29;:::i;:::-;3458:39;3544:2;3529:18;;3516:32;;-1:-1:-1;3595:2:1;3580:18;;;3567:32;;3283:322;-1:-1:-1;;;3283:322:1:o;4142:260::-;4210:6;4218;4271:2;4259:9;4250:7;4246:23;4242:32;4239:52;;;4287:1;4284;4277:12;4239:52;4310:29;4329:9;4310:29;:::i;:::-;4300:39;;4358:38;4392:2;4381:9;4377:18;4358:38;:::i;:::-;4348:48;;4142:260;;;;;:::o;4407:380::-;4486:1;4482:12;;;;4529;;;4550:61;;4604:4;4596:6;4592:17;4582:27;;4550:61;4657:2;4649:6;4646:14;4626:18;4623:38;4620:161;;4703:10;4698:3;4694:20;4691:1;4684:31;4738:4;4735:1;4728:15;4766:4;4763:1;4756:15;4620:161;;4407:380;;;:::o;4792:127::-;4853:10;4848:3;4844:20;4841:1;4834:31;4884:4;4881:1;4874:15;4908:4;4905:1;4898:15;4924:125;4989:9;;;5010:10;;;5007:36;;;5023:18;;:::i;7843:128::-;7910:9;;;7931:11;;;7928:37;;;7945:18;;:::i;7976:127::-;8037:10;8032:3;8028:20;8025:1;8018:31;8068:4;8065:1;8058:15;8092:4;8089:1;8082:15;8461:135;8500:3;8521:17;;;8518:43;;8541:18;;:::i;:::-;-1:-1:-1;8588:1:1;8577:13;;8461:135::o;8959:127::-;9020:10;9015:3;9011:20;9008:1;9001:31;9051:4;9048:1;9041:15;9075:4;9072:1;9065:15;9444:168;9517:9;;;9548;;9565:15;;;9559:22;;9545:37;9535:71;;9586:18;;:::i;9617:217::-;9657:1;9683;9673:132;;9727:10;9722:3;9718:20;9715:1;9708:31;9762:4;9759:1;9752:15;9790:4;9787:1;9780:15;9673:132;-1:-1:-1;9819:9:1;;9617:217::o
Swarm Source
ipfs://d608248f8ea88d26e412ffe64b7e5cd12f032f2337e0995f164375d1455fef63
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.