Overview
Max Total Supply
9,403,526.098867305654250114 SEANCE
Holders
1,006 (0.00%)
Market
Price
$0.00 @ 0.000000 FTM
Onchain Market Cap
$4,836.14
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
75.498346346183671618 SEANCEValue
$0.04 ( ~0.0400557318549478 FTM) [0.0008%]Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
SeanceCircle
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-08-28 */ /*-------------------------------------------------------------------------------------------------- ==================================================================================================== *~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~ *~~~*~~~*~~* SeanceCircle.sol |*| SPDX-License-Identifier: MIT |*||*| 0xBuns + DeGatchi ~~~*~~~*~~~* *~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~ ==================================================================================================== ---------------------------------------------------------------------------------------------------- MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy//yNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNs-..-yNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNs-.oo.-sNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmo..sNNs..sNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmo.-sNMMNs-.omMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd+.:yNMMMMNy:`+dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh+`:yMMMMMMMMy:`+dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh/`/hMMMMMMMMMMh\`/hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy:./hMMMMMMMMMMMMd\.:hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy:.+dMMMMMMMMMMMMMMd+.:yNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNs-.omMMMMMMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMms-.omMMMMMMMMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMMMMMMNs-.omMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMMMMMMMMNs-.omMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd+.:yNMMMMMMMMMMMMMMMMMMMMMMMMNy:.+dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd/.:hMMMMMNMMMMMMMMMNNMMMMMMMMMMMh:`/dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh/`/hMMNdho/:-..--::::-..--:+shmMMMh\`/hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMy:`/dNho:-```-/shdmNNNmmdy+:.``.-/ydMd\`:hMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMNy:`/yy\.-/:.-odNMMMMMMMMMMMMNh/./y+../yy\`:yMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMNs-./:.-yhs:`+dMMMMMNdhyhhmNMMMMNs-.yhs:.-/\.-sNMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMsm.`:.:sdNd:`+dMMMdo.s.p.e.l.l.dMMMdo-.sNNh+-.:`msNMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMmo.`/.ymMMNo`:hMMMM-y.-sdmmds-.y-MMMMh`:hMMMdo:\`.omMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMd+../hMMMMMs.`yMMMMMm+/d(soul)b\+sMMMMMy`.sMMMMMh\-`+dmMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMd+..-+dMMMd/`+`uMMMMM.`/6\/.6.\/6\`.MOMMMy`-.dMMMd/`-.+dMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMh/./:`.ooyMMMy`-MOMMM`..`XOXOXOXO`..`MMMOM-`yMMMyoo.`:\.\hMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMh/./hNmy/.-ohNMy-.oNMMMNy/--:/:\:--\odMMMMh:`+mMNms\hNmy\.\hMhMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMNy:.+dMMMMmy+--/who-.omMMMMN.fantom.NMMMNmo.-who\--+yMMMMmd+.:yNMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMNy:.+dMMMMMMMNds/--/+:./yNMMMMMMMMMMMMMNdo-.//:--+ymMMMMMMMMb+.:yNMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMNs-.omMMMMMMMMMMMNdo/--.`.:shmNNNMMNNNdy+-``--:+ymNMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMms-.omMMMMMMMMMMMMMMMNmyo/-...-:/++++/:-..-:+shmNMMMMMMMMMMMMMMMmo.-smMMMMMMMMMMMMMMM MMMMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMMMMMMNmdhso++////++sydmNMMMMMMMMMMMMMMMMMMMMMNs-.omMMMMMMMMMMMMMM MMMMMMMMMMMMMm+.-yNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy-.+mMMMMMMMMMMMMM MMMMMMMMMMMMd+`:yMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMy:`+dMMMMMMMMMMMM MMMMMMMMMMMh/`/hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh\`/hMMMMMMMMMMM MMMMMMMMMMh:`/dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd\`:hMMMMMMMMMM MMMMMMMMNy:.+dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd+.:yNMMMMMMMM MMMMMMNy-`:+seancessssssoooooooooooooooooooooooooooooooooooooooooooooooooooooooosscircle+:`-yNMMMMMM MMMMMMMNs::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::sNMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ==================================================================================================== ~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~* ==================================================================================================== --------------------------------------------------------------------------------------------------*/ pragma solidity ^0.8.0; interface IERC20 { function totalSupply() external view returns (uint); function balanceOf(address account) external view returns (uint); function transfer(address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint amount) external returns (bool); function transferFrom(address sender, address recipient, uint amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint) private _balances; mapping(address => mapping(address => uint)) private _allowances; uint private _totalSupply; string private _name; string private _symbol; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint) { return _balances[account]; } function transfer(address recipient, uint amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint) { return _allowances[owner][spender]; } function approve(address spender, uint amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, 'ERC20: transfer amount exceeds allowance'); _approve(sender, _msgSender(), currentAllowance - amount); return true; } function increaseAllowance(address spender, uint addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint subtractedValue) public virtual returns (bool) { uint currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, 'ERC20: decreased allowance below zero'); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } function _transfer(address sender, address recipient, uint amount) internal virtual { require(sender != address(0), 'ERC20: transfer from the zero address'); require(recipient != address(0), 'ERC20: transfer to the zero address'); _beforeTokenTransfer(sender, recipient, amount); uint senderBalance = _balances[sender]; require(senderBalance >= amount, 'ERC20: transfer amount exceeds balance'); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } function _mint(address account, uint amount) internal virtual { require(account != address(0), 'ERC20: mint to the zero address'); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } function _burn(address account, uint amount) internal virtual { require(account != address(0), 'ERC20: burn from the zero address'); _beforeTokenTransfer(account, address(0), amount); uint accountBalance = _balances[account]; require(accountBalance >= amount, 'ERC20: burn amount exceeds balance'); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } function _approve(address owner, address spender, uint 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); } function _beforeTokenTransfer(address from, address to, uint amount) internal virtual {} function _afterTokenTransfer(address from, address to, uint amount) internal virtual {} } library Strings { bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; function toString(uint value) internal pure returns (string memory) { if (value == 0) { return '0'; } uint temp = value; uint digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint(value % 10))); value /= 10; } return string(buffer); } function toHexString(uint value) internal pure returns (string memory) { if (value == 0) { return '0x00'; } uint temp = value; uint length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } function toHexString(uint value, uint length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = '0'; buffer[1] = 'x'; for (uint i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, 'Strings: hex length insufficient'); return string(buffer); } } interface IERC165 { function supportsInterface(bytes4 interfaceId) external view returns (bool); } abstract contract ERC165 is IERC165 { function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert(string(abi.encodePacked( 'AccessControl: account ', Strings.toHexString(uint160(account), 20), ' is missing role ', Strings.toHexString(uint(role), 32))) ); } } function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); _revokeRole(role, account); } function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } contract SoulPower is ERC20('SoulPower', 'SOUL'), AccessControl { address public supreme; // supreme divine bytes32 public anunnaki; // admin role bytes32 public thoth; // minter role bytes32 public constant DOMAIN_TYPEHASH = // EIP-712 typehash for the contract's domain keccak256('EIP712Domain(string name,uint chainId,address verifyingContract)'); bytes32 public constant DELEGATION_TYPEHASH = // EIP-712 typehash for the delegation struct used by the contract keccak256('Delegation(address delegatee,uint nonce,uint expiry)'); // mappings for user accounts (address) mapping(address => mapping(uint => Checkpoint)) public checkpoints; // vote checkpoints mapping(address => uint) public numCheckpoints; // checkpoint count mapping(address => uint) public nonces; // signing / validating states mapping(address => address) internal _delegates; // each accounts' delegate struct Checkpoint { // checkpoint for marking number of votes from a given timestamp uint fromTime; uint votes; } event NewSupreme(address supreme); event Rethroned(bytes32 role, address oldAccount, address newAccount); event DelegateChanged( // emitted when an account changes its delegate address indexed delegator, address indexed fromDelegate, address indexed toDelegate ); event DelegateVotesChanged( // emitted when a delegate account's vote balance changes address indexed delegate, uint previousBalance, uint newBalance ); // restricted to the house of the role passed as an object to obey modifier obey(bytes32 role) { _checkRole(role, _msgSender()); _; } // channels the authority vested in anunnaki and thoth to the supreme constructor(address _supreme) { supreme = _supreme; anunnaki = keccak256('anunnaki'); // alpha supreme thoth = keccak256('thoth'); // god of wisdom and magic _divinationRitual(DEFAULT_ADMIN_ROLE, DEFAULT_ADMIN_ROLE, supreme); // supreme as root admin _divinationRitual(anunnaki, anunnaki, supreme); // anunnaki as admin of anunnaki _divinationRitual(thoth, anunnaki, supreme); // anunnaki as admin of thoth mint(supreme, 50000000 * 1e18); // mints initial supply of 50M } // solidifies roles (internal) function _divinationRitual(bytes32 _role, bytes32 _adminRole, address _account) internal { _setupRole(_role, _account); _setRoleAdmin(_role, _adminRole); } // grants `role` to `newAccount` && renounces `role` from `oldAccount` (public role) function rethroneRitual(bytes32 role, address oldAccount, address newAccount) public obey(role) { require(oldAccount != newAccount, 'must be a new address'); grantRole(role, newAccount); // grants new account renounceRole(role, oldAccount); // removes old account of role emit Rethroned(role, oldAccount, newAccount); } // updates supreme address (public anunnaki) function newSupreme(address _supreme) public obey(anunnaki) { require(supreme != _supreme, 'make a change, be the change'); // prevents self-destruct rethroneRitual(DEFAULT_ADMIN_ROLE, supreme, _supreme); // empowers new supreme supreme = _supreme; emit NewSupreme(supreme); } // checks whether sender has divine role (public view) function hasDivineRole(bytes32 role) public view returns (bool) { return hasRole(role, msg.sender); } // mints soul power as the house of thoth so wills (public thoth) function mint(address _to, uint _amount) public obey(thoth) { _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } // destroys `amount` tokens from the caller (public) function burn(uint amount) public { _burn(_msgSender(), amount); _moveDelegates(_delegates[_msgSender()], address(0), amount); } // destroys `amount` tokens from the `account` (public) function burnFrom(address account, uint amount) public { uint currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, 'burn amount exceeds allowance'); _approve(account, _msgSender(), currentAllowance - amount); _burn(account, amount); _moveDelegates(_delegates[account], address(0), amount); } // returns the address delegated by a given delegator (external view) function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } // delegates to the `delegatee` (external) function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } // delegates votes from signatory to `delegatee` (external) function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this)) ); bytes32 structHash = keccak256( abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry) ); bytes32 digest = keccak256( abi.encodePacked('\x19\x01', domainSeparator, structHash) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), 'delegateBySig: invalid signature'); require(nonce == nonces[signatory]++, 'delegateBySig: invalid nonce'); require(block.timestamp <= expiry, 'delegateBySig: signature expired'); return _delegate(signatory, delegatee); } // returns current votes balance for `account` (external view) function getCurrentVotes(address account) external view returns (uint) { uint nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } // returns an account's prior vote count as of a given timestamp (external view) function getPriorVotes(address account, uint blockTimestamp) external view returns (uint) { require(blockTimestamp < block.timestamp, 'getPriorVotes: not yet determined'); uint nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // checks most recent balance if (checkpoints[account][nCheckpoints - 1].fromTime <= blockTimestamp) { return checkpoints[account][nCheckpoints - 1].votes; } // checks implicit zero balance if (checkpoints[account][0].fromTime > blockTimestamp) { return 0; } uint lower = 0; uint upper = nCheckpoints - 1; while (upper > lower) { uint center = upper - (upper - lower) / 2; // avoids overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromTime == blockTimestamp) { return cp.votes; } else if (cp.fromTime < blockTimestamp) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function safe256(uint n, string memory errorMessage) internal pure returns (uint) { require(n < type(uint).max, errorMessage); return uint(n); } function getChainId() internal view returns (uint) { uint chainId; assembly { chainId := chainid() } return chainId; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint delegatorBalance = balanceOf(delegator); // balance of underlying SOUL (not scaled) _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decreases old representative uint srcRepNum = numCheckpoints[srcRep]; uint srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint srcRepNew = srcRepOld - amount; _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increases new representative uint dstRepNum = numCheckpoints[dstRep]; uint dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint dstRepNew = dstRepOld + amount; _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint nCheckpoints, uint oldVotes, uint newVotes ) internal { uint blockTimestamp = safe256(block.timestamp, 'block timestamp exceeds 256 bits'); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromTime == blockTimestamp) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockTimestamp, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _setOwner(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract Operable is Context, Ownable { address[] public operators; mapping(address => bool) public operator; event OperatorUpdated(address indexed operator, bool indexed access); constructor () { address msgSender = _msgSender(); operator[msgSender] = true; operators.push(msgSender); emit OperatorUpdated(msgSender, true); } modifier onlyOperator() { address msgSender = _msgSender(); require(operator[msgSender], "Operator: caller is not an operator"); _; } function removeOperator(address removingOperator) public virtual onlyOperator { require(operator[removingOperator], 'Operable: address is not an operator'); operator[removingOperator] = false; for (uint8 i; i < operators.length; i++) { if (operators[i] == removingOperator) { operators[i] = operators[i+1]; operators.pop(); emit OperatorUpdated(removingOperator, false); return; } } } function addOperator(address newOperator) public virtual onlyOperator { require(newOperator != address(0), "Operable: new operator is the zero address"); require(!operator[newOperator], 'Operable: address is already an operator'); operator[newOperator] = true; operators.push(newOperator); emit OperatorUpdated(newOperator, true); } } // SeanceCircle with Governance. contract SeanceCircle is ERC20('SeanceCircle', 'SEANCE'), Ownable, Operable { SoulPower public soul; bool isInitialized; function mint(address _to, uint256 _amount) public onlyOperator { require(isInitialized, 'the circle has not yet begun'); _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } function burn(address _from ,uint256 _amount) public onlyOperator { _burn(_from, _amount); _moveDelegates(_delegates[_from], address(0), _amount); } function initialize(SoulPower _soul) external onlyOwner { require(!isInitialized, 'the circle has already begun'); soul = _soul; isInitialized = true; } // safe soul transfer function, just in case if rounding error causes pool to not have enough SOUL. function safeSoulTransfer(address _to, uint256 _amount) public onlyOperator { uint256 soulBal = soul.balanceOf(address(this)); if (_amount > soulBal) { soul.transfer(_to, soulBal); } else { soul.transfer(_to, _amount); } } // record of each accounts delegate mapping (address => address) internal _delegates; // checkpoint for marking number of votes from a given block timestamp struct Checkpoint { uint256 fromTime; uint256 votes; } // record of votes checkpoints for each account, by index mapping (address => mapping (uint256 => Checkpoint)) public checkpoints; // number of checkpoints for each account mapping (address => uint256) public numCheckpoints; // EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); // EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); // record of states for signing / validating signatures mapping (address => uint) public nonces; // emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); // emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); // returns the address delegated by a given delegator (external view) function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } // delegates to the `delegatee` (external) function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } // delegates votes from signatory to `delegatee` (external) function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "SOUL::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "SOUL::delegateBySig: invalid nonce"); require(block.timestamp <= expiry, "SOUL::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } // returns current votes balance for `account` (external view) function getCurrentVotes(address account) external view returns (uint) { uint nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } // returns an account's prior vote count as of a given timestamp (external view) function getPriorVotes(address account, uint blockTimestamp) external view returns (uint256) { require(blockTimestamp < block.timestamp, "SOUL::getPriorVotes: not yet determined"); uint256 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // checks most recent balance if (checkpoints[account][nCheckpoints - 1].fromTime <= blockTimestamp) { return checkpoints[account][nCheckpoints - 1].votes; } // checks implicit zero balance if (checkpoints[account][0].fromTime > blockTimestamp) { return 0; } uint256 lower = 0; uint256 upper = nCheckpoints - 1; while (upper > lower) { uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromTime == blockTimestamp) { return cp.votes; } else if (cp.fromTime < blockTimestamp) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying SOUL (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint256 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld - amount; _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint256 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld + amount; _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint256 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint256 blockTimestamp = safe256(block.timestamp, "SOUL::_writeCheckpoint: block timestamp exceeds 256 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromTime == blockTimestamp) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockTimestamp, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe256(uint n, string memory errorMessage) internal pure returns (uint256) { require(n < type(uint256).max, errorMessage); return uint256(n); } function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } function newSoul(SoulPower _soul) external onlyOperator { require(soul != _soul, 'must be a new address'); soul = _soul; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"bool","name":"access","type":"bool"}],"name":"OperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"checkpoints","outputs":[{"internalType":"uint256","name":"fromTime","type":"uint256"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","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":[{"internalType":"contract SoulPower","name":"_soul","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract SoulPower","name":"_soul","type":"address"}],"name":"newSoul","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"operators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"removingOperator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"safeSoulTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soul","outputs":[{"internalType":"contract SoulPower","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600c81526020017f5365616e6365436972636c6500000000000000000000000000000000000000008152506040518060400160405280600681526020017f5345414e43450000000000000000000000000000000000000000000000000000815250816003908051906020019062000096929190620002bd565b508060049080519060200190620000af929190620002bd565b505050620000d2620000c6620001ef60201b60201c565b620001f760201b60201c565b6000620000e4620001ef60201b60201c565b90506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600115158173ffffffffffffffffffffffffffffffffffffffff167f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d60405160405180910390a350620003d2565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002cb906200036d565b90600052602060002090601f016020900481019282620002ef57600085556200033b565b82601f106200030a57805160ff19168380011785556200033b565b828001600101855582156200033b579182015b828111156200033a5782518255916020019190600101906200031d565b5b5090506200034a91906200034e565b5090565b5b80821115620003695760008160009055506001016200034f565b5090565b600060028204905060018216806200038657607f821691505b602082108114156200039d576200039c620003a3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61491b80620003e26000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c8063815b7a8c1161011a578063ac8a584a116100ad578063c4d66de81161007c578063c4d66de814610638578063dd62ed3e14610654578063e28d490614610684578063e7a324dc146106b4578063f2fde38b146106d257610206565b8063ac8a584a146105b4578063b2a142aa146105d0578063b4b5ea57146105ec578063c3cda5201461061c57610206565b80639a307391116100e95780639a307391146105085780639dc29fac14610538578063a457c2d714610554578063a9059cbb1461058457610206565b8063815b7a8c146104925780638da5cb5b146104b057806395d89b41146104ce5780639870d7fe146104ec57610206565b8063395093511161019d5780636fcfff451161016c5780636fcfff45146103c857806370a08231146103f8578063715018a614610428578063782d6fe1146104325780637ecebe001461046257610206565b8063395093511461033057806340c10f1914610360578063587cde1e1461037c5780635c19a95c146103ac57610206565b806320606b70116101d957806320606b70146102a857806323b872dd146102c6578063260cf996146102f6578063313ce5671461031257610206565b806306fdde031461020b578063095ea7b3146102295780630cdfebfa1461025957806318160ddd1461028a575b600080fd5b6102136106ee565b6040516102209190613b10565b60405180910390f35b610243600480360381019061023e919061341a565b610780565b60405161025091906139f0565b60405180910390f35b610273600480360381019061026e919061341a565b61079e565b604051610281929190613e2d565b60405180910390f35b6102926107cf565b60405161029f9190613e12565b60405180910390f35b6102b06107d9565b6040516102bd9190613a0b565b60405180910390f35b6102e060048036038101906102db91906133cb565b6107fd565b6040516102ed91906139f0565b60405180910390f35b610310600480360381019061030b9190613508565b6108fe565b005b61031a610a6c565b6040516103279190613e56565b60405180910390f35b61034a6004803603810190610345919061341a565b610a75565b60405161035791906139f0565b60405180910390f35b61037a6004803603810190610375919061341a565b610b21565b005b61039660048036038101906103919190613366565b610c82565b6040516103a391906139ac565b60405180910390f35b6103c660048036038101906103c19190613366565b610ceb565b005b6103e260048036038101906103dd9190613366565b610cf8565b6040516103ef9190613e12565b60405180910390f35b610412600480360381019061040d9190613366565b610d10565b60405161041f9190613e12565b60405180910390f35b610430610d58565b005b61044c6004803603810190610447919061341a565b610de0565b6040516104599190613e12565b60405180910390f35b61047c60048036038101906104779190613366565b61110b565b6040516104899190613e12565b60405180910390f35b61049a611123565b6040516104a79190613af5565b60405180910390f35b6104b8611149565b6040516104c591906139ac565b60405180910390f35b6104d6611173565b6040516104e39190613b10565b60405180910390f35b61050660048036038101906105019190613366565b611205565b005b610522600480360381019061051d9190613366565b6114a0565b60405161052f91906139f0565b60405180910390f35b610552600480360381019061054d919061341a565b6114c0565b005b61056e6004803603810190610569919061341a565b6115d2565b60405161057b91906139f0565b60405180910390f35b61059e6004803603810190610599919061341a565b6116c6565b6040516105ab91906139f0565b60405180910390f35b6105ce60048036038101906105c99190613366565b6116e4565b005b6105ea60048036038101906105e5919061341a565b611ada565b005b61060660048036038101906106019190613366565b611d95565b6040516106139190613e12565b60405180910390f35b61063660048036038101906106319190613456565b611e52565b005b610652600480360381019061064d9190613508565b6120e7565b005b61066e6004803603810190610669919061338f565b612212565b60405161067b9190613e12565b60405180910390f35b61069e60048036038101906106999190613531565b612299565b6040516106ab91906139ac565b60405180910390f35b6106bc6122d8565b6040516106c99190613a0b565b60405180910390f35b6106ec60048036038101906106e79190613366565b6122fc565b005b6060600380546106fd90614052565b80601f016020809104026020016040519081016040528092919081815260200182805461072990614052565b80156107765780601f1061074b57610100808354040283529160200191610776565b820191906000526020600020905b81548152906001019060200180831161075957829003601f168201915b5050505050905090565b600061079461078d6123f4565b84846123fc565b6001905092915050565b600a602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061080a8484846125c7565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108556123f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc90613c52565b60405180910390fd5b6108f2856108e16123f4565b85846108ed9190613f56565b6123fc565b60019150509392505050565b60006109086123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098d90613d52565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e90613cb2565b60405180910390fd5b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006012905090565b6000610b17610a826123f4565b848460016000610a906123f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b129190613e98565b6123fc565b6001905092915050565b6000610b2b6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb090613d52565b60405180910390fd5b600860149054906101000a900460ff16610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90613d72565b60405180910390fd5b610c128383612851565b610c7d6000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846129b1565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610cf53382612c0e565b50565b600b6020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d606123f4565b73ffffffffffffffffffffffffffffffffffffffff16610d7e611149565b73ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90613c92565b60405180910390fd5b610dde6000612d7f565b565b6000428210610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90613c72565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415610e7b576000915050611105565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610eca9190613f56565b81526020019081526020016000206000015411610f4957600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610f2f9190613f56565b815260200190815260200160002060010154915050611105565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808152602001908152602001600020600001541115610fae576000915050611105565b600080600183610fbe9190613f56565b90505b818111156110ab57600060028383610fd99190613f56565b610fe39190613f25565b82610fee9190613f56565b90506000600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050868160000151141561108057806020015195505050505050611105565b8681600001511015611094578193506110a4565b6001826110a19190613f56565b92505b5050610fc1565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206001015493505050505b92915050565b600c6020528060005260406000206000915090505481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461118290614052565b80601f01602080910402602001604051908101604052809291908181526020018280546111ae90614052565b80156111fb5780601f106111d0576101008083540402835291602001916111fb565b820191906000526020600020905b8154815290600101906020018083116111de57829003601f168201915b5050505050905090565b600061120f6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661129d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129490613d52565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490613bb2565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190613cd2565b60405180910390fd5b6001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600115158273ffffffffffffffffffffffffffffffffffffffff167f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d60405160405180910390a35050565b60076020528060005260406000206000915054906101000a900460ff1681565b60006114ca6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90613d52565b60405180910390fd5b6115628383612e45565b6115cd600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000846129b1565b505050565b600080600160006115e16123f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590613dd2565b60405180910390fd5b6116bb6116a96123f4565b8585846116b69190613f56565b6123fc565b600191505092915050565b60006116da6116d36123f4565b84846125c7565b6001905092915050565b60006116ee6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390613d52565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff90613c12565b60405180910390fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b6006805490508160ff161015611ad4578273ffffffffffffffffffffffffffffffffffffffff1660068260ff16815481106118c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ac157600660018261191d9190613eee565b60ff1681548110611957577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068260ff16815481106119bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006805480611a3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600015158373ffffffffffffffffffffffffffffffffffffffff167f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d60405160405180910390a350611ad6565b8080611acc906140cd565b915050611863565b505b5050565b6000611ae46123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6990613d52565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611bcf91906139ac565b60206040518083038186803b158015611be757600080fd5b505afa158015611bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1f919061355a565b905080831115611cde57600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401611c869291906139c7565b602060405180830381600087803b158015611ca057600080fd5b505af1158015611cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd891906134df565b50611d8f565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401611d3b9291906139c7565b602060405180830381600087803b158015611d5557600080fd5b505af1158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d91906134df565b505b50505050565b600080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611de9576000611e4a565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183611e379190613f56565b8152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611e7d6106ee565b80519060200120611e8c613025565b30604051602001611ea09493929190613a6b565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001611ef19493929190613a26565b60405160208183030381529060405280519060200120905060008282604051602001611f1e929190613975565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051611f5b9493929190613ab0565b6020604051602081039080840390855afa158015611f7d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090613c32565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061204990614084565b91905055891461208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208590613bd2565b60405180910390fd5b874211156120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c890613db2565b60405180910390fd5b6120db818b612c0e565b50505050505050505050565b6120ef6123f4565b73ffffffffffffffffffffffffffffffffffffffff1661210d611149565b73ffffffffffffffffffffffffffffffffffffffff1614612163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215a90613c92565b60405180910390fd5b600860149054906101000a900460ff16156121b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121aa90613d12565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860146101000a81548160ff02191690831515021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600681815481106122a957600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6123046123f4565b73ffffffffffffffffffffffffffffffffffffffff16612322611149565b73ffffffffffffffffffffffffffffffffffffffff1614612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f90613c92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123df90613b72565b60405180910390fd5b6123f181612d7f565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561246c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246390613d92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d390613b92565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125ba9190613e12565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262e90613d32565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e90613b32565b60405180910390fd5b6126b2838383613032565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90613bf2565b60405180910390fd5b81816127449190613f56565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127d49190613e98565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128389190613e12565b60405180910390a361284b848484613037565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b890613df2565b60405180910390fd5b6128cd60008383613032565b80600260008282546128df9190613e98565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129349190613e98565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129999190613e12565b60405180910390a36129ad60008383613037565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156129ed5750600081115b15612c0957600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612afd576000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211612a7a576000612adb565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184612ac89190613f56565b8152602001908152602001600020600101545b905060008382612aeb9190613f56565b9050612af98684848461303c565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c08576000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211612b85576000612be6565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184612bd39190613f56565b8152602001908152602001600020600101545b905060008382612bf69190613e98565b9050612c048584848461303c565b5050505b5b505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000612c7d84610d10565b905082600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612d798284836129b1565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eac90613cf2565b60405180910390fd5b612ec182600083613032565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3e90613b52565b60405180910390fd5b8181612f539190613f56565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254612fa79190613f56565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161300c9190613e12565b60405180910390a361302083600084613037565b505050565b6000804690508091505090565b505050565b505050565b6000613060426040518060600160405280603881526020016148ae60389139613262565b90506000841180156130d0575080600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876130bc9190613f56565b815260200190815260200160002060000154145b1561313e5781600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876131249190613f56565b81526020019081526020016000206001018190555061320b565b604051806040016040528082815260200183815250600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000155602082015181600101559050506001846131c79190613e98565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051613253929190613e2d565b60405180910390a25050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831082906132c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c09190613b10565b60405180910390fd5b5082905092915050565b6000813590506132e281614823565b92915050565b6000815190506132f78161483a565b92915050565b60008135905061330c81614851565b92915050565b60008135905061332181614868565b92915050565b6000813590506133368161487f565b92915050565b60008151905061334b8161487f565b92915050565b60008135905061336081614896565b92915050565b60006020828403121561337857600080fd5b6000613386848285016132d3565b91505092915050565b600080604083850312156133a257600080fd5b60006133b0858286016132d3565b92505060206133c1858286016132d3565b9150509250929050565b6000806000606084860312156133e057600080fd5b60006133ee868287016132d3565b93505060206133ff868287016132d3565b925050604061341086828701613327565b9150509250925092565b6000806040838503121561342d57600080fd5b600061343b858286016132d3565b925050602061344c85828601613327565b9150509250929050565b60008060008060008060c0878903121561346f57600080fd5b600061347d89828a016132d3565b965050602061348e89828a01613327565b955050604061349f89828a01613327565b94505060606134b089828a01613351565b93505060806134c189828a016132fd565b92505060a06134d289828a016132fd565b9150509295509295509295565b6000602082840312156134f157600080fd5b60006134ff848285016132e8565b91505092915050565b60006020828403121561351a57600080fd5b600061352884828501613312565b91505092915050565b60006020828403121561354357600080fd5b600061355184828501613327565b91505092915050565b60006020828403121561356c57600080fd5b600061357a8482850161333c565b91505092915050565b61358c81613f8a565b82525050565b61359b81613f9c565b82525050565b6135aa81613fa8565b82525050565b6135c16135bc82613fa8565b6140f7565b82525050565b6135d081613ffb565b82525050565b60006135e182613e71565b6135eb8185613e7c565b93506135fb81856020860161401f565b6136048161418e565b840191505092915050565b600061361c602383613e7c565b91506136278261419f565b604082019050919050565b600061363f602283613e7c565b915061364a826141ee565b604082019050919050565b6000613662602683613e7c565b915061366d8261423d565b604082019050919050565b6000613685602283613e7c565b91506136908261428c565b604082019050919050565b60006136a8602a83613e7c565b91506136b3826142db565b604082019050919050565b60006136cb600283613e8d565b91506136d68261432a565b600282019050919050565b60006136ee602283613e7c565b91506136f982614353565b604082019050919050565b6000613711602683613e7c565b915061371c826143a2565b604082019050919050565b6000613734602483613e7c565b915061373f826143f1565b604082019050919050565b6000613757602683613e7c565b915061376282614440565b604082019050919050565b600061377a602883613e7c565b91506137858261448f565b604082019050919050565b600061379d602783613e7c565b91506137a8826144de565b604082019050919050565b60006137c0602083613e7c565b91506137cb8261452d565b602082019050919050565b60006137e3601583613e7c565b91506137ee82614556565b602082019050919050565b6000613806602883613e7c565b91506138118261457f565b604082019050919050565b6000613829602183613e7c565b9150613834826145ce565b604082019050919050565b600061384c601c83613e7c565b91506138578261461d565b602082019050919050565b600061386f602583613e7c565b915061387a82614646565b604082019050919050565b6000613892602383613e7c565b915061389d82614695565b604082019050919050565b60006138b5601c83613e7c565b91506138c0826146e4565b602082019050919050565b60006138d8602483613e7c565b91506138e38261470d565b604082019050919050565b60006138fb602683613e7c565b91506139068261475c565b604082019050919050565b600061391e602583613e7c565b9150613929826147ab565b604082019050919050565b6000613941601f83613e7c565b915061394c826147fa565b602082019050919050565b61396081613fe4565b82525050565b61396f81613fee565b82525050565b6000613980826136be565b915061398c82856135b0565b60208201915061399c82846135b0565b6020820191508190509392505050565b60006020820190506139c16000830184613583565b92915050565b60006040820190506139dc6000830185613583565b6139e96020830184613957565b9392505050565b6000602082019050613a056000830184613592565b92915050565b6000602082019050613a2060008301846135a1565b92915050565b6000608082019050613a3b60008301876135a1565b613a486020830186613583565b613a556040830185613957565b613a626060830184613957565b95945050505050565b6000608082019050613a8060008301876135a1565b613a8d60208301866135a1565b613a9a6040830185613957565b613aa76060830184613583565b95945050505050565b6000608082019050613ac560008301876135a1565b613ad26020830186613966565b613adf60408301856135a1565b613aec60608301846135a1565b95945050505050565b6000602082019050613b0a60008301846135c7565b92915050565b60006020820190508181036000830152613b2a81846135d6565b905092915050565b60006020820190508181036000830152613b4b8161360f565b9050919050565b60006020820190508181036000830152613b6b81613632565b9050919050565b60006020820190508181036000830152613b8b81613655565b9050919050565b60006020820190508181036000830152613bab81613678565b9050919050565b60006020820190508181036000830152613bcb8161369b565b9050919050565b60006020820190508181036000830152613beb816136e1565b9050919050565b60006020820190508181036000830152613c0b81613704565b9050919050565b60006020820190508181036000830152613c2b81613727565b9050919050565b60006020820190508181036000830152613c4b8161374a565b9050919050565b60006020820190508181036000830152613c6b8161376d565b9050919050565b60006020820190508181036000830152613c8b81613790565b9050919050565b60006020820190508181036000830152613cab816137b3565b9050919050565b60006020820190508181036000830152613ccb816137d6565b9050919050565b60006020820190508181036000830152613ceb816137f9565b9050919050565b60006020820190508181036000830152613d0b8161381c565b9050919050565b60006020820190508181036000830152613d2b8161383f565b9050919050565b60006020820190508181036000830152613d4b81613862565b9050919050565b60006020820190508181036000830152613d6b81613885565b9050919050565b60006020820190508181036000830152613d8b816138a8565b9050919050565b60006020820190508181036000830152613dab816138cb565b9050919050565b60006020820190508181036000830152613dcb816138ee565b9050919050565b60006020820190508181036000830152613deb81613911565b9050919050565b60006020820190508181036000830152613e0b81613934565b9050919050565b6000602082019050613e276000830184613957565b92915050565b6000604082019050613e426000830185613957565b613e4f6020830184613957565b9392505050565b6000602082019050613e6b6000830184613966565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000613ea382613fe4565b9150613eae83613fe4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ee357613ee2614101565b5b828201905092915050565b6000613ef982613fee565b9150613f0483613fee565b92508260ff03821115613f1a57613f19614101565b5b828201905092915050565b6000613f3082613fe4565b9150613f3b83613fe4565b925082613f4b57613f4a614130565b5b828204905092915050565b6000613f6182613fe4565b9150613f6c83613fe4565b925082821015613f7f57613f7e614101565b5b828203905092915050565b6000613f9582613fc4565b9050919050565b60008115159050919050565b6000819050919050565b6000613fbd82613f8a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006140068261400d565b9050919050565b600061401882613fc4565b9050919050565b60005b8381101561403d578082015181840152602081019050614022565b8381111561404c576000848401525b50505050565b6000600282049050600182168061406a57607f821691505b6020821081141561407e5761407d61415f565b5b50919050565b600061408f82613fe4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140c2576140c1614101565b5b600182019050919050565b60006140d882613fee565b915060ff8214156140ec576140eb614101565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f70657261626c653a206e6577206f70657261746f7220697320746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f534f554c3a3a64656c656761746542795369673a20696e76616c6964206e6f6e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4f70657261626c653a2061646472657373206973206e6f7420616e206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b7f534f554c3a3a64656c656761746542795369673a20696e76616c69642073696760008201527f6e61747572650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f534f554c3a3a6765745072696f72566f7465733a206e6f74207965742064657460008201527f65726d696e656400000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6d7573742062652061206e657720616464726573730000000000000000000000600082015250565b7f4f70657261626c653a206164647265737320697320616c726561647920616e2060008201527f6f70657261746f72000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f74686520636972636c652068617320616c726561647920626567756e00000000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4f70657261746f723a2063616c6c6572206973206e6f7420616e206f7065726160008201527f746f720000000000000000000000000000000000000000000000000000000000602082015250565b7f74686520636972636c6520686173206e6f742079657420626567756e00000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f534f554c3a3a64656c656761746542795369673a207369676e6174757265206560008201527f7870697265640000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61482c81613f8a565b811461483757600080fd5b50565b61484381613f9c565b811461484e57600080fd5b50565b61485a81613fa8565b811461486557600080fd5b50565b61487181613fb2565b811461487c57600080fd5b50565b61488881613fe4565b811461489357600080fd5b50565b61489f81613fee565b81146148aa57600080fd5b5056fe534f554c3a3a5f7772697465436865636b706f696e743a20626c6f636b2074696d657374616d702065786365656473203235362062697473a2646970667358221220dbf57a198d2d7806ce66999da684530b4d67b0f58595dbcfba083196662dc8cd64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c8063815b7a8c1161011a578063ac8a584a116100ad578063c4d66de81161007c578063c4d66de814610638578063dd62ed3e14610654578063e28d490614610684578063e7a324dc146106b4578063f2fde38b146106d257610206565b8063ac8a584a146105b4578063b2a142aa146105d0578063b4b5ea57146105ec578063c3cda5201461061c57610206565b80639a307391116100e95780639a307391146105085780639dc29fac14610538578063a457c2d714610554578063a9059cbb1461058457610206565b8063815b7a8c146104925780638da5cb5b146104b057806395d89b41146104ce5780639870d7fe146104ec57610206565b8063395093511161019d5780636fcfff451161016c5780636fcfff45146103c857806370a08231146103f8578063715018a614610428578063782d6fe1146104325780637ecebe001461046257610206565b8063395093511461033057806340c10f1914610360578063587cde1e1461037c5780635c19a95c146103ac57610206565b806320606b70116101d957806320606b70146102a857806323b872dd146102c6578063260cf996146102f6578063313ce5671461031257610206565b806306fdde031461020b578063095ea7b3146102295780630cdfebfa1461025957806318160ddd1461028a575b600080fd5b6102136106ee565b6040516102209190613b10565b60405180910390f35b610243600480360381019061023e919061341a565b610780565b60405161025091906139f0565b60405180910390f35b610273600480360381019061026e919061341a565b61079e565b604051610281929190613e2d565b60405180910390f35b6102926107cf565b60405161029f9190613e12565b60405180910390f35b6102b06107d9565b6040516102bd9190613a0b565b60405180910390f35b6102e060048036038101906102db91906133cb565b6107fd565b6040516102ed91906139f0565b60405180910390f35b610310600480360381019061030b9190613508565b6108fe565b005b61031a610a6c565b6040516103279190613e56565b60405180910390f35b61034a6004803603810190610345919061341a565b610a75565b60405161035791906139f0565b60405180910390f35b61037a6004803603810190610375919061341a565b610b21565b005b61039660048036038101906103919190613366565b610c82565b6040516103a391906139ac565b60405180910390f35b6103c660048036038101906103c19190613366565b610ceb565b005b6103e260048036038101906103dd9190613366565b610cf8565b6040516103ef9190613e12565b60405180910390f35b610412600480360381019061040d9190613366565b610d10565b60405161041f9190613e12565b60405180910390f35b610430610d58565b005b61044c6004803603810190610447919061341a565b610de0565b6040516104599190613e12565b60405180910390f35b61047c60048036038101906104779190613366565b61110b565b6040516104899190613e12565b60405180910390f35b61049a611123565b6040516104a79190613af5565b60405180910390f35b6104b8611149565b6040516104c591906139ac565b60405180910390f35b6104d6611173565b6040516104e39190613b10565b60405180910390f35b61050660048036038101906105019190613366565b611205565b005b610522600480360381019061051d9190613366565b6114a0565b60405161052f91906139f0565b60405180910390f35b610552600480360381019061054d919061341a565b6114c0565b005b61056e6004803603810190610569919061341a565b6115d2565b60405161057b91906139f0565b60405180910390f35b61059e6004803603810190610599919061341a565b6116c6565b6040516105ab91906139f0565b60405180910390f35b6105ce60048036038101906105c99190613366565b6116e4565b005b6105ea60048036038101906105e5919061341a565b611ada565b005b61060660048036038101906106019190613366565b611d95565b6040516106139190613e12565b60405180910390f35b61063660048036038101906106319190613456565b611e52565b005b610652600480360381019061064d9190613508565b6120e7565b005b61066e6004803603810190610669919061338f565b612212565b60405161067b9190613e12565b60405180910390f35b61069e60048036038101906106999190613531565b612299565b6040516106ab91906139ac565b60405180910390f35b6106bc6122d8565b6040516106c99190613a0b565b60405180910390f35b6106ec60048036038101906106e79190613366565b6122fc565b005b6060600380546106fd90614052565b80601f016020809104026020016040519081016040528092919081815260200182805461072990614052565b80156107765780601f1061074b57610100808354040283529160200191610776565b820191906000526020600020905b81548152906001019060200180831161075957829003601f168201915b5050505050905090565b600061079461078d6123f4565b84846123fc565b6001905092915050565b600a602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061080a8484846125c7565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108556123f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc90613c52565b60405180910390fd5b6108f2856108e16123f4565b85846108ed9190613f56565b6123fc565b60019150509392505050565b60006109086123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098d90613d52565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e90613cb2565b60405180910390fd5b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006012905090565b6000610b17610a826123f4565b848460016000610a906123f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b129190613e98565b6123fc565b6001905092915050565b6000610b2b6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb090613d52565b60405180910390fd5b600860149054906101000a900460ff16610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90613d72565b60405180910390fd5b610c128383612851565b610c7d6000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846129b1565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610cf53382612c0e565b50565b600b6020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d606123f4565b73ffffffffffffffffffffffffffffffffffffffff16610d7e611149565b73ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90613c92565b60405180910390fd5b610dde6000612d7f565b565b6000428210610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90613c72565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415610e7b576000915050611105565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610eca9190613f56565b81526020019081526020016000206000015411610f4957600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610f2f9190613f56565b815260200190815260200160002060010154915050611105565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808152602001908152602001600020600001541115610fae576000915050611105565b600080600183610fbe9190613f56565b90505b818111156110ab57600060028383610fd99190613f56565b610fe39190613f25565b82610fee9190613f56565b90506000600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050868160000151141561108057806020015195505050505050611105565b8681600001511015611094578193506110a4565b6001826110a19190613f56565b92505b5050610fc1565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206001015493505050505b92915050565b600c6020528060005260406000206000915090505481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461118290614052565b80601f01602080910402602001604051908101604052809291908181526020018280546111ae90614052565b80156111fb5780601f106111d0576101008083540402835291602001916111fb565b820191906000526020600020905b8154815290600101906020018083116111de57829003601f168201915b5050505050905090565b600061120f6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661129d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129490613d52565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490613bb2565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190613cd2565b60405180910390fd5b6001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600115158273ffffffffffffffffffffffffffffffffffffffff167f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d60405160405180910390a35050565b60076020528060005260406000206000915054906101000a900460ff1681565b60006114ca6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90613d52565b60405180910390fd5b6115628383612e45565b6115cd600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000846129b1565b505050565b600080600160006115e16123f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590613dd2565b60405180910390fd5b6116bb6116a96123f4565b8585846116b69190613f56565b6123fc565b600191505092915050565b60006116da6116d36123f4565b84846125c7565b6001905092915050565b60006116ee6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390613d52565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff90613c12565b60405180910390fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b6006805490508160ff161015611ad4578273ffffffffffffffffffffffffffffffffffffffff1660068260ff16815481106118c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ac157600660018261191d9190613eee565b60ff1681548110611957577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068260ff16815481106119bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006805480611a3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600015158373ffffffffffffffffffffffffffffffffffffffff167f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d60405160405180910390a350611ad6565b8080611acc906140cd565b915050611863565b505b5050565b6000611ae46123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6990613d52565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611bcf91906139ac565b60206040518083038186803b158015611be757600080fd5b505afa158015611bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1f919061355a565b905080831115611cde57600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401611c869291906139c7565b602060405180830381600087803b158015611ca057600080fd5b505af1158015611cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd891906134df565b50611d8f565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401611d3b9291906139c7565b602060405180830381600087803b158015611d5557600080fd5b505af1158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d91906134df565b505b50505050565b600080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611de9576000611e4a565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183611e379190613f56565b8152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611e7d6106ee565b80519060200120611e8c613025565b30604051602001611ea09493929190613a6b565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001611ef19493929190613a26565b60405160208183030381529060405280519060200120905060008282604051602001611f1e929190613975565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051611f5b9493929190613ab0565b6020604051602081039080840390855afa158015611f7d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090613c32565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061204990614084565b91905055891461208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208590613bd2565b60405180910390fd5b874211156120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c890613db2565b60405180910390fd5b6120db818b612c0e565b50505050505050505050565b6120ef6123f4565b73ffffffffffffffffffffffffffffffffffffffff1661210d611149565b73ffffffffffffffffffffffffffffffffffffffff1614612163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215a90613c92565b60405180910390fd5b600860149054906101000a900460ff16156121b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121aa90613d12565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860146101000a81548160ff02191690831515021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600681815481106122a957600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6123046123f4565b73ffffffffffffffffffffffffffffffffffffffff16612322611149565b73ffffffffffffffffffffffffffffffffffffffff1614612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f90613c92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123df90613b72565b60405180910390fd5b6123f181612d7f565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561246c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246390613d92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d390613b92565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125ba9190613e12565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262e90613d32565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e90613b32565b60405180910390fd5b6126b2838383613032565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90613bf2565b60405180910390fd5b81816127449190613f56565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127d49190613e98565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128389190613e12565b60405180910390a361284b848484613037565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b890613df2565b60405180910390fd5b6128cd60008383613032565b80600260008282546128df9190613e98565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129349190613e98565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129999190613e12565b60405180910390a36129ad60008383613037565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156129ed5750600081115b15612c0957600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612afd576000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211612a7a576000612adb565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184612ac89190613f56565b8152602001908152602001600020600101545b905060008382612aeb9190613f56565b9050612af98684848461303c565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c08576000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211612b85576000612be6565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184612bd39190613f56565b8152602001908152602001600020600101545b905060008382612bf69190613e98565b9050612c048584848461303c565b5050505b5b505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000612c7d84610d10565b905082600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612d798284836129b1565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eac90613cf2565b60405180910390fd5b612ec182600083613032565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3e90613b52565b60405180910390fd5b8181612f539190613f56565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254612fa79190613f56565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161300c9190613e12565b60405180910390a361302083600084613037565b505050565b6000804690508091505090565b505050565b505050565b6000613060426040518060600160405280603881526020016148ae60389139613262565b90506000841180156130d0575080600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876130bc9190613f56565b815260200190815260200160002060000154145b1561313e5781600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876131249190613f56565b81526020019081526020016000206001018190555061320b565b604051806040016040528082815260200183815250600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000155602082015181600101559050506001846131c79190613e98565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051613253929190613e2d565b60405180910390a25050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831082906132c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c09190613b10565b60405180910390fd5b5082905092915050565b6000813590506132e281614823565b92915050565b6000815190506132f78161483a565b92915050565b60008135905061330c81614851565b92915050565b60008135905061332181614868565b92915050565b6000813590506133368161487f565b92915050565b60008151905061334b8161487f565b92915050565b60008135905061336081614896565b92915050565b60006020828403121561337857600080fd5b6000613386848285016132d3565b91505092915050565b600080604083850312156133a257600080fd5b60006133b0858286016132d3565b92505060206133c1858286016132d3565b9150509250929050565b6000806000606084860312156133e057600080fd5b60006133ee868287016132d3565b93505060206133ff868287016132d3565b925050604061341086828701613327565b9150509250925092565b6000806040838503121561342d57600080fd5b600061343b858286016132d3565b925050602061344c85828601613327565b9150509250929050565b60008060008060008060c0878903121561346f57600080fd5b600061347d89828a016132d3565b965050602061348e89828a01613327565b955050604061349f89828a01613327565b94505060606134b089828a01613351565b93505060806134c189828a016132fd565b92505060a06134d289828a016132fd565b9150509295509295509295565b6000602082840312156134f157600080fd5b60006134ff848285016132e8565b91505092915050565b60006020828403121561351a57600080fd5b600061352884828501613312565b91505092915050565b60006020828403121561354357600080fd5b600061355184828501613327565b91505092915050565b60006020828403121561356c57600080fd5b600061357a8482850161333c565b91505092915050565b61358c81613f8a565b82525050565b61359b81613f9c565b82525050565b6135aa81613fa8565b82525050565b6135c16135bc82613fa8565b6140f7565b82525050565b6135d081613ffb565b82525050565b60006135e182613e71565b6135eb8185613e7c565b93506135fb81856020860161401f565b6136048161418e565b840191505092915050565b600061361c602383613e7c565b91506136278261419f565b604082019050919050565b600061363f602283613e7c565b915061364a826141ee565b604082019050919050565b6000613662602683613e7c565b915061366d8261423d565b604082019050919050565b6000613685602283613e7c565b91506136908261428c565b604082019050919050565b60006136a8602a83613e7c565b91506136b3826142db565b604082019050919050565b60006136cb600283613e8d565b91506136d68261432a565b600282019050919050565b60006136ee602283613e7c565b91506136f982614353565b604082019050919050565b6000613711602683613e7c565b915061371c826143a2565b604082019050919050565b6000613734602483613e7c565b915061373f826143f1565b604082019050919050565b6000613757602683613e7c565b915061376282614440565b604082019050919050565b600061377a602883613e7c565b91506137858261448f565b604082019050919050565b600061379d602783613e7c565b91506137a8826144de565b604082019050919050565b60006137c0602083613e7c565b91506137cb8261452d565b602082019050919050565b60006137e3601583613e7c565b91506137ee82614556565b602082019050919050565b6000613806602883613e7c565b91506138118261457f565b604082019050919050565b6000613829602183613e7c565b9150613834826145ce565b604082019050919050565b600061384c601c83613e7c565b91506138578261461d565b602082019050919050565b600061386f602583613e7c565b915061387a82614646565b604082019050919050565b6000613892602383613e7c565b915061389d82614695565b604082019050919050565b60006138b5601c83613e7c565b91506138c0826146e4565b602082019050919050565b60006138d8602483613e7c565b91506138e38261470d565b604082019050919050565b60006138fb602683613e7c565b91506139068261475c565b604082019050919050565b600061391e602583613e7c565b9150613929826147ab565b604082019050919050565b6000613941601f83613e7c565b915061394c826147fa565b602082019050919050565b61396081613fe4565b82525050565b61396f81613fee565b82525050565b6000613980826136be565b915061398c82856135b0565b60208201915061399c82846135b0565b6020820191508190509392505050565b60006020820190506139c16000830184613583565b92915050565b60006040820190506139dc6000830185613583565b6139e96020830184613957565b9392505050565b6000602082019050613a056000830184613592565b92915050565b6000602082019050613a2060008301846135a1565b92915050565b6000608082019050613a3b60008301876135a1565b613a486020830186613583565b613a556040830185613957565b613a626060830184613957565b95945050505050565b6000608082019050613a8060008301876135a1565b613a8d60208301866135a1565b613a9a6040830185613957565b613aa76060830184613583565b95945050505050565b6000608082019050613ac560008301876135a1565b613ad26020830186613966565b613adf60408301856135a1565b613aec60608301846135a1565b95945050505050565b6000602082019050613b0a60008301846135c7565b92915050565b60006020820190508181036000830152613b2a81846135d6565b905092915050565b60006020820190508181036000830152613b4b8161360f565b9050919050565b60006020820190508181036000830152613b6b81613632565b9050919050565b60006020820190508181036000830152613b8b81613655565b9050919050565b60006020820190508181036000830152613bab81613678565b9050919050565b60006020820190508181036000830152613bcb8161369b565b9050919050565b60006020820190508181036000830152613beb816136e1565b9050919050565b60006020820190508181036000830152613c0b81613704565b9050919050565b60006020820190508181036000830152613c2b81613727565b9050919050565b60006020820190508181036000830152613c4b8161374a565b9050919050565b60006020820190508181036000830152613c6b8161376d565b9050919050565b60006020820190508181036000830152613c8b81613790565b9050919050565b60006020820190508181036000830152613cab816137b3565b9050919050565b60006020820190508181036000830152613ccb816137d6565b9050919050565b60006020820190508181036000830152613ceb816137f9565b9050919050565b60006020820190508181036000830152613d0b8161381c565b9050919050565b60006020820190508181036000830152613d2b8161383f565b9050919050565b60006020820190508181036000830152613d4b81613862565b9050919050565b60006020820190508181036000830152613d6b81613885565b9050919050565b60006020820190508181036000830152613d8b816138a8565b9050919050565b60006020820190508181036000830152613dab816138cb565b9050919050565b60006020820190508181036000830152613dcb816138ee565b9050919050565b60006020820190508181036000830152613deb81613911565b9050919050565b60006020820190508181036000830152613e0b81613934565b9050919050565b6000602082019050613e276000830184613957565b92915050565b6000604082019050613e426000830185613957565b613e4f6020830184613957565b9392505050565b6000602082019050613e6b6000830184613966565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000613ea382613fe4565b9150613eae83613fe4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ee357613ee2614101565b5b828201905092915050565b6000613ef982613fee565b9150613f0483613fee565b92508260ff03821115613f1a57613f19614101565b5b828201905092915050565b6000613f3082613fe4565b9150613f3b83613fe4565b925082613f4b57613f4a614130565b5b828204905092915050565b6000613f6182613fe4565b9150613f6c83613fe4565b925082821015613f7f57613f7e614101565b5b828203905092915050565b6000613f9582613fc4565b9050919050565b60008115159050919050565b6000819050919050565b6000613fbd82613f8a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006140068261400d565b9050919050565b600061401882613fc4565b9050919050565b60005b8381101561403d578082015181840152602081019050614022565b8381111561404c576000848401525b50505050565b6000600282049050600182168061406a57607f821691505b6020821081141561407e5761407d61415f565b5b50919050565b600061408f82613fe4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140c2576140c1614101565b5b600182019050919050565b60006140d882613fee565b915060ff8214156140ec576140eb614101565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f70657261626c653a206e6577206f70657261746f7220697320746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f534f554c3a3a64656c656761746542795369673a20696e76616c6964206e6f6e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4f70657261626c653a2061646472657373206973206e6f7420616e206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b7f534f554c3a3a64656c656761746542795369673a20696e76616c69642073696760008201527f6e61747572650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f534f554c3a3a6765745072696f72566f7465733a206e6f74207965742064657460008201527f65726d696e656400000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6d7573742062652061206e657720616464726573730000000000000000000000600082015250565b7f4f70657261626c653a206164647265737320697320616c726561647920616e2060008201527f6f70657261746f72000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f74686520636972636c652068617320616c726561647920626567756e00000000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4f70657261746f723a2063616c6c6572206973206e6f7420616e206f7065726160008201527f746f720000000000000000000000000000000000000000000000000000000000602082015250565b7f74686520636972636c6520686173206e6f742079657420626567756e00000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f534f554c3a3a64656c656761746542795369673a207369676e6174757265206560008201527f7870697265640000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61482c81613f8a565b811461483757600080fd5b50565b61484381613f9c565b811461484e57600080fd5b50565b61485a81613fa8565b811461486557600080fd5b50565b61487181613fb2565b811461487c57600080fd5b50565b61488881613fe4565b811461489357600080fd5b50565b61489f81613fee565b81146148aa57600080fd5b5056fe534f554c3a3a5f7772697465436865636b706f696e743a20626c6f636b2074696d657374616d702065786365656473203235362062697473a2646970667358221220dbf57a198d2d7806ce66999da684530b4d67b0f58595dbcfba083196662dc8cd64736f6c63430008040033
Deployed Bytecode Sourcemap
28530:8300:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6917:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7739:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30003:71;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;7190:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30240:122;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7913:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36682:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7105:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8333:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28670:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31084:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31243:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30130:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7287:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26517:94;;;:::i;:::-;;32984:1233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30630:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28615:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26294:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7009:90;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28107:382;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27088:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28908:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8553:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7403:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27580:519;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29384:289;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32672:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31406:1190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29087:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7583:148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27055:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30443:117;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26619:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6917:86;6971:13;6995:5;6988:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6917:86;:::o;7739:166::-;7819:4;7836:39;7845:12;:10;:12::i;:::-;7859:7;7868:6;7836:8;:39::i;:::-;7893:4;7886:11;;7739:166;;;;:::o;30003:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7190:91::-;7251:4;7266:12;;7259:19;;7190:91;:::o;30240:122::-;30282:80;30240:122;:::o;7913:412::-;8016:4;8033:36;8043:6;8051:9;8062:6;8033:9;:36::i;:::-;8080:21;8104:11;:19;8116:6;8104:19;;;;;;;;;;;;;;;:33;8124:12;:10;:12::i;:::-;8104:33;;;;;;;;;;;;;;;;8080:57;;8176:6;8156:16;:26;;8148:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;8238:57;8247:6;8255:12;:10;:12::i;:::-;8288:6;8269:16;:25;;;;:::i;:::-;8238:8;:57::i;:::-;8313:4;8306:11;;;7913:412;;;;;:::o;36682:145::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36765:5:::1;36757:13;;:4;;;;;;;;;;;:13;;;;36749:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;36814:5;36807:4;;:12;;;;;;;;;;;;;;;;;;36682:145:::0;;:::o;7105:79::-;7163:5;7179:2;7172:9;;7105:79;:::o;8333:212::-;8418:4;8435:80;8444:12;:10;:12::i;:::-;8458:7;8504:10;8467:11;:25;8479:12;:10;:12::i;:::-;8467:25;;;;;;;;;;;;;;;:34;8493:7;8467:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;8435:8;:80::i;:::-;8533:4;8526:11;;8333:212;;;;:::o;28670:230::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28753:13:::1;;;;;;;;;;;28745:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;28810:19;28816:3;28821:7;28810:5;:19::i;:::-;28840:52;28863:1;28867:10;:15;28878:3;28867:15;;;;;;;;;;;;;;;;;;;;;;;;;28884:7;28840:14;:52::i;:::-;28670:230:::0;;;:::o;31084:103::-;31145:7;31163:10;:21;31174:9;31163:21;;;;;;;;;;;;;;;;;;;;;;;;;31156:28;;31084:103;;;:::o;31243:90::-;31298:32;31308:10;31320:9;31298;:32::i;:::-;31243:90;:::o;30130:50::-;;;;;;;;;;;;;;;;;:::o;7287:110::-;7361:4;7376:9;:18;7386:7;7376:18;;;;;;;;;;;;;;;;7369:25;;7287:110;;;:::o;26517:94::-;26440:12;:10;:12::i;:::-;26429:23;;:7;:5;:7::i;:::-;:23;;;26421:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26582:21:::1;26600:1;26582:9;:21::i;:::-;26517:94::o:0;32984:1233::-;33068:7;33113:15;33096:14;:32;33088:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;33185:20;33208:14;:23;33223:7;33208:23;;;;;;;;;;;;;;;;33185:46;;33262:1;33246:12;:17;33242:58;;;33287:1;33280:8;;;;;33242:58;33406:14;33355:11;:20;33367:7;33355:20;;;;;;;;;;;;;;;:38;33391:1;33376:12;:16;;;;:::i;:::-;33355:38;;;;;;;;;;;:47;;;:65;33351:149;;33444:11;:20;33456:7;33444:20;;;;;;;;;;;;;;;:38;33480:1;33465:12;:16;;;;:::i;:::-;33444:38;;;;;;;;;;;:44;;;33437:51;;;;;33351:149;33592:14;33557:11;:20;33569:7;33557:20;;;;;;;;;;;;;;;:23;33578:1;33557:23;;;;;;;;;;;:32;;;:49;33553:90;;;33630:1;33623:8;;;;;33553:90;33655:13;33683;33714:1;33699:12;:16;;;;:::i;:::-;33683:32;;33726:433;33741:5;33733;:13;33726:433;;;33763:14;33806:1;33797:5;33789;:13;;;;:::i;:::-;33788:19;;;;:::i;:::-;33780:5;:27;;;;:::i;:::-;33763:44;;33849:20;33872:11;:20;33884:7;33872:20;;;;;;;;;;;;;;;:28;33893:6;33872:28;;;;;;;;;;;33849:51;;;;;;;;;;;;;;;;;;;;;;;;;;;33934:14;33919:2;:11;;;:29;33915:233;;;33976:2;:8;;;33969:15;;;;;;;;;33915:233;34024:14;34010:2;:11;;;:28;34006:142;;;34067:6;34059:14;;34006:142;;;34131:1;34122:6;:10;;;;:::i;:::-;34114:18;;34006:142;33726:433;;;;;34176:11;:20;34188:7;34176:20;;;;;;;;;;;;;;;:27;34197:5;34176:27;;;;;;;;;;;:33;;;34169:40;;;;;32984:1233;;;;;:::o;30630:39::-;;;;;;;;;;;;;;;;;:::o;28615:21::-;;;;;;;;;;;;;:::o;26294:87::-;26340:7;26367:6;;;;;;;;;;;26360:13;;26294:87;:::o;7009:90::-;7065:13;7089:7;7082:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7009:90;:::o;28107:382::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28219:1:::1;28196:25;;:11;:25;;;;28188:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;28288:8;:21;28297:11;28288:21;;;;;;;;;;;;;;;;;;;;;;;;;28287:22;28279:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28389:4;28365:8;:21;28374:11;28365:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;28404:9;28419:11;28404:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28476:4;28447:34;;28463:11;28447:34;;;;;;;;;;;;28107:382:::0;;:::o;27088:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;28908:171::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28985:21:::1;28991:5;28998:7;28985:5;:21::i;:::-;29017:54;29032:10;:17;29043:5;29032:17;;;;;;;;;;;;;;;;;;;;;;;;;29059:1;29063:7;29017:14;:54::i;:::-;28908:171:::0;;;:::o;8553:369::-;8643:4;8660:21;8684:11;:25;8696:12;:10;:12::i;:::-;8684:25;;;;;;;;;;;;;;;:34;8710:7;8684:34;;;;;;;;;;;;;;;;8660:58;;8757:15;8737:16;:35;;8729:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;8825:67;8834:12;:10;:12::i;:::-;8848:7;8876:15;8857:16;:34;;;;:::i;:::-;8825:8;:67::i;:::-;8910:4;8903:11;;;8553:369;;;;:::o;7403:172::-;7486:4;7503:42;7513:12;:10;:12::i;:::-;7527:9;7538:6;7503:9;:42::i;:::-;7563:4;7556:11;;7403:172;;;;:::o;27580:519::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27677:8:::1;:26;27686:16;27677:26;;;;;;;;;;;;;;;;;;;;;;;;;27669:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;27784:5;27755:8;:26;27764:16;27755:26;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;27805:7;27800:292;27818:9;:16;;;;27814:1;:20;;;27800:292;;;27876:16;27860:32;;:9;27870:1;27860:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;27856:225;;;27928:9;27940:1;27938;:3;;;;:::i;:::-;27928:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27913:9;27923:1;27913:12;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27961:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28034:5;28000:40;;28016:16;28000:40;;;;;;;;;;;;28059:7;;;27856:225;27836:3;;;;;:::i;:::-;;;;27800:292;;;;27563:1;27580:519:::0;;:::o;29384:289::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29471:15:::1;29489:4;;;;;;;;;;;:14;;;29512:4;29489:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29471:47;;29543:7;29533;:17;29529:137;;;29567:4;;;;;;;;;;;:13;;;29581:3;29586:7;29567:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29529:137;;;29627:4;;;;;;;;;;;:13;;;29641:3;29646:7;29627:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29529:137;27563:1;29384:289:::0;;;:::o;32672:218::-;32737:4;32754:17;32774:14;:23;32789:7;32774:23;;;;;;;;;;;;;;;;32754:43;;32830:1;32815:12;:16;:67;;32881:1;32815:67;;;32834:11;:20;32846:7;32834:20;;;;;;;;;;;;;;;:38;32870:1;32855:12;:16;;;;:::i;:::-;32834:38;;;;;;;;;;;:44;;;32815:67;32808:74;;;32672:218;;;:::o;31406:1190::-;31599:23;30282:80;31728:6;:4;:6::i;:::-;31712:24;;;;;;31755:12;:10;:12::i;:::-;31794:4;31649:165;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31625:200;;;;;;31599:226;;31838:18;30489:71;31950:9;31978:5;32002:6;31883:140;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31859:175;;;;;;31838:196;;32047:14;32152:15;32186:10;32088:123;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32064:158;;;;;;32047:175;;32235:17;32255:26;32265:6;32273:1;32276;32279;32255:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32235:46;;32321:1;32300:23;;:9;:23;;;;32292:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32394:6;:17;32401:9;32394:17;;;;;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;32385:5;:28;32377:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;32490:6;32471:15;:25;;32463:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32557:31;32567:9;32578;32557;:31::i;:::-;32550:38;;;;31406:1190;;;;;;:::o;29087:184::-;26440:12;:10;:12::i;:::-;26429:23;;:7;:5;:7::i;:::-;:23;;;26421:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29163:13:::1;;;;;;;;;;;29162:14;29154:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;29227:5;29220:4;;:12;;;;;;;;;;;;;;;;;;29259:4;29243:13;;:20;;;;;;;;;;;;;;;;;;29087:184:::0;:::o;7583:148::-;7672:4;7696:11;:18;7708:5;7696:18;;;;;;;;;;;;;;;:27;7715:7;7696:27;;;;;;;;;;;;;;;;7689:34;;7583:148;;;;:::o;27055:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30443:117::-;30489:71;30443:117;:::o;26619:192::-;26440:12;:10;:12::i;:::-;26429:23;;:7;:5;:7::i;:::-;:23;;;26421:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26728:1:::1;26708:22;;:8;:22;;;;26700:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26784:19;26794:8;26784:9;:19::i;:::-;26619:192:::0;:::o;6342:84::-;6395:7;6413:10;6406:17;;6342:84;:::o;10534:341::-;10650:1;10633:19;;:5;:19;;;;10625:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10731:1;10712:21;;:7;:21;;;;10704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10813:6;10783:11;:18;10795:5;10783:18;;;;;;;;;;;;;;;:27;10802:7;10783:27;;;;;;;;;;;;;;;:36;;;;10851:7;10835:32;;10844:5;10835:32;;;10860:6;10835:32;;;;;;:::i;:::-;;;;;;;;10534:341;;;:::o;8930:649::-;9051:1;9033:20;;:6;:20;;;;9025:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;9135:1;9114:23;;:9;:23;;;;9106:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9188:47;9209:6;9217:9;9228:6;9188:20;:47::i;:::-;9246:18;9267:9;:17;9277:6;9267:17;;;;;;;;;;;;;;;;9246:38;;9320:6;9303:13;:23;;9295:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;9416:6;9400:13;:22;;;;:::i;:::-;9380:9;:17;9390:6;9380:17;;;;;;;;;;;;;;;:42;;;;9457:6;9433:9;:20;9443:9;9433:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;9496:9;9479:35;;9488:6;9479:35;;;9507:6;9479:35;;;;;;:::i;:::-;;;;;;;;9525:46;9545:6;9553:9;9564:6;9525:19;:46::i;:::-;8930:649;;;;:::o;9587:390::-;9687:1;9668:21;;:7;:21;;;;9660:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;9736:49;9765:1;9769:7;9778:6;9736:20;:49::i;:::-;9812:6;9796:12;;:22;;;;;;;:::i;:::-;;;;;;;;9851:6;9829:9;:18;9839:7;9829:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;9894:7;9873:37;;9890:1;9873:37;;;9903:6;9873:37;;;;;;:::i;:::-;;;;;;;;9921:48;9949:1;9953:7;9962:6;9921:19;:48::i;:::-;9587:390;;:::o;34656:943::-;34762:6;34752:16;;:6;:16;;;;:30;;;;;34781:1;34772:6;:10;34752:30;34748:844;;;34821:1;34803:20;;:6;:20;;;34799:383;;34892:17;34912:14;:22;34927:6;34912:22;;;;;;;;;;;;;;;;34892:42;;34953:17;34985:1;34973:9;:13;:60;;35032:1;34973:60;;;34989:11;:19;35001:6;34989:19;;;;;;;;;;;;;;;:34;35021:1;35009:9;:13;;;;:::i;:::-;34989:34;;;;;;;;;;;:40;;;34973:60;34953:80;;35052:17;35084:6;35072:9;:18;;;;:::i;:::-;35052:38;;35109:57;35126:6;35134:9;35145;35156;35109:16;:57::i;:::-;34799:383;;;;35220:1;35202:20;;:6;:20;;;35198:383;;35291:17;35311:14;:22;35326:6;35311:22;;;;;;;;;;;;;;;;35291:42;;35352:17;35384:1;35372:9;:13;:60;;35431:1;35372:60;;;35388:11;:19;35400:6;35388:19;;;;;;;;;;;;;;;:34;35420:1;35408:9;:13;;;;:::i;:::-;35388:34;;;;;;;;;;;:40;;;35372:60;35352:80;;35451:17;35483:6;35471:9;:18;;;;:::i;:::-;35451:38;;35508:57;35525:6;35533:9;35544;35555;35508:16;:57::i;:::-;35198:383;;;;34748:844;34656:943;;;:::o;34225:423::-;34302:23;34328:10;:21;34339:9;34328:21;;;;;;;;;;;;;;;;;;;;;;;;;34302:47;;34360:24;34387:20;34397:9;34387;:20::i;:::-;34360:47;;34486:9;34462:10;:21;34473:9;34462:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;34557:9;34513:54;;34540:15;34513:54;;34529:9;34513:54;;;;;;;;;;;;34580:60;34595:15;34612:9;34623:16;34580:14;:60::i;:::-;34225:423;;;;:::o;26819:173::-;26875:16;26894:6;;;;;;;;;;;26875:25;;26920:8;26911:6;;:17;;;;;;;;;;;;;;;;;;26975:8;26944:40;;26965:8;26944:40;;;;;;;;;;;;26819:173;;:::o;9985:541::-;10085:1;10066:21;;:7;:21;;;;10058:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;10136:49;10157:7;10174:1;10178:6;10136:20;:49::i;:::-;10196:19;10218:9;:18;10228:7;10218:18;;;;;;;;;;;;;;;;10196:40;;10273:6;10255:14;:24;;10247:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;10367:6;10350:14;:23;;;;:::i;:::-;10329:9;:18;10339:7;10329:18;;;;;;;;;;;;;;;:44;;;;10400:6;10384:12;;:22;;;;;;;:::i;:::-;;;;;;;;10448:1;10422:37;;10431:7;10422:37;;;10452:6;10422:37;;;;;;:::i;:::-;;;;;;;;10470:48;10490:7;10507:1;10511:6;10470:19;:48::i;:::-;9985:541;;;:::o;36521:153::-;36566:4;36583:15;36631:9;36620:20;;36659:7;36652:14;;;36521:153;:::o;10883:88::-;;;;:::o;10977:87::-;;;;:::o;35607:722::-;35787:22;35812:84;35820:15;35812:84;;;;;;;;;;;;;;;;;:7;:84::i;:::-;35787:109;;35928:1;35913:12;:16;:87;;;;;35986:14;35933:11;:22;35945:9;35933:22;;;;;;;;;;;;;;;:40;35971:1;35956:12;:16;;;;:::i;:::-;35933:40;;;;;;;;;;;:49;;;:67;35913:87;35909:344;;;36066:8;36017:11;:22;36029:9;36017:22;;;;;;;;;;;;;;;:40;36055:1;36040:12;:16;;;;:::i;:::-;36017:40;;;;;;;;;;;:46;;:57;;;;35909:344;;;36146:36;;;;;;;;36157:14;36146:36;;;;36173:8;36146:36;;;36107:11;:22;36119:9;36107:22;;;;;;;;;;;;;;;:36;36130:12;36107:36;;;;;;;;;;;:75;;;;;;;;;;;;;;;;;;;36240:1;36225:12;:16;;;;:::i;:::-;36197:14;:25;36212:9;36197:25;;;;;;;;;;;;;;;:44;;;;35909:344;36291:9;36270:51;;;36302:8;36312;36270:51;;;;;;;:::i;:::-;;;;;;;;35607:722;;;;;:::o;36337:176::-;36413:7;36445:17;36441:1;:21;36464:12;36433:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;36503:1;36488:17;;36337:176;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;206:5;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:139::-;341:5;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;347:87;;;;:::o;440:175::-;504:5;542:6;529:20;520:29;;558:51;603:5;558:51;:::i;:::-;510:105;;;;:::o;621:139::-;667:5;705:6;692:20;683:29;;721:33;748:5;721:33;:::i;:::-;673:87;;;;:::o;766:143::-;823:5;854:6;848:13;839:22;;870:33;897:5;870:33;:::i;:::-;829:80;;;;:::o;915:135::-;959:5;997:6;984:20;975:29;;1013:31;1038:5;1013:31;:::i;:::-;965:85;;;;:::o;1056:262::-;1115:6;1164:2;1152:9;1143:7;1139:23;1135:32;1132:2;;;1180:1;1177;1170:12;1132:2;1223:1;1248:53;1293:7;1284:6;1273:9;1269:22;1248:53;:::i;:::-;1238:63;;1194:117;1122:196;;;;:::o;1324:407::-;1392:6;1400;1449:2;1437:9;1428:7;1424:23;1420:32;1417:2;;;1465:1;1462;1455:12;1417:2;1508:1;1533:53;1578:7;1569:6;1558:9;1554:22;1533:53;:::i;:::-;1523:63;;1479:117;1635:2;1661:53;1706:7;1697:6;1686:9;1682:22;1661:53;:::i;:::-;1651:63;;1606:118;1407:324;;;;;:::o;1737:552::-;1814:6;1822;1830;1879:2;1867:9;1858:7;1854:23;1850:32;1847:2;;;1895:1;1892;1885:12;1847:2;1938:1;1963:53;2008:7;1999:6;1988:9;1984:22;1963:53;:::i;:::-;1953:63;;1909:117;2065:2;2091:53;2136:7;2127:6;2116:9;2112:22;2091:53;:::i;:::-;2081:63;;2036:118;2193:2;2219:53;2264:7;2255:6;2244:9;2240:22;2219:53;:::i;:::-;2209:63;;2164:118;1837:452;;;;;:::o;2295:407::-;2363:6;2371;2420:2;2408:9;2399:7;2395:23;2391:32;2388:2;;;2436:1;2433;2426:12;2388:2;2479:1;2504:53;2549:7;2540:6;2529:9;2525:22;2504:53;:::i;:::-;2494:63;;2450:117;2606:2;2632:53;2677:7;2668:6;2657:9;2653:22;2632:53;:::i;:::-;2622:63;;2577:118;2378:324;;;;;:::o;2708:986::-;2810:6;2818;2826;2834;2842;2850;2899:3;2887:9;2878:7;2874:23;2870:33;2867:2;;;2916:1;2913;2906:12;2867:2;2959:1;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2930:117;3086:2;3112:53;3157:7;3148:6;3137:9;3133:22;3112:53;:::i;:::-;3102:63;;3057:118;3214:2;3240:53;3285:7;3276:6;3265:9;3261:22;3240:53;:::i;:::-;3230:63;;3185:118;3342:2;3368:51;3411:7;3402:6;3391:9;3387:22;3368:51;:::i;:::-;3358:61;;3313:116;3468:3;3495:53;3540:7;3531:6;3520:9;3516:22;3495:53;:::i;:::-;3485:63;;3439:119;3597:3;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3568:119;2857:837;;;;;;;;:::o;3700:278::-;3767:6;3816:2;3804:9;3795:7;3791:23;3787:32;3784:2;;;3832:1;3829;3822:12;3784:2;3875:1;3900:61;3953:7;3944:6;3933:9;3929:22;3900:61;:::i;:::-;3890:71;;3846:125;3774:204;;;;:::o;3984:298::-;4061:6;4110:2;4098:9;4089:7;4085:23;4081:32;4078:2;;;4126:1;4123;4116:12;4078:2;4169:1;4194:71;4257:7;4248:6;4237:9;4233:22;4194:71;:::i;:::-;4184:81;;4140:135;4068:214;;;;:::o;4288:262::-;4347:6;4396:2;4384:9;4375:7;4371:23;4367:32;4364:2;;;4412:1;4409;4402:12;4364:2;4455:1;4480:53;4525:7;4516:6;4505:9;4501:22;4480:53;:::i;:::-;4470:63;;4426:117;4354:196;;;;:::o;4556:284::-;4626:6;4675:2;4663:9;4654:7;4650:23;4646:32;4643:2;;;4691:1;4688;4681:12;4643:2;4734:1;4759:64;4815:7;4806:6;4795:9;4791:22;4759:64;:::i;:::-;4749:74;;4705:128;4633:207;;;;:::o;4846:118::-;4933:24;4951:5;4933:24;:::i;:::-;4928:3;4921:37;4911:53;;:::o;4970:109::-;5051:21;5066:5;5051:21;:::i;:::-;5046:3;5039:34;5029:50;;:::o;5085:118::-;5172:24;5190:5;5172:24;:::i;:::-;5167:3;5160:37;5150:53;;:::o;5209:157::-;5314:45;5334:24;5352:5;5334:24;:::i;:::-;5314:45;:::i;:::-;5309:3;5302:58;5292:74;;:::o;5372:167::-;5477:55;5526:5;5477:55;:::i;:::-;5472:3;5465:68;5455:84;;:::o;5545:364::-;5633:3;5661:39;5694:5;5661:39;:::i;:::-;5716:71;5780:6;5775:3;5716:71;:::i;:::-;5709:78;;5796:52;5841:6;5836:3;5829:4;5822:5;5818:16;5796:52;:::i;:::-;5873:29;5895:6;5873:29;:::i;:::-;5868:3;5864:39;5857:46;;5637:272;;;;;:::o;5915:366::-;6057:3;6078:67;6142:2;6137:3;6078:67;:::i;:::-;6071:74;;6154:93;6243:3;6154:93;:::i;:::-;6272:2;6267:3;6263:12;6256:19;;6061:220;;;:::o;6287:366::-;6429:3;6450:67;6514:2;6509:3;6450:67;:::i;:::-;6443:74;;6526:93;6615:3;6526:93;:::i;:::-;6644:2;6639:3;6635:12;6628:19;;6433:220;;;:::o;6659:366::-;6801:3;6822:67;6886:2;6881:3;6822:67;:::i;:::-;6815:74;;6898:93;6987:3;6898:93;:::i;:::-;7016:2;7011:3;7007:12;7000:19;;6805:220;;;:::o;7031:366::-;7173:3;7194:67;7258:2;7253:3;7194:67;:::i;:::-;7187:74;;7270:93;7359:3;7270:93;:::i;:::-;7388:2;7383:3;7379:12;7372:19;;7177:220;;;:::o;7403:366::-;7545:3;7566:67;7630:2;7625:3;7566:67;:::i;:::-;7559:74;;7642:93;7731:3;7642:93;:::i;:::-;7760:2;7755:3;7751:12;7744:19;;7549:220;;;:::o;7775:400::-;7935:3;7956:84;8038:1;8033:3;7956:84;:::i;:::-;7949:91;;8049:93;8138:3;8049:93;:::i;:::-;8167:1;8162:3;8158:11;8151:18;;7939:236;;;:::o;8181:366::-;8323:3;8344:67;8408:2;8403:3;8344:67;:::i;:::-;8337:74;;8420:93;8509:3;8420:93;:::i;:::-;8538:2;8533:3;8529:12;8522:19;;8327:220;;;:::o;8553:366::-;8695:3;8716:67;8780:2;8775:3;8716:67;:::i;:::-;8709:74;;8792:93;8881:3;8792:93;:::i;:::-;8910:2;8905:3;8901:12;8894:19;;8699:220;;;:::o;8925:366::-;9067:3;9088:67;9152:2;9147:3;9088:67;:::i;:::-;9081:74;;9164:93;9253:3;9164:93;:::i;:::-;9282:2;9277:3;9273:12;9266:19;;9071:220;;;:::o;9297:366::-;9439:3;9460:67;9524:2;9519:3;9460:67;:::i;:::-;9453:74;;9536:93;9625:3;9536:93;:::i;:::-;9654:2;9649:3;9645:12;9638:19;;9443:220;;;:::o;9669:366::-;9811:3;9832:67;9896:2;9891:3;9832:67;:::i;:::-;9825:74;;9908:93;9997:3;9908:93;:::i;:::-;10026:2;10021:3;10017:12;10010:19;;9815:220;;;:::o;10041:366::-;10183:3;10204:67;10268:2;10263:3;10204:67;:::i;:::-;10197:74;;10280:93;10369:3;10280:93;:::i;:::-;10398:2;10393:3;10389:12;10382:19;;10187:220;;;:::o;10413:366::-;10555:3;10576:67;10640:2;10635:3;10576:67;:::i;:::-;10569:74;;10652:93;10741:3;10652:93;:::i;:::-;10770:2;10765:3;10761:12;10754:19;;10559:220;;;:::o;10785:366::-;10927:3;10948:67;11012:2;11007:3;10948:67;:::i;:::-;10941:74;;11024:93;11113:3;11024:93;:::i;:::-;11142:2;11137:3;11133:12;11126:19;;10931:220;;;:::o;11157:366::-;11299:3;11320:67;11384:2;11379:3;11320:67;:::i;:::-;11313:74;;11396:93;11485:3;11396:93;:::i;:::-;11514:2;11509:3;11505:12;11498:19;;11303:220;;;:::o;11529:366::-;11671:3;11692:67;11756:2;11751:3;11692:67;:::i;:::-;11685:74;;11768:93;11857:3;11768:93;:::i;:::-;11886:2;11881:3;11877:12;11870:19;;11675:220;;;:::o;11901:366::-;12043:3;12064:67;12128:2;12123:3;12064:67;:::i;:::-;12057:74;;12140:93;12229:3;12140:93;:::i;:::-;12258:2;12253:3;12249:12;12242:19;;12047:220;;;:::o;12273:366::-;12415:3;12436:67;12500:2;12495:3;12436:67;:::i;:::-;12429:74;;12512:93;12601:3;12512:93;:::i;:::-;12630:2;12625:3;12621:12;12614:19;;12419:220;;;:::o;12645:366::-;12787:3;12808:67;12872:2;12867:3;12808:67;:::i;:::-;12801:74;;12884:93;12973:3;12884:93;:::i;:::-;13002:2;12997:3;12993:12;12986:19;;12791:220;;;:::o;13017:366::-;13159:3;13180:67;13244:2;13239:3;13180:67;:::i;:::-;13173:74;;13256:93;13345:3;13256:93;:::i;:::-;13374:2;13369:3;13365:12;13358:19;;13163:220;;;:::o;13389:366::-;13531:3;13552:67;13616:2;13611:3;13552:67;:::i;:::-;13545:74;;13628:93;13717:3;13628:93;:::i;:::-;13746:2;13741:3;13737:12;13730:19;;13535:220;;;:::o;13761:366::-;13903:3;13924:67;13988:2;13983:3;13924:67;:::i;:::-;13917:74;;14000:93;14089:3;14000:93;:::i;:::-;14118:2;14113:3;14109:12;14102:19;;13907:220;;;:::o;14133:366::-;14275:3;14296:67;14360:2;14355:3;14296:67;:::i;:::-;14289:74;;14372:93;14461:3;14372:93;:::i;:::-;14490:2;14485:3;14481:12;14474:19;;14279:220;;;:::o;14505:366::-;14647:3;14668:67;14732:2;14727:3;14668:67;:::i;:::-;14661:74;;14744:93;14833:3;14744:93;:::i;:::-;14862:2;14857:3;14853:12;14846:19;;14651:220;;;:::o;14877:118::-;14964:24;14982:5;14964:24;:::i;:::-;14959:3;14952:37;14942:53;;:::o;15001:112::-;15084:22;15100:5;15084:22;:::i;:::-;15079:3;15072:35;15062:51;;:::o;15119:663::-;15360:3;15382:148;15526:3;15382:148;:::i;:::-;15375:155;;15540:75;15611:3;15602:6;15540:75;:::i;:::-;15640:2;15635:3;15631:12;15624:19;;15653:75;15724:3;15715:6;15653:75;:::i;:::-;15753:2;15748:3;15744:12;15737:19;;15773:3;15766:10;;15364:418;;;;;:::o;15788:222::-;15881:4;15919:2;15908:9;15904:18;15896:26;;15932:71;16000:1;15989:9;15985:17;15976:6;15932:71;:::i;:::-;15886:124;;;;:::o;16016:332::-;16137:4;16175:2;16164:9;16160:18;16152:26;;16188:71;16256:1;16245:9;16241:17;16232:6;16188:71;:::i;:::-;16269:72;16337:2;16326:9;16322:18;16313:6;16269:72;:::i;:::-;16142:206;;;;;:::o;16354:210::-;16441:4;16479:2;16468:9;16464:18;16456:26;;16492:65;16554:1;16543:9;16539:17;16530:6;16492:65;:::i;:::-;16446:118;;;;:::o;16570:222::-;16663:4;16701:2;16690:9;16686:18;16678:26;;16714:71;16782:1;16771:9;16767:17;16758:6;16714:71;:::i;:::-;16668:124;;;;:::o;16798:553::-;16975:4;17013:3;17002:9;16998:19;16990:27;;17027:71;17095:1;17084:9;17080:17;17071:6;17027:71;:::i;:::-;17108:72;17176:2;17165:9;17161:18;17152:6;17108:72;:::i;:::-;17190;17258:2;17247:9;17243:18;17234:6;17190:72;:::i;:::-;17272;17340:2;17329:9;17325:18;17316:6;17272:72;:::i;:::-;16980:371;;;;;;;:::o;17357:553::-;17534:4;17572:3;17561:9;17557:19;17549:27;;17586:71;17654:1;17643:9;17639:17;17630:6;17586:71;:::i;:::-;17667:72;17735:2;17724:9;17720:18;17711:6;17667:72;:::i;:::-;17749;17817:2;17806:9;17802:18;17793:6;17749:72;:::i;:::-;17831;17899:2;17888:9;17884:18;17875:6;17831:72;:::i;:::-;17539:371;;;;;;;:::o;17916:545::-;18089:4;18127:3;18116:9;18112:19;18104:27;;18141:71;18209:1;18198:9;18194:17;18185:6;18141:71;:::i;:::-;18222:68;18286:2;18275:9;18271:18;18262:6;18222:68;:::i;:::-;18300:72;18368:2;18357:9;18353:18;18344:6;18300:72;:::i;:::-;18382;18450:2;18439:9;18435:18;18426:6;18382:72;:::i;:::-;18094:367;;;;;;;:::o;18467:258::-;18578:4;18616:2;18605:9;18601:18;18593:26;;18629:89;18715:1;18704:9;18700:17;18691:6;18629:89;:::i;:::-;18583:142;;;;:::o;18731:313::-;18844:4;18882:2;18871:9;18867:18;18859:26;;18931:9;18925:4;18921:20;18917:1;18906:9;18902:17;18895:47;18959:78;19032:4;19023:6;18959:78;:::i;:::-;18951:86;;18849:195;;;;:::o;19050:419::-;19216:4;19254:2;19243:9;19239:18;19231:26;;19303:9;19297:4;19293:20;19289:1;19278:9;19274:17;19267:47;19331:131;19457:4;19331:131;:::i;:::-;19323:139;;19221:248;;;:::o;19475:419::-;19641:4;19679:2;19668:9;19664:18;19656:26;;19728:9;19722:4;19718:20;19714:1;19703:9;19699:17;19692:47;19756:131;19882:4;19756:131;:::i;:::-;19748:139;;19646:248;;;:::o;19900:419::-;20066:4;20104:2;20093:9;20089:18;20081:26;;20153:9;20147:4;20143:20;20139:1;20128:9;20124:17;20117:47;20181:131;20307:4;20181:131;:::i;:::-;20173:139;;20071:248;;;:::o;20325:419::-;20491:4;20529:2;20518:9;20514:18;20506:26;;20578:9;20572:4;20568:20;20564:1;20553:9;20549:17;20542:47;20606:131;20732:4;20606:131;:::i;:::-;20598:139;;20496:248;;;:::o;20750:419::-;20916:4;20954:2;20943:9;20939:18;20931:26;;21003:9;20997:4;20993:20;20989:1;20978:9;20974:17;20967:47;21031:131;21157:4;21031:131;:::i;:::-;21023:139;;20921:248;;;:::o;21175:419::-;21341:4;21379:2;21368:9;21364:18;21356:26;;21428:9;21422:4;21418:20;21414:1;21403:9;21399:17;21392:47;21456:131;21582:4;21456:131;:::i;:::-;21448:139;;21346:248;;;:::o;21600:419::-;21766:4;21804:2;21793:9;21789:18;21781:26;;21853:9;21847:4;21843:20;21839:1;21828:9;21824:17;21817:47;21881:131;22007:4;21881:131;:::i;:::-;21873:139;;21771:248;;;:::o;22025:419::-;22191:4;22229:2;22218:9;22214:18;22206:26;;22278:9;22272:4;22268:20;22264:1;22253:9;22249:17;22242:47;22306:131;22432:4;22306:131;:::i;:::-;22298:139;;22196:248;;;:::o;22450:419::-;22616:4;22654:2;22643:9;22639:18;22631:26;;22703:9;22697:4;22693:20;22689:1;22678:9;22674:17;22667:47;22731:131;22857:4;22731:131;:::i;:::-;22723:139;;22621:248;;;:::o;22875:419::-;23041:4;23079:2;23068:9;23064:18;23056:26;;23128:9;23122:4;23118:20;23114:1;23103:9;23099:17;23092:47;23156:131;23282:4;23156:131;:::i;:::-;23148:139;;23046:248;;;:::o;23300:419::-;23466:4;23504:2;23493:9;23489:18;23481:26;;23553:9;23547:4;23543:20;23539:1;23528:9;23524:17;23517:47;23581:131;23707:4;23581:131;:::i;:::-;23573:139;;23471:248;;;:::o;23725:419::-;23891:4;23929:2;23918:9;23914:18;23906:26;;23978:9;23972:4;23968:20;23964:1;23953:9;23949:17;23942:47;24006:131;24132:4;24006:131;:::i;:::-;23998:139;;23896:248;;;:::o;24150:419::-;24316:4;24354:2;24343:9;24339:18;24331:26;;24403:9;24397:4;24393:20;24389:1;24378:9;24374:17;24367:47;24431:131;24557:4;24431:131;:::i;:::-;24423:139;;24321:248;;;:::o;24575:419::-;24741:4;24779:2;24768:9;24764:18;24756:26;;24828:9;24822:4;24818:20;24814:1;24803:9;24799:17;24792:47;24856:131;24982:4;24856:131;:::i;:::-;24848:139;;24746:248;;;:::o;25000:419::-;25166:4;25204:2;25193:9;25189:18;25181:26;;25253:9;25247:4;25243:20;25239:1;25228:9;25224:17;25217:47;25281:131;25407:4;25281:131;:::i;:::-;25273:139;;25171:248;;;:::o;25425:419::-;25591:4;25629:2;25618:9;25614:18;25606:26;;25678:9;25672:4;25668:20;25664:1;25653:9;25649:17;25642:47;25706:131;25832:4;25706:131;:::i;:::-;25698:139;;25596:248;;;:::o;25850:419::-;26016:4;26054:2;26043:9;26039:18;26031:26;;26103:9;26097:4;26093:20;26089:1;26078:9;26074:17;26067:47;26131:131;26257:4;26131:131;:::i;:::-;26123:139;;26021:248;;;:::o;26275:419::-;26441:4;26479:2;26468:9;26464:18;26456:26;;26528:9;26522:4;26518:20;26514:1;26503:9;26499:17;26492:47;26556:131;26682:4;26556:131;:::i;:::-;26548:139;;26446:248;;;:::o;26700:419::-;26866:4;26904:2;26893:9;26889:18;26881:26;;26953:9;26947:4;26943:20;26939:1;26928:9;26924:17;26917:47;26981:131;27107:4;26981:131;:::i;:::-;26973:139;;26871:248;;;:::o;27125:419::-;27291:4;27329:2;27318:9;27314:18;27306:26;;27378:9;27372:4;27368:20;27364:1;27353:9;27349:17;27342:47;27406:131;27532:4;27406:131;:::i;:::-;27398:139;;27296:248;;;:::o;27550:419::-;27716:4;27754:2;27743:9;27739:18;27731:26;;27803:9;27797:4;27793:20;27789:1;27778:9;27774:17;27767:47;27831:131;27957:4;27831:131;:::i;:::-;27823:139;;27721:248;;;:::o;27975:419::-;28141:4;28179:2;28168:9;28164:18;28156:26;;28228:9;28222:4;28218:20;28214:1;28203:9;28199:17;28192:47;28256:131;28382:4;28256:131;:::i;:::-;28248:139;;28146:248;;;:::o;28400:419::-;28566:4;28604:2;28593:9;28589:18;28581:26;;28653:9;28647:4;28643:20;28639:1;28628:9;28624:17;28617:47;28681:131;28807:4;28681:131;:::i;:::-;28673:139;;28571:248;;;:::o;28825:222::-;28918:4;28956:2;28945:9;28941:18;28933:26;;28969:71;29037:1;29026:9;29022:17;29013:6;28969:71;:::i;:::-;28923:124;;;;:::o;29053:332::-;29174:4;29212:2;29201:9;29197:18;29189:26;;29225:71;29293:1;29282:9;29278:17;29269:6;29225:71;:::i;:::-;29306:72;29374:2;29363:9;29359:18;29350:6;29306:72;:::i;:::-;29179:206;;;;;:::o;29391:214::-;29480:4;29518:2;29507:9;29503:18;29495:26;;29531:67;29595:1;29584:9;29580:17;29571:6;29531:67;:::i;:::-;29485:120;;;;:::o;29611:99::-;29663:6;29697:5;29691:12;29681:22;;29670:40;;;:::o;29716:169::-;29800:11;29834:6;29829:3;29822:19;29874:4;29869:3;29865:14;29850:29;;29812:73;;;;:::o;29891:148::-;29993:11;30030:3;30015:18;;30005:34;;;;:::o;30045:305::-;30085:3;30104:20;30122:1;30104:20;:::i;:::-;30099:25;;30138:20;30156:1;30138:20;:::i;:::-;30133:25;;30292:1;30224:66;30220:74;30217:1;30214:81;30211:2;;;30298:18;;:::i;:::-;30211:2;30342:1;30339;30335:9;30328:16;;30089:261;;;;:::o;30356:237::-;30394:3;30413:18;30429:1;30413:18;:::i;:::-;30408:23;;30445:18;30461:1;30445:18;:::i;:::-;30440:23;;30535:1;30529:4;30525:12;30522:1;30519:19;30516:2;;;30541:18;;:::i;:::-;30516:2;30585:1;30582;30578:9;30571:16;;30398:195;;;;:::o;30599:185::-;30639:1;30656:20;30674:1;30656:20;:::i;:::-;30651:25;;30690:20;30708:1;30690:20;:::i;:::-;30685:25;;30729:1;30719:2;;30734:18;;:::i;:::-;30719:2;30776:1;30773;30769:9;30764:14;;30641:143;;;;:::o;30790:191::-;30830:4;30850:20;30868:1;30850:20;:::i;:::-;30845:25;;30884:20;30902:1;30884:20;:::i;:::-;30879:25;;30923:1;30920;30917:8;30914:2;;;30928:18;;:::i;:::-;30914:2;30973:1;30970;30966:9;30958:17;;30835:146;;;;:::o;30987:96::-;31024:7;31053:24;31071:5;31053:24;:::i;:::-;31042:35;;31032:51;;;:::o;31089:90::-;31123:7;31166:5;31159:13;31152:21;31141:32;;31131:48;;;:::o;31185:77::-;31222:7;31251:5;31240:16;;31230:32;;;:::o;31268:114::-;31323:7;31352:24;31370:5;31352:24;:::i;:::-;31341:35;;31331:51;;;:::o;31388:126::-;31425:7;31465:42;31458:5;31454:54;31443:65;;31433:81;;;:::o;31520:77::-;31557:7;31586:5;31575:16;;31565:32;;;:::o;31603:86::-;31638:7;31678:4;31671:5;31667:16;31656:27;;31646:43;;;:::o;31695:162::-;31763:9;31796:55;31845:5;31796:55;:::i;:::-;31783:68;;31773:84;;;:::o;31863:131::-;31931:9;31964:24;31982:5;31964:24;:::i;:::-;31951:37;;31941:53;;;:::o;32000:307::-;32068:1;32078:113;32092:6;32089:1;32086:13;32078:113;;;32177:1;32172:3;32168:11;32162:18;32158:1;32153:3;32149:11;32142:39;32114:2;32111:1;32107:10;32102:15;;32078:113;;;32209:6;32206:1;32203:13;32200:2;;;32289:1;32280:6;32275:3;32271:16;32264:27;32200:2;32049:258;;;;:::o;32313:320::-;32357:6;32394:1;32388:4;32384:12;32374:22;;32441:1;32435:4;32431:12;32462:18;32452:2;;32518:4;32510:6;32506:17;32496:27;;32452:2;32580;32572:6;32569:14;32549:18;32546:38;32543:2;;;32599:18;;:::i;:::-;32543:2;32364:269;;;;:::o;32639:233::-;32678:3;32701:24;32719:5;32701:24;:::i;:::-;32692:33;;32747:66;32740:5;32737:77;32734:2;;;32817:18;;:::i;:::-;32734:2;32864:1;32857:5;32853:13;32846:20;;32682:190;;;:::o;32878:167::-;32915:3;32938:22;32954:5;32938:22;:::i;:::-;32929:31;;32982:4;32975:5;32972:15;32969:2;;;32990:18;;:::i;:::-;32969:2;33037:1;33030:5;33026:13;33019:20;;32919:126;;;:::o;33051:79::-;33090:7;33119:5;33108:16;;33098:32;;;:::o;33136:180::-;33184:77;33181:1;33174:88;33281:4;33278:1;33271:15;33305:4;33302:1;33295:15;33322:180;33370:77;33367:1;33360:88;33467:4;33464:1;33457:15;33491:4;33488:1;33481:15;33508:180;33556:77;33553:1;33546:88;33653:4;33650:1;33643:15;33677:4;33674:1;33667:15;33694:102;33735:6;33786:2;33782:7;33777:2;33770:5;33766:14;33762:28;33752:38;;33742:54;;;:::o;33802:222::-;33942:34;33938:1;33930:6;33926:14;33919:58;34011:5;34006:2;33998:6;33994:15;33987:30;33908:116;:::o;34030:221::-;34170:34;34166:1;34158:6;34154:14;34147:58;34239:4;34234:2;34226:6;34222:15;34215:29;34136:115;:::o;34257:225::-;34397:34;34393:1;34385:6;34381:14;34374:58;34466:8;34461:2;34453:6;34449:15;34442:33;34363:119;:::o;34488:221::-;34628:34;34624:1;34616:6;34612:14;34605:58;34697:4;34692:2;34684:6;34680:15;34673:29;34594:115;:::o;34715:229::-;34855:34;34851:1;34843:6;34839:14;34832:58;34924:12;34919:2;34911:6;34907:15;34900:37;34821:123;:::o;34950:214::-;35090:66;35086:1;35078:6;35074:14;35067:90;35056:108;:::o;35170:221::-;35310:34;35306:1;35298:6;35294:14;35287:58;35379:4;35374:2;35366:6;35362:15;35355:29;35276:115;:::o;35397:225::-;35537:34;35533:1;35525:6;35521:14;35514:58;35606:8;35601:2;35593:6;35589:15;35582:33;35503:119;:::o;35628:223::-;35768:34;35764:1;35756:6;35752:14;35745:58;35837:6;35832:2;35824:6;35820:15;35813:31;35734:117;:::o;35857:225::-;35997:34;35993:1;35985:6;35981:14;35974:58;36066:8;36061:2;36053:6;36049:15;36042:33;35963:119;:::o;36088:227::-;36228:34;36224:1;36216:6;36212:14;36205:58;36297:10;36292:2;36284:6;36280:15;36273:35;36194:121;:::o;36321:226::-;36461:34;36457:1;36449:6;36445:14;36438:58;36530:9;36525:2;36517:6;36513:15;36506:34;36427:120;:::o;36553:182::-;36693:34;36689:1;36681:6;36677:14;36670:58;36659:76;:::o;36741:171::-;36881:23;36877:1;36869:6;36865:14;36858:47;36847:65;:::o;36918:227::-;37058:34;37054:1;37046:6;37042:14;37035:58;37127:10;37122:2;37114:6;37110:15;37103:35;37024:121;:::o;37151:220::-;37291:34;37287:1;37279:6;37275:14;37268:58;37360:3;37355:2;37347:6;37343:15;37336:28;37257:114;:::o;37377:178::-;37517:30;37513:1;37505:6;37501:14;37494:54;37483:72;:::o;37561:224::-;37701:34;37697:1;37689:6;37685:14;37678:58;37770:7;37765:2;37757:6;37753:15;37746:32;37667:118;:::o;37791:222::-;37931:34;37927:1;37919:6;37915:14;37908:58;38000:5;37995:2;37987:6;37983:15;37976:30;37897:116;:::o;38019:178::-;38159:30;38155:1;38147:6;38143:14;38136:54;38125:72;:::o;38203:223::-;38343:34;38339:1;38331:6;38327:14;38320:58;38412:6;38407:2;38399:6;38395:15;38388:31;38309:117;:::o;38432:225::-;38572:34;38568:1;38560:6;38556:14;38549:58;38641:8;38636:2;38628:6;38624:15;38617:33;38538:119;:::o;38663:224::-;38803:34;38799:1;38791:6;38787:14;38780:58;38872:7;38867:2;38859:6;38855:15;38848:32;38769:118;:::o;38893:181::-;39033:33;39029:1;39021:6;39017:14;39010:57;38999:75;:::o;39080:122::-;39153:24;39171:5;39153:24;:::i;:::-;39146:5;39143:35;39133:2;;39192:1;39189;39182:12;39133:2;39123:79;:::o;39208:116::-;39278:21;39293:5;39278:21;:::i;:::-;39271:5;39268:32;39258:2;;39314:1;39311;39304:12;39258:2;39248:76;:::o;39330:122::-;39403:24;39421:5;39403:24;:::i;:::-;39396:5;39393:35;39383:2;;39442:1;39439;39432:12;39383:2;39373:79;:::o;39458:158::-;39549:42;39585:5;39549:42;:::i;:::-;39542:5;39539:53;39529:2;;39606:1;39603;39596:12;39529:2;39519:97;:::o;39622:122::-;39695:24;39713:5;39695:24;:::i;:::-;39688:5;39685:35;39675:2;;39734:1;39731;39724:12;39675:2;39665:79;:::o;39750:118::-;39821:22;39837:5;39821:22;:::i;:::-;39814:5;39811:33;39801:2;;39858:1;39855;39848:12;39801:2;39791:77;:::o
Swarm Source
ipfs://dbf57a198d2d7806ce66999da684530b4d67b0f58595dbcfba083196662dc8cd
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.