ERC-20
Source Code
Overview
Max Total Supply
52,500,001 ABAS
Holders
70
Transfers
-
4 ( 33.33%)
Market
Price
$0.00 @ 0.000000 ETH
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
ArbitrumBitcoinAndStaking
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/**
*Submitted for verification at Arbiscan.io on 2023-04-04
*/
// Arbitrum Bitcoin and Staking (ABAS) - Token and Mining Contract
//
// Distrubtion of Arbitrum Bitcoin and Staking (ABAS) Token is as follows:
// 40% of ABAS Token is distributed as Liquidiy Pools as rewards in the ABASRewards Contract which distributes tokens to users who deposit the Liquidity Pool tokens into the LPRewards contracts.
// +
// 40% of ABAS Token is distributed using ABAS Contract(this Contract) which distributes tokens to users by using Proof of work. Computers solve a complicated problem to gain tokens!
// +
// 20% of ABAS Token is Auctioned in the ABASAuctions Contract which distributes tokens to users who use Ethereum to buy tokens in fair price. Each auction lasts ~12 days. Using the Auctions contract.
// +
// = 100% Of the Token is distributed to the users! No dev fee or premine!
//
// Symbol: ABAS
// Decimals: 18
//
// Total supply: 52,500,001.000000000000000000
// =
// 21,000,000 tokens goes to Liquidity Providers of the token over 100+ year using Bitcoin distribution! Helps prevent LP losses! Uses the ABASRewards!
// +
// 21,000,000 Mined over 100+ years using Bitcoins Distrubtion halvings every 4 years @ 360 min solves. Uses Proof-oF-Work to distribute the tokens. Public Miner is available. Uses this contract.
// +
// 10,500,000 Auctioned over 100+ years into 4 day auctions split fairly among all buyers. ALL Ethereum proceeds go into THIS contract which it fairly distributes to miners and stakers. Uses the ABASAuctions contract
//
//
//
// 50% of the Ethereum from this contract goes to the Miner to pay for the transaction cost and if the token grows enough earn Ethereum per mint!
// 50% of the Ethereum from this contract goes to the Liquidity Providers via ABASRewards Contract. Helps prevent Impermant Loss! Larger Liquidity!
//
// Max Difficulty of 4 TH/s
// To prevent hashrate griefing at targetTime it is ~0.0001 Ethereum per Mint
// @ 30x targetTime it is ~0.0000033 Ethereum per Mint
// This is done to thwart ASICs and high hashrate machines from griefing / ramping difficulty up to stop FPGA profits
//
// No premine, dev cut, or advantage taken at launch. Public miner available at launch. 100% of the token is given away fairly over 100+ years using Bitcoins model!
//
// Send this contract any ERC20 token and it will become instantly mineable and able to distribute using proof-of-work!
// Donate this contract any NFT and we will also distribute it via Proof of Work to our miners!
//
//* 1 token were burned to create the LP pool.
//
// Credits: 0xBitcoin, Vether, Synethix
pragma solidity ^0.8.11;
contract Ownable {
address public owner;
event TransferOwnership(address _from, address _to);
constructor() {
owner = msg.sender;
emit TransferOwnership(address(0), msg.sender);
}
modifier onlyOwner() {
require(msg.sender == owner, "only owner");
_;
}
function setOwner(address _owner) internal onlyOwner {
emit TransferOwnership(owner, _owner);
owner = _owner;
}
}
pragma solidity >=0.4.21 <0.9.0;
/**
* @title Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. Exposes a variety of system-level functionality.
*/
interface ArbSys {
/**
* @notice Get internal version number identifying an ArbOS build
* @return version number as int
*/
function arbBlockHash(uint blockNumber) external view returns(bytes32);
/**
* @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)
* @return block number as int
*/
function arbBlockNumber() external view returns (uint);
/**
* @notice Send given amount of Eth to dest from sender.
* This is a convenience function, which is equivalent to calling sendTxToL1 with empty calldataForL1.
* @param destination recipient address on L1
* @return unique identifier for this L2-to-L1 transaction.
*/
}
library IsContract {
function isContract(address _addr) internal view returns (bool) {
bytes32 codehash;
/* solium-disable-next-line */
assembly { codehash := extcodehash(_addr) }
return codehash != bytes32(0) && codehash != bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
}
}
// File: contracts/utils/SafeMath.sol
library SafeMath2 {
function add(uint256 x, uint256 y) internal pure returns (uint256) {
uint256 z = x + y;
require(z >= x, "Add overflow");
return z;
}
function sub(uint256 x, uint256 y) internal pure returns (uint256) {
require(x >= y, "Sub underflow");
return x - y;
}
function mult(uint256 x, uint256 y) internal pure returns (uint256) {
if (x == 0) {
return 0;
}
uint256 z = x * y;
require(z / x == y, "Mult overflow");
return z;
}
function div(uint256 x, uint256 y) internal pure returns (uint256) {
require(y != 0, "Div by zero");
return x / y;
}
function divRound(uint256 x, uint256 y) internal pure returns (uint256) {
require(y != 0, "Div by zero");
uint256 r = x / y;
if (x % y != 0) {
r = r + 1;
}
return r;
}
}
// File: contracts/utils/Math.sol
library ExtendedMath2 {
//return the smaller of the two inputs (a or b)
function limitLessThan(uint a, uint b) internal pure returns (uint c) {
if(a > b) return b;
return a;
}
}
// File: contracts/interfaces/IERC20.sol
interface IERC20 {
function totalSupply() external view returns (uint256);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
function transfer(address _to, uint _value) external returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
function allowance(address _owner, address _spender) external view returns (uint256 remaining);
function approve(address _spender, uint256 _value) external returns (bool success);
function balanceOf(address _owner) external view returns (uint256 balance);
}
interface IERC721 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
//Recieve NFTs
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
//Main contract
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC
5MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}
interface IERC1155Receiver is IERC165 {
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}
contract ABASAuctionsCT{
uint256 public totalAuctioned;
}
contract ArbitrumBitcoinAndStaking is Ownable, IERC20 {
function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {
return IERC721Receiver.onERC721Received.selector;
}
function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4){
return IERC1155Receiver.onERC1155Received.selector;
}
function onERC1155BatchReceived(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4){
return IERC1155Receiver.onERC1155Received.selector;
}
uint public targetTime = 60 * 12;
// SUPPORTING CONTRACTS
address public AddressAuction;
ABASAuctionsCT public AuctionsCT;
address public AddressLPReward;
//Events
using SafeMath2 for uint256;
using ExtendedMath2 for uint;
event Mint(address indexed from, uint reward_amount, uint epochCount, bytes32 newChallengeNumber);
event MegaMint(address indexed from, uint epochCount, bytes32 newChallengeNumber, uint NumberOfTokensMinted, uint256 TokenMultipler);
// Managment events
uint256 override public totalSupply = 52500001000000000000000000;
bytes32 private constant BALANCE_KEY = keccak256("balance");
//BITCOIN INITALIZE Start
uint _totalSupply = 21000000000000000000000000;
uint public latestDifficultyPeriodStarted2 = block.timestamp; //BlockTime of last readjustment
uint public epochCount = 0;//number of 'blocks' mined
uint public latestreAdjustStarted = block.timestamp;
uint public _BLOCKS_PER_READJUSTMENT = 1024; // should be 1024
uint public _MAXIMUM_TARGET = 2**234;
uint public _MINIMUM_TARGET = _MAXIMUM_TARGET.div(555000000); //Mainnet = 555000000 = 4 TH/s @ 12 minutes
uint public miningTarget = _MAXIMUM_TARGET.div(200000000000*25); //1000 million difficulty to start until i enable mining
bytes32 public challengeNumber = ArbSys(0x0000000000000000000000000000000000000064).arbBlockHash( ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber() - 1); //generate a new one when a new reward is minted
uint public rewardEra = 0;
uint public maxSupplyForEra = (_totalSupply - _totalSupply.div( 2**(rewardEra + 1)));
uint public reward_amount = 2;
//Stuff for Functions
uint public sentToLP = 0; //Total ABAS sent to LP pool
uint public multipler = 0; //Multiplier on held Ethereum (more we hold less % we distribute)
uint public oldecount = 0; //Previous block count for ArewardSender function
uint public previousBlockTime = block.timestamp; // Previous Blocktime
uint public Token2Per= 1000000; //Amount of ETH distributed per mint somewhat
uint public tokensMinted = 0; //Tokens Minted only for Miners
mapping(address => uint) balances;
mapping(address => mapping(address => uint)) allowed;
uint public slowBlocks = 0; //Number of slow blocks (12+ minutes)
uint public epochOld = 0; //Epoch count at each readjustment
uint public give0x = 0;
uint public give = 1;
// metadata
string public name = "Arbitrum Bitcoin and Staking Token";
string public constant symbol = "ABAS";
uint8 public constant decimals = 18;
uint256 lastrun = block.timestamp;
uint public latestDifficultyPeriodStarted = ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber();
bool initeds = false;
// mint 1 token to setup LPs
constructor() {
balances[msg.sender] = 1000000000000000000;
emit Transfer(address(0), msg.sender, 1000000000000000000);
}
function zinit(address AuctionAddress2, address LPGuild2) public onlyOwner{
uint x = 21000000000000000000000000;
// Only init once
assert(!initeds);
initeds = true;
previousBlockTime = block.timestamp;
reward_amount = 20 * 10**uint(decimals);
rewardEra = 0;
tokensMinted = 0;
epochCount = 0;
epochOld = 0;
multipler = address(this).balance / (1 * 10 ** 18);
Token2Per = (2** rewardEra) * address(this).balance / (250000 + 250000*(multipler)); //aimed to give about 400 days of reserves
miningTarget = _MAXIMUM_TARGET.div(1000);
latestDifficultyPeriodStarted2 = block.timestamp;
_startNewMiningEpoch();
// Init contract variables and mint
balances[AuctionAddress2] = x/2;
emit Transfer(address(0), AuctionAddress2, x/2);
AddressAuction = AuctionAddress2;
AuctionsCT = ABASAuctionsCT(AddressAuction);
AddressLPReward = payable(LPGuild2);
slowBlocks = 1;
oldecount = epochCount;
setOwner(address(0));
}
///
// Managment
///
function ARewardSender() public {
//runs every _BLOCKS_PER_READJUSTMENT / 8
multipler = address(this).balance / (1 * 10 ** 18);
Token2Per = (2** rewardEra) * address(this).balance / (250000 + 250000*(multipler)); //aimed to give about 400 days of reserves
uint256 runs = block.timestamp - lastrun;
uint256 epochsPast = epochCount - oldecount; //actually epoch
uint256 runsperepoch = runs / epochsPast;
if(rewardEra < 8){
targetTime = ((12 * 60) * 2**rewardEra);
}else{
reward_amount = ( 20 * 10**uint(decimals)).div( 2**(rewardEra - 7 ) );
}
uint256 x = (runsperepoch * 888).divRound(targetTime);
uint256 ratio = x * 100 / 888;
uint256 totalOwed;
if(ratio < 2000){
totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
}else {
totalOwed = (3200000000);
}
uint totalOwedABAS = (epochsPast * reward_amount * totalOwed).div(100000000);
balances[AddressLPReward] = balances[AddressLPReward].add(totalOwedABAS);
emit Transfer(address(0), AddressLPReward, totalOwedABAS);
sentToLP = sentToLP.add(totalOwedABAS);
if( address(this).balance > (200 * (Token2Per * _BLOCKS_PER_READJUSTMENT)/4)){ // at least enough blocks to rerun this function for both LPRewards and Users
//IERC20(AddressZeroXBTC).transfer(AddressLPReward, ((epochsPast) * totalOwed * Token2Per * give0xBTC).div(100000000));
address payable to = payable(AddressLPReward);
totalOwed = ((epochsPast) * totalOwed * Token2Per * give0x).div(100000000);
to.transfer(totalOwed);
give0x = 1 * give;
}else{
give0x = 0;
}
oldecount = epochCount; //actually epoch
lastrun = block.timestamp;
}
//comability function
function mint(uint256 nonce, bytes32 challenge_digest) public payable returns (bool success) {
mintTo(nonce, challenge_digest, msg.sender);
return true;
}
function mintNFTGOBlocksUntil() public view returns (uint num) {
return _BLOCKS_PER_READJUSTMENT/8 - (slowBlocks % (_BLOCKS_PER_READJUSTMENT/8 ));
}
function mintNFTGO() public view returns (uint num) {
return slowBlocks % (_BLOCKS_PER_READJUSTMENT/8);
}
function mintNFT721(address nftaddy, uint nftNumber, uint256 nonce, bytes32 challenge_digest) public payable returns (bool success) {
require(mintNFTGO() == 0, "Only mint on slowBlocks % _BLOCKS_PER_READJUSTMENT/8 == 0");
mintTo(nonce, challenge_digest, msg.sender);
IERC721(nftaddy).safeTransferFrom(address(this), msg.sender, nftNumber, "");
if(mintNFTGO() == 0){
slowBlocks = slowBlocks.add(1);
}
return true;
}
function mintNFT1155(address nftaddy, uint nftNumber, uint256 nonce, bytes32 challenge_digest) public payable returns (bool success) {
require(mintNFTGO() == 0, "Only mint on slowBlocks % _BLOCKS_PER_READJUSTMENT/8 == 0");
mintTo(nonce, challenge_digest, msg.sender);
IERC1155(nftaddy).safeTransferFrom(address(this), msg.sender, nftNumber, 1, "" );
if(mintNFTGO() == 0){
slowBlocks = slowBlocks.add(1);
}
return true;
}
function mintTo(uint256 nonce, bytes32 challenge_digest, address mintToAddress) public payable returns (uint256 totalOwed) {
bytes32 digest = keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));
//the challenge digest must match the expected
require(digest == challenge_digest, "Old challenge_digest or wrong challenge_digest");
//the digest must be smaller than the target
require(uint256(digest) < miningTarget, "Digest must be smaller than miningTarget");
_startNewMiningEpoch();
require(block.timestamp > previousBlockTime, "No same second solves");
//uint diff = block.timestamp - previousBlockTime;
uint256 x = ((block.timestamp - previousBlockTime) * 888) / targetTime;
uint ratio = x * 100 / 888 ;
if(ratio > 100){
slowBlocks = slowBlocks.add(1);
}
//best @ 3000 ratio totalOwed / 100000000 = 71.6
if(ratio < 3000){
totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
require(msg.value >= ((1 * 10**15) / ((ratio+10)/10)), "Must send more ETH because requires eth, check howMuchETH() function to find amount needed");
}else {
totalOwed = (24*x*5086060).div(888)+3456750000;
if(ratio < 6000){
uint ratioETH = ratio - 2995;
require(msg.value >= ((1 * 10**15) / (((ratioETH+10) / 10) * 500)), "Must send more ETH because requires eth until 60x targetTime, check howMuchETH() function to find amount needed");
}
}
uint totalOwedABAS = (reward_amount * totalOwed).div(100000000);
balances[mintToAddress] = balances[mintToAddress].add(totalOwedABAS);
emit Transfer(address(0), mintToAddress, totalOwedABAS);
tokensMinted = tokensMinted.add(totalOwedABAS);
previousBlockTime = block.timestamp;
if(give0x > 0){
if(ratio < 2000){
address payable to = payable(mintToAddress);
to.transfer((totalOwed * Token2Per * give0x).div(100000000));
//IERC20(AddressZeroXBTC).transfer(mintTo, (totalOwed * Token2Per * give0xBTC).div(100000000 * 2));
}else{
address payable to = payable(mintToAddress);
to.transfer((320 * Token2Per * give0x).div(10));
//IERC20(AddressZeroXBTC).transfer(mintTo, (40 * Token2Per * give0xBTC).div(10 * 2));
}
}
emit Mint(mintToAddress, totalOwedABAS, epochCount, challengeNumber );
return totalOwed;
}
function howMuchETHatTime(uint secondsBetweenEpoch) public view returns (uint totalETHNeeded){
uint256 x = ((secondsBetweenEpoch) * 888) / targetTime;
uint ratio = x * 100 / 888;
if(ratio >= 3000){
if(ratio < 6000){
ratio = ratio - 2995;
return ((1 * 10**15) / (((ratio+7) / 10) * 500)) ;
}
return 0;
}else if(ratio > 18){
//A Little behind so we dont bump into error on mint.
ratio = ratio - 3;
}
return (1 * 10**15 / ((ratio+10)/10));
}
//A Little ahead so we dont bump into error.
function howMuchETH() public view returns (uint totalETHNeeded){
return howMuchETHatTime((block.timestamp - previousBlockTime));
}
function YourETHBalance() public view returns( uint urTotalETHInWallet){
return (msg.sender).balance;
}
function mintJustABAS(uint256 nonce, bytes32 challenge_digest) public payable returns (bool success){
mintToJustABAS(nonce, challenge_digest, msg.sender);
return true;
}
function mintToJustABAS(uint256 nonce, bytes32 challenge_digest, address mintToAddress) public payable returns (uint256 totalOwed) {
bytes32 digest = keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));
//the challenge digest must match the expected
require(digest == challenge_digest, "Old challenge_digest or wrong challenge_digest");
//the digest must be smaller than the target
require(uint256(digest) < miningTarget, "Digest must be smaller than miningTarget");
_startNewMiningEpoch();
require(block.timestamp > previousBlockTime, "No solve for first 5 seconds.");
//uint diff = block.timestamp - previousBlockTime;
uint256 x = ((block.timestamp - previousBlockTime) * 888) / targetTime;
uint ratio = x * 100 / 888 ;
if(ratio > 100){
slowBlocks = slowBlocks.add(1);
}
//best @ 3000 ratio totalOwed / 100000000 = 71.6
if(ratio < 3000){
totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
require(msg.value >= ((1 * 10**15) / ((ratio+10)/10)), "Must send more ETH because requires eth, check howMuchETH() function to find amount needed");
}else {
totalOwed = (24*x*5086060).div(888)+3456750000;
if(ratio < 6000){
ratio = ratio - 2995;
require(msg.value >= ((1 * 10**15) / (((ratio+10) / 10) * 500)), "Must send more ETH because requires eth until 60x targetTime, check howMuchETH() function to find amount needed");
}
}
uint totalOwedABAS = (reward_amount * totalOwed).div(100000000);
balances[mintToAddress] = balances[mintToAddress].add(totalOwedABAS);
emit Transfer(address(0), mintToAddress, totalOwedABAS);
tokensMinted = tokensMinted.add(totalOwedABAS);
previousBlockTime = block.timestamp;
emit Mint(mintToAddress, totalOwedABAS, epochCount, challengeNumber );
return totalOwed;
}
function mintTokensArrayTo(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address[] memory MintTo) public payable returns (uint256 owed) {
uint256 totalOd = mintTo(nonce,challenge_digest, MintTo[0]);
require(totalOd > 0, "mint issue");
require(MintTo.length == ExtraFunds.length + 1,"MintTo has to have an extra address compared to ExtraFunds");
uint xy=0;
for(xy = 0; xy< ExtraFunds.length; xy++)
{
if(epochCount % (2**(xy+1)) != 0){
break;
}
for(uint y=xy+1; y< ExtraFunds.length; y++){
require(ExtraFunds[y] != ExtraFunds[xy], "No printing The same tokens");
}
}
uint256 totalOwed = 0;
uint256 TotalOwned = 0;
for(uint x=0; x<xy; x++)
{
//epoch count must evenly dividable by 2^n in order to get extra mints.
//ex. epoch 2 = 1 extramint, epoch 4 = 2 extra, epoch 8 = 3 extra mints, ..., epoch 32 = 5 extra mints w/ a divRound for the 5th mint(allows small balance token minting aka NFTs)
if(epochCount % (2**(x+1)) == 0){
TotalOwned = IERC20(ExtraFunds[x]).balanceOf(address(this));
if(TotalOwned != 0){
if( x % 3 == 0 && x != 0 && totalOd > 17600000){
totalOwed = ( (2** rewardEra) *TotalOwned * totalOd).divRound(100000000 * 20000);
}else{
totalOwed = ( (2** rewardEra) * TotalOwned * totalOd).div(100000000 * 20000);
}
}
IERC20(ExtraFunds[x]).transfer(MintTo[x+1], totalOwed);
}
}
emit MegaMint(msg.sender, epochCount, challengeNumber, xy, totalOd );
return totalOd;
}
function mintTokensSameAddress(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address MintTo) public payable returns (bool success) {
address[] memory dd = new address[](ExtraFunds.length + 1);
for(uint x=0; x< (ExtraFunds.length + 1); x++)
{
dd[x] = MintTo;
}
mintTokensArrayTo(nonce, challenge_digest, ExtraFunds, dd);
return true;
}
function mintTokensArrayToJustABAS(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address[] memory MintTo) public payable returns (uint256 owed) {
uint256 totalOd = mintToJustABAS(nonce,challenge_digest, MintTo[0]);
require(totalOd > 0, "mint issue");
require(MintTo.length == ExtraFunds.length + 1,"MintTo has to have an extra address compared to ExtraFunds");
uint xy=0;
for(xy = 0; xy< ExtraFunds.length; xy++)
{
if(epochCount % (2**(xy+1)) != 0){
break;
}
for(uint y=xy+1; y< ExtraFunds.length; y++){
require(ExtraFunds[y] != ExtraFunds[xy], "No printing The same tokens");
}
}
uint256 totalOwed = 0;
uint256 TotalOwned = 0;
for(uint x=0; x<xy; x++)
{
//epoch count must evenly dividable by 2^n in order to get extra mints.
//ex. epoch 2 = 1 extramint, epoch 4 = 2 extra, epoch 8 = 3 extra mints, ..., epoch 32 = 5 extra mints w/ a divRound for the 5th mint(allows small balance token minting aka NFTs)
if(epochCount % (2**(x+1)) == 0){
TotalOwned = IERC20(ExtraFunds[x]).balanceOf(address(this));
if(TotalOwned != 0){
if( x % 3 == 0 && x != 0 && totalOd > 17600000){
totalOwed = ( (2** rewardEra) *TotalOwned * totalOd).divRound(100000000 * 20000);
}else{
totalOwed = ( (2** rewardEra) * TotalOwned * totalOd).div(100000000 * 20000);
}
}
IERC20(ExtraFunds[x]).transfer(MintTo[x+1], totalOwed);
}
}
emit MegaMint(msg.sender, epochCount, challengeNumber, xy, totalOd );
return totalOd;
}
function mintTokensSameAddressJustABAS(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address MintTo) public payable returns (bool success) {
address[] memory dd = new address[](ExtraFunds.length + 1);
for(uint x=0; x< (ExtraFunds.length + 1); x++)
{
dd[x] = MintTo;
}
mintTokensArrayToJustABAS(nonce, challenge_digest, ExtraFunds, dd);
return true;
}
function empty_mintTo(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address[] memory MintTo) public payable returns (uint256 owed) {
bytes32 digest = keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));
//the challenge digest must match the expected
require(digest == challenge_digest, "Old challenge_digest or wrong challenge_digest");
//the digest must be smaller than the target
require(uint256(digest) < miningTarget, "Digest must be smaller than miningTarget");
_startNewMiningEpoch();
require(block.timestamp > previousBlockTime, "No same second solves");
require(MintTo.length == ExtraFunds.length,"MintTo has to have same number of addressses as ExtraFunds");
uint xy=0;
for(xy = 0; xy< ExtraFunds.length; xy++)
{
if(epochCount % (2**(xy+1)) != 0){
break;
}
for(uint y=xy+1; y< ExtraFunds.length; y++){
require(ExtraFunds[y] != ExtraFunds[xy], "No printing The same tokens");
}
}
uint256 x = ((block.timestamp - previousBlockTime) * 888) / targetTime;
uint ratio = x * 100 / 888 ;
uint totalOwed = 0;
if(ratio > 100){
slowBlocks = slowBlocks.add(1);
}
//best @ 3000 ratio totalOwed / 100000000 = 71.6
if(ratio < 3000){
totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
require(msg.value >= ((1 * 10**15) / ((ratio+10)/10)), "Must send more ETH because requires eth, check howMuchETH() function to find amount needed");
}else {
totalOwed = (24*x*5086060).div(888)+3456750000;
if(ratio < 6000){
ratio = ratio - 2995;
require(msg.value >= ((1 * 10**15) / (((ratio+10) / 10) * 500)), "Must send more ETH because requires eth until 60x targetTime, check howMuchETH() function to find amount needed");
}
}
uint256 TotalOwned;
for(uint z=0; z<xy; z++)
{
//epoch count must evenly dividable by 2^n in order to get extra mints.
//ex. epoch 2 = 1 extramint, epoch 4 = 2 extra, epoch 8 = 3 extra mints, epoch 16 = 4 extra mints w/ a divRound for the 4th mint(allows small balance token minting aka NFTs)
if(epochCount % (2**(x+1)) == 0){
TotalOwned = IERC20(ExtraFunds[x]).balanceOf(address(this));
if(TotalOwned != 0){
if( x % 3 == 0 && x != 0 && totalOwed > 17600000){
totalOwed = ( (2** rewardEra) * TotalOwned * totalOwed).divRound(100000000 * 20000);
}else{
totalOwed = ( (2** rewardEra) * TotalOwned * totalOwed).div(100000000 * 20000 );
}
IERC20(ExtraFunds[x]).transfer(MintTo[x], totalOwed);
}
}
}
previousBlockTime = block.timestamp;
return totalOwed;
}
function timeFromLastSolve() public view returns (uint256 time){
time = block.timestamp - previousBlockTime;
return time;
}
function rewardAtCurrentTime() public view returns (uint256 reward){
uint256 x = (block.timestamp - previousBlockTime);
reward = rewardAtTime(x);
return reward;
}
function rewardAtTime(uint timeDifference) public view returns (uint256 rewards){
uint256 x = (timeDifference * 888) / targetTime;
uint ratio = x * 100 / 888 ;
uint totalOwed = 0;
//best @ 3000 ratio totalOwed / 100000000 = 71.6
if(ratio < 3000){
totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
}else {
totalOwed = (24*x*5086060).div(888)+3456750000;
}
rewards = (reward_amount * totalOwed).div(100000000);
return rewards;
}
function blocksFromReadjust() public view returns (uint256 blocks){
blocks = (epochCount - epochOld);
return blocks;
}
function blocksToReadjust() public view returns (uint blocks){
if((epochCount - epochOld) == 0){
if(give == 1){
return (_BLOCKS_PER_READJUSTMENT);
}else{
return (_BLOCKS_PER_READJUSTMENT / 8);
}
}
uint256 blktimestamp = block.timestamp;
uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestreAdjustStarted;
uint adjusDiffTargetTime = targetTime * ((epochCount - epochOld) % (_BLOCKS_PER_READJUSTMENT/8));
if( TimeSinceLastDifficultyPeriod2 > adjusDiffTargetTime)
{
blocks = _BLOCKS_PER_READJUSTMENT/8 - ((epochCount - epochOld) % (_BLOCKS_PER_READJUSTMENT/8));
return (blocks);
}else{
blocks = _BLOCKS_PER_READJUSTMENT - ((epochCount - epochOld) % _BLOCKS_PER_READJUSTMENT);
return (blocks);
}
}
function _startNewMiningEpoch() internal {
//if max supply for the era will be exceeded next reward round then enter the new era before that happens
//59 is the final reward era, almost all tokens minted
if( tokensMinted.add(reward_amount) > maxSupplyForEra && rewardEra < 15)
{
rewardEra = rewardEra + 1;
maxSupplyForEra = _totalSupply - _totalSupply.div( 2**(rewardEra + 1));
if(rewardEra < 8){
_MINIMUM_TARGET = _MINIMUM_TARGET.div(2);
targetTime = ((12 * 60) * 2**rewardEra);
if(rewardEra < 6){
if(_BLOCKS_PER_READJUSTMENT <= 16){
_BLOCKS_PER_READJUSTMENT = 8;
}else{
_BLOCKS_PER_READJUSTMENT = _BLOCKS_PER_READJUSTMENT / 2;
}
}
}else{
reward_amount = ( 20 * 10**uint(decimals)).div( 2**(rewardEra - 7 ) );
}
}
//set the next minted supply at which the era will change
// total supply of MINED tokens is 21000000000000000000000000 because of 18 decimal places
epochCount = epochCount.add(1);
//every so often, readjust difficulty. Dont readjust when deploying
if((epochCount - epochOld) % (_BLOCKS_PER_READJUSTMENT / 8) == 0)
{
ARewardSender();
maxSupplyForEra = _totalSupply - _totalSupply.div( 2**(rewardEra + 1));
uint256 blktimestamp = block.timestamp;
uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestreAdjustStarted;
uint adjusDiffTargetTime = targetTime * (_BLOCKS_PER_READJUSTMENT / 8) ;
latestreAdjustStarted = block.timestamp;
if( TimeSinceLastDifficultyPeriod2 > adjusDiffTargetTime || (epochCount - epochOld) % _BLOCKS_PER_READJUSTMENT == 0)
{
_reAdjustDifficulty();
}
}
challengeNumber = ArbSys(0x0000000000000000000000000000000000000064).arbBlockHash( ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber() - 1);
}
function reAdjustsToWhatDifficulty() public view returns (uint difficulty) {
if(epochCount - epochOld == 0){
return _MAXIMUM_TARGET.div(miningTarget);
}
uint256 blktimestamp = block.timestamp;
uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;
uint epochTotal = epochCount - epochOld;
uint adjusDiffTargetTime = targetTime * epochTotal;
uint miningTarget2 = 0;
//if there were less eth blocks passed in time than expected
if( TimeSinceLastDifficultyPeriod2 < adjusDiffTargetTime )
{
uint excess_block_pct = (adjusDiffTargetTime.mult(100)).div( TimeSinceLastDifficultyPeriod2 );
uint excess_block_pct_extra = excess_block_pct.sub(100).limitLessThan(1000);
//make it harder
miningTarget2 = miningTarget.sub(miningTarget.div(2000).mult(excess_block_pct_extra)); //by up to 50 %
}else{
uint shortage_block_pct = (TimeSinceLastDifficultyPeriod2.mult(100)).div( adjusDiffTargetTime );
uint shortage_block_pct_extra = shortage_block_pct.sub(100).limitLessThan(1000); //always between 0 and 1000
//make it easier
miningTarget2 = miningTarget.add(miningTarget.div(500).mult(shortage_block_pct_extra)); //by up to 200 %
}
if(miningTarget2 < _MINIMUM_TARGET) //very difficult
{
miningTarget2 = _MINIMUM_TARGET;
}
if(miningTarget2 > _MAXIMUM_TARGET) //very easy
{
miningTarget2 = _MAXIMUM_TARGET;
}
difficulty = _MAXIMUM_TARGET.div(miningTarget2);
return difficulty;
}
function _reAdjustDifficulty() internal {
uint256 blktimestamp = block.timestamp;
uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;
uint epochTotal = epochCount - epochOld;
uint adjusDiffTargetTime = targetTime * epochTotal;
epochOld = epochCount;
//if there were less eth blocks passed in time than expected
if( TimeSinceLastDifficultyPeriod2 < adjusDiffTargetTime )
{
uint excess_block_pct = (adjusDiffTargetTime.mult(100)).div( TimeSinceLastDifficultyPeriod2 );
give = 1;
uint excess_block_pct_extra = excess_block_pct.sub(100).limitLessThan(1000);
//make it harder
miningTarget = miningTarget.sub(miningTarget.div(2000).mult(excess_block_pct_extra)); //by up to 50 %
}else{
uint shortage_block_pct = (TimeSinceLastDifficultyPeriod2.mult(100)).div( adjusDiffTargetTime );
give = 2;
uint shortage_block_pct_extra = shortage_block_pct.sub(100).limitLessThan(1000); //always between 0 and 1000
//make it easier
miningTarget = miningTarget.add(miningTarget.div(500).mult(shortage_block_pct_extra)); //by up to 200 %
}
latestDifficultyPeriodStarted2 = blktimestamp;
latestDifficultyPeriodStarted = ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber();
if(miningTarget < _MINIMUM_TARGET) //very difficult
{
miningTarget = _MINIMUM_TARGET;
}
if(miningTarget > _MAXIMUM_TARGET) //very easy
{
miningTarget = _MAXIMUM_TARGET;
}
}
//Stat Functions
function inflationMined () public view returns (uint YearlyInflation, uint EpochsPerYear, uint RewardsAtTime, uint TimePerEpoch){
if(epochCount - epochOld == 0){
return (0, 0, 0, 0);
}
uint256 blktimestamp = block.timestamp;
uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;
TimePerEpoch = TimeSinceLastDifficultyPeriod2 / blocksFromReadjust();
RewardsAtTime = rewardAtTime(TimePerEpoch);
uint year = 365 * 24 * 60 * 60;
EpochsPerYear = year / TimePerEpoch;
YearlyInflation = RewardsAtTime * EpochsPerYear;
return (YearlyInflation, EpochsPerYear, RewardsAtTime, TimePerEpoch);
}
function toNextEraDays () public view returns (uint daysToNextEra, uint _maxSupplyForEra, uint _tokensMinted, uint amtDaily){
(uint totalamt,,,) = inflationMined();
(amtDaily) = totalamt / 365;
if(amtDaily == 0){
return(0,0,0,0);
}
daysToNextEra = (maxSupplyForEra - tokensMinted) / amtDaily;
return (daysToNextEra, maxSupplyForEra, tokensMinted, amtDaily);
}
function toNextEraEpochs () public view returns ( uint epochs, uint epochTime, uint daysToNextEra){
if(blocksFromReadjust() == 0){
return (0,0,0);
}
uint256 blktimestamp = block.timestamp;
uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;
uint timePerEpoch = TimeSinceLastDifficultyPeriod2 / blocksFromReadjust();
(uint daysz,,,) = toNextEraDays();
uint amt = daysz * (60*60*24) / timePerEpoch;
return (amt, timePerEpoch, daysz);
}
//help debug mining software
function checkMintSolution(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number, uint testTarget) public view returns (bool success) {
bytes32 digest = bytes32(keccak256(abi.encodePacked(challenge_number,msg.sender,nonce)));
if(uint256(digest) > testTarget) revert();
return (digest == challenge_digest);
}
function checkMintSolutionForAddress(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number, uint testTarget, address sender) public view returns (bool success) {
bytes32 digest = bytes32(keccak256(abi.encodePacked(challenge_number,sender,nonce)));
if(uint256(digest) > testTarget) revert();
return (digest == challenge_digest);
}
//this is a recent ethereum block hash, used to prevent pre-mining future blocks
function getChallengeNumber() public view returns (bytes32) {
return challengeNumber;
}
//the number of zeroes the digest of the PoW solution requires. Auto adjusts
function getMiningDifficulty() public view returns (uint) {
return _MAXIMUM_TARGET.div(miningTarget);
}
function getMiningTarget() public view returns (uint) {
return (miningTarget);
}
function getMiningMinted() public view returns (uint) {
return tokensMinted;
}
function getCirculatingSupply() public view returns (uint) {
return tokensMinted + sentToLP + AuctionsCT.totalAuctioned();
}
//~21m coins total in minting
//reward begins at 20 and the same for the first 8 eras (0-7), targetTime doubles to compensate for first 8 eras
//After rewardEra = 8 it halves the reward every Era after because no more targetTime is added
function getMiningReward() public view returns (uint) {
//once we get half way thru the coins, only get 25 per block
//every reward era, the reward amount halves.
if(rewardEra < 8){
return ( 20 * 10**uint(decimals));
}else{
return ( 20 * 10**uint(decimals)).div( 2**(rewardEra - 7 ) );
}
}
function getEpoch() public view returns (uint) {
return epochCount ;
}
//help debug mining software
function getMintDigest(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number) public view returns (bytes32 digesttest) {
bytes32 digest = keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));
return digest;
}
// ------------------------------------------------------------------------
// Get the token balance for account `tokenOwner`
// ------------------------------------------------------------------------
function balanceOf(address tokenOwner) public override view returns (uint balance) {
return balances[tokenOwner];
}
// ------------------------------------------------------------------------
// Transfer the balance from token owner's account to `to` account
// - Owner's account must have sufficient balance to transfer
// - 0 value transfers are allowed
// ------------------------------------------------------------------------
function transfer(address to, uint tokens) public override returns (bool success) {
balances[msg.sender] = balances[msg.sender].sub(tokens);
balances[to] = balances[to].add(tokens);
emit Transfer(msg.sender, to, tokens);
return true;
}
// ------------------------------------------------------------------------
// Token owner can approve for `spender` to transferFrom(...) `tokens`
// from the token owner's account
//
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
// recommends that there are no checks for the approval double-spend attack
// as this should be implemented in user interfaces
// ------------------------------------------------------------------------
function approve(address spender, uint tokens) public override returns (bool success) {
allowed[msg.sender][spender] = tokens;
emit Approval(msg.sender, spender, tokens);
return true;
}
// ------------------------------------------------------------------------
// Transfer `tokens` from the `from` account to the `to` account
//
// The calling account must already have sufficient tokens approve(...)-d
// for spending from the `from` account and
// - From account must have sufficient balance to transfer
// - Spender must have sufficient allowance to transfer
// - 0 value transfers are allowed
// ------------------------------------------------------------------------
function transferFrom(address from, address to, uint tokens) public override returns (bool success) {
balances[from] = balances[from].sub(tokens);
allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);
balances[to] = balances[to].add(tokens);
emit Transfer(from, to, tokens);
return true;
}
// ------------------------------------------------------------------------
// Returns the amount of tokens approved by the owner that can be
// transferred to the spender's account
// ------------------------------------------------------------------------
function allowance(address tokenOwner, address spender) public override view returns (uint remaining) {
return allowed[tokenOwner][spender];
}
//Allow ETH to enter
receive() external payable {
}
fallback() external payable {
}
}
/*
*
* MIT License
* ===========
*
* Copyright (c) 2023 Arbitrum Bitcoin and Staking (ABAS)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
*/Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"epochCount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newChallengeNumber","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"NumberOfTokensMinted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TokenMultipler","type":"uint256"}],"name":"MegaMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochCount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newChallengeNumber","type":"bytes32"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"TransferOwnership","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ARewardSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"AddressAuction","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AddressLPReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AuctionsCT","outputs":[{"internalType":"contract ABASAuctionsCT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Token2Per","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YourETHBalance","outputs":[{"internalType":"uint256","name":"urTotalETHInWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BLOCKS_PER_READJUSTMENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MAXIMUM_TARGET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MINIMUM_TARGET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksFromReadjust","outputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksToReadjust","outputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"challengeNumber","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"bytes32","name":"challenge_number","type":"bytes32"},{"internalType":"uint256","name":"testTarget","type":"uint256"}],"name":"checkMintSolution","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"bytes32","name":"challenge_number","type":"bytes32"},{"internalType":"uint256","name":"testTarget","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"checkMintSolutionForAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address[]","name":"MintTo","type":"address[]"}],"name":"empty_mintTo","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"epochCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochOld","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChallengeNumber","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningDifficulty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"bytes32","name":"challenge_number","type":"bytes32"}],"name":"getMintDigest","outputs":[{"internalType":"bytes32","name":"digesttest","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"give","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"give0x","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"howMuchETH","outputs":[{"internalType":"uint256","name":"totalETHNeeded","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsBetweenEpoch","type":"uint256"}],"name":"howMuchETHatTime","outputs":[{"internalType":"uint256","name":"totalETHNeeded","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inflationMined","outputs":[{"internalType":"uint256","name":"YearlyInflation","type":"uint256"},{"internalType":"uint256","name":"EpochsPerYear","type":"uint256"},{"internalType":"uint256","name":"RewardsAtTime","type":"uint256"},{"internalType":"uint256","name":"TimePerEpoch","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestDifficultyPeriodStarted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestDifficultyPeriodStarted2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestreAdjustStarted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyForEra","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miningTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mint","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mintJustABAS","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"nftaddy","type":"address"},{"internalType":"uint256","name":"nftNumber","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mintNFT1155","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"nftaddy","type":"address"},{"internalType":"uint256","name":"nftNumber","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mintNFT721","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintNFTGO","outputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintNFTGOBlocksUntil","outputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address","name":"mintToAddress","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"totalOwed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address","name":"mintToAddress","type":"address"}],"name":"mintToJustABAS","outputs":[{"internalType":"uint256","name":"totalOwed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address[]","name":"MintTo","type":"address[]"}],"name":"mintTokensArrayTo","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address[]","name":"MintTo","type":"address[]"}],"name":"mintTokensArrayToJustABAS","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address","name":"MintTo","type":"address"}],"name":"mintTokensSameAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address","name":"MintTo","type":"address"}],"name":"mintTokensSameAddressJustABAS","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"multipler","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldecount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reAdjustsToWhatDifficulty","outputs":[{"internalType":"uint256","name":"difficulty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardAtCurrentTime","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeDifference","type":"uint256"}],"name":"rewardAtTime","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardEra","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sentToLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"slowBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeFromLastSolve","outputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toNextEraDays","outputs":[{"internalType":"uint256","name":"daysToNextEra","type":"uint256"},{"internalType":"uint256","name":"_maxSupplyForEra","type":"uint256"},{"internalType":"uint256","name":"_tokensMinted","type":"uint256"},{"internalType":"uint256","name":"amtDaily","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toNextEraEpochs","outputs":[{"internalType":"uint256","name":"epochs","type":"uint256"},{"internalType":"uint256","name":"epochTime","type":"uint256"},{"internalType":"uint256","name":"daysToNextEra","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AuctionAddress2","type":"address"},{"internalType":"address","name":"LPGuild2","type":"address"}],"name":"zinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526102d06001556a2b6d4ec1c9bd6f2be400006005556a115eec47f6cf7e3500000060065542600755600060085542600955610400600a55600160ea1b600b5562000063632114a0c0600b546200034f60201b620032251790919060201c565b600c556200008865048c27395000600b546200034f60201b620032251790919060201c565b600d5560646001600160a01b0316632b407a82600160646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001039190620003a9565b6200010f9190620003d9565b6040518263ffffffff1660e01b81526004016200012e91815260200190565b602060405180830381865afa1580156200014c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001729190620003a9565b600e556000600f55620001b3600f5460016200018f9190620003ef565b6200019c90600262000502565b6006546200034f60201b620032251790919060201c565b600654620001c29190620003d9565b601055600260115560006012556000601355600060145542601555620f424060165560006017556000601a556000601b556000601c556001601d5560405180606001604052806022815260200162004a2f60229139601e90620002269082620005b5565b5042601f5560646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200026b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002919190620003a9565b6020556021805460ff19169055348015620002ab57600080fd5b50600080546001600160a01b0319163390811782556040805192835260208301919091527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a1336000818152601860209081526040808320670de0b6b3a76400009081905590519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3620006a4565b600081600003620003945760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640160405180910390fd5b620003a0828462000681565b90505b92915050565b600060208284031215620003bc57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115620003a357620003a3620003c3565b80820180821115620003a357620003a3620003c3565b600181815b80851115620004465781600019048211156200042a576200042a620003c3565b808516156200043857918102915b93841c93908002906200040a565b509250929050565b6000826200045f57506001620003a3565b816200046e57506000620003a3565b81600181146200048757600281146200049257620004b2565b6001915050620003a3565b60ff841115620004a657620004a6620003c3565b50506001821b620003a3565b5060208310610133831016604e8410600b8410161715620004d7575081810a620003a3565b620004e3838362000405565b8060001904821115620004fa57620004fa620003c3565b029392505050565b6000620003a083836200044e565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200053b57607f821691505b6020821081036200055c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005b057600081815260208120601f850160051c810160208610156200058b5750805b601f850160051c820191505b81811015620005ac5782815560010162000597565b5050505b505050565b81516001600160401b03811115620005d157620005d162000510565b620005e981620005e2845462000526565b8462000562565b602080601f831160018114620006215760008415620006085750858301515b600019600386901b1c1916600185901b178555620005ac565b600085815260208120601f198616915b82811015620006525788860151825594840194600190910190840162000631565b5085821015620006715787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000826200069f57634e487b7160e01b600052601260045260246000fd5b500490565b61437b80620006b46000396000f3fe60806040526004361061041b5760003560e01c806370a082311161021c578063a7ef6b8f11610122578063d0f66e4b116100b0578063f23a6e6111610077578063f23a6e61146104e9578063f2f3bf2d14610bd5578063f56f8d3614610be8578063f7a5f15514610bfc578063f95d391914610c0f57005b8063d0f66e4b14610b20578063dc6e9cf914610b50578063dd62ed3e14610b66578063ddfbd8dd14610bac578063e932012b14610bbf57005b8063c76ae540116100f4578063c76ae54014610aad578063c8a1465c14610ac2578063cb9ae70714610ad5578063cfcb52d414610aeb578063d0856d1614610b0b57005b8063a7ef6b8f14610a42578063a9059cbb14610a62578063b5ade81b14610a82578063c0abebe014610a9857005b80638ae0368b116101aa57806397566aa01161017157806397566aa0146109c057806399f584b3146109e05780639e96a23a146109f6578063a2ac4c3714610a0c578063a68eb88e14610a2c57005b80638ae0368b146109275780638c0838ab1461093d5780638da5cb5b1461095057806394b939ef1461097057806395d89b411461099057005b8063819c9d9e116101ee578063819c9d9e146108bd578063829965cc146108d257806387a2a9d6146108e85780638a083c98146108fe5780638a769d351461091157005b806370a082311461083f578063757991a81461087557806377ed6b141461088a57806381269a561461089d57005b80632d38bf7a1161032157806345d8a232116102af5780634ef37628116102765780634ef37628146107c95780634fa972e1146107de578063653517ef146107f457806369d3e5df146108095780636de9f32b1461082957005b806345d8a23214610762578063467d809e1461077857806347353b691461078b578063490203a71461079e5780634cbf68fe146107b357005b806334d5b131116102f357806334d5b131146106ec57806335b80bfb146107015780633c953615146107215780633dc8a068146107375780634513e1441461074d57005b80632d38bf7a146106625780632f104e0c14610678578063313ce567146106b057806332e99708146106d757005b80631763a089116103a9578063237ef7db11610370578063237ef7db146105ec5780632381a60e1461060257806323b872dd14610618578063240c3b70146106385780632b112e491461064d57005b80631763a0891461058657806317da485f1461059b5780631801fbe5146105b057806318160ddd146105c35780631fccb33c146105d957005b80630a891b83116103ed5780630a891b83146104b45780630c97e564146104e9578063102943171461052f578063111f95d814610545578063150b7a021461055a57005b8063012d3edf1461042457806305411d881461044d57806306fdde0314610462578063095ea7b31461048457005b3661042257005b005b34801561043057600080fd5b5061043a601b5481565b6040519081526020015b60405180910390f35b34801561045957600080fd5b5061043a610c25565b34801561046e57600080fd5b50610477610c3a565b60405161044491906138e0565b34801561049057600080fd5b506104a461049f36600461394a565b610cc8565b6040519015158152602001610444565b3480156104c057600080fd5b506104c9610d35565b604080519485526020850193909352918301526060820152608001610444565b3480156104f557600080fd5b506105166105043660046139bd565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b03199091168152602001610444565b34801561053b57600080fd5b5061043a60155481565b34801561055157600080fd5b5061043a610dbd565b34801561056657600080fd5b50610516610575366004613a35565b630a85bd0160e11b95945050505050565b34801561059257600080fd5b5061043a610f1c565b3480156105a757600080fd5b5061043a610f53565b6104a46105be366004613aa4565b610f6c565b3480156105cf57600080fd5b5061043a60055481565b6104a46105e7366004613b7e565b610f83565b3480156105f857600080fd5b5061043a60095481565b34801561060e57600080fd5b5061043a60115481565b34801561062457600080fd5b506104a4610633366004613bdf565b611046565b34801561064457600080fd5b506104c9611132565b34801561065957600080fd5b5061043a6111a2565b34801561066e57600080fd5b5061043a600f5481565b34801561068457600080fd5b50600454610698906001600160a01b031681565b6040516001600160a01b039091168152602001610444565b3480156106bc57600080fd5b506106c5601281565b60405160ff9091168152602001610444565b3480156106e357600080fd5b50600d5461043a565b3480156106f857600080fd5b5061043a61122d565b34801561070d57600080fd5b5061043a61071c366004613c1b565b611330565b34801561072d57600080fd5b5061043a601c5481565b34801561074357600080fd5b5061043a60145481565b34801561075957600080fd5b5061043a611414565b34801561076e57600080fd5b5061043a60015481565b6104a4610786366004613aa4565b611427565b6104a4610799366004613c34565b611434565b3480156107aa57600080fd5b5061043a611511565b3480156107bf57600080fd5b5061043a601a5481565b3480156107d557600080fd5b50600e5461043a565b3480156107ea57600080fd5b5061043a60105481565b34801561080057600080fd5b5061043a611569565b34801561081557600080fd5b506104a4610824366004613c6d565b61158b565b34801561083557600080fd5b5061043a60175481565b34801561084b57600080fd5b5061043a61085a366004613cb6565b6001600160a01b031660009081526018602052604090205490565b34801561088157600080fd5b5060085461043a565b6104a4610898366004613c34565b6115d7565b3480156108a957600080fd5b506104a46108b8366004613cd1565b611658565b3480156108c957600080fd5b5061043a6116a3565b3480156108de57600080fd5b5061043a60085481565b3480156108f457600080fd5b5061043a600b5481565b6104a461090c366004613b7e565b6116c1565b34801561091d57600080fd5b5061043a600d5481565b34801561093357600080fd5b5061043a600e5481565b61043a61094b366004613d03565b611777565b34801561095c57600080fd5b50600054610698906001600160a01b031681565b34801561097c57600080fd5b50600254610698906001600160a01b031681565b34801561099c57600080fd5b50610477604051806040016040528060048152602001634142415360e01b81525081565b3480156109cc57600080fd5b5061043a6109db366004613d38565b611aaa565b3480156109ec57600080fd5b5061043a60135481565b348015610a0257600080fd5b5061043a601d5481565b348015610a1857600080fd5b5061043a610a27366004613c1b565b611ae5565b348015610a3857600080fd5b5061043a60165481565b348015610a4e57600080fd5b50600354610698906001600160a01b031681565b348015610a6e57600080fd5b506104a4610a7d36600461394a565b611bb5565b348015610a8e57600080fd5b5061043a600a5481565b348015610aa457600080fd5b5060175461043a565b348015610ab957600080fd5b5061043a611c3a565b61043a610ad0366004613d64565b611c4c565b348015610ae157600080fd5b5061043a60205481565b348015610af757600080fd5b50610422610b06366004613ddb565b61204a565b348015610b1757600080fd5b5061042261220f565b348015610b2c57600080fd5b50610b356124bb565b60408051938452602084019290925290820152606001610444565b348015610b5c57600080fd5b5061043a600c5481565b348015610b7257600080fd5b5061043a610b81366004613ddb565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205490565b61043a610bba366004613d03565b61253f565b348015610bcb57600080fd5b5061043a60075481565b61043a610be3366004613d64565b612920565b348015610bf457600080fd5b50333161043a565b61043a610c0a366004613d64565b612c92565b348015610c1b57600080fd5b5061043a60125481565b600060155442610c359190613e24565b905090565b601e8054610c4790613e37565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7390613e37565b8015610cc05780601f10610c9557610100808354040283529160200191610cc0565b820191906000526020600020905b815481529060010190602001808311610ca357829003601f168201915b505050505081565b3360008181526019602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d239086815260200190565b60405180910390a35060015b92915050565b600080600080601b54600854610d4b9190613e24565b600003610d6357506000925082915081905080610db7565b6007544290600090610d759083613e24565b9050610d7f611c3a565b610d899082613e87565b9250610d9483611330565b93506301e13380610da58482613e87565b9550610db18686613e9b565b96505050505b90919293565b6000601b54600854610dcf9190613e24565b600003610de557600d54600b54610c3591613225565b6007544290600090610df79083613e24565b90506000601b54600854610e0b9190613e24565b9050600081600154610e1d9190613e9b565b9050600081841015610e93576000610e4085610e3a856064613276565b90613225565b90506000610e5b6103e8610e558460646132de565b9061332a565b9050610e8a610e8182610e7b6107d0600d5461322590919063ffffffff16565b90613276565b600d54906132de565b92505050610ee7565b6000610ea483610e3a876064613276565b90506000610eb96103e8610e558460646132de565b9050610ee2610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5490613342565b925050505b600c54811015610ef65750600c545b600b54811115610f055750600b545b600b54610f129082613225565b9550505050505090565b60006008600a54610f2d9190613e87565b601a54610f3a9190613eb2565b6008600a54610f499190613e87565b610c359190613e24565b6000610c35600d54600b5461322590919063ffffffff16565b6000610f7983833361253f565b5060019392505050565b60008083516001610f949190613ec6565b67ffffffffffffffff811115610fac57610fac613ac6565b604051908082528060200260200182016040528015610fd5578160200160208202803683370190505b50905060005b8451610fe8906001613ec6565b81101561102c578382828151811061100257611002613ed9565b6001600160a01b03909216602092830291909101909101528061102481613eef565b915050610fdb565b5061103986868684611c4c565b5060019695505050505050565b6001600160a01b03831660009081526018602052604081205461106990836132de565b6001600160a01b03851660009081526018602090815260408083209390935560198152828220338352905220546110a090836132de565b6001600160a01b0380861660009081526019602090815260408083203384528252808320949094559186168152601890915220546110de9083613342565b6001600160a01b038085166000818152601860205260409081902093909355915190861690600080516020614326833981519152906111209086815260200190565b60405180910390a35060019392505050565b6000806000806000611142610d35565b505050905061016d816111559190613e87565b91508160000361117357600080600080945094509450945050610db7565b816017546010546111849190613e24565b61118e9190613e87565b601054601754919650945092505090919293565b6003546040805160016224c73d60e11b0319815290516000926001600160a01b03169163ffb671869160048083019260209291908290030181865afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112139190613f08565b6012546017546112239190613ec6565b610c359190613ec6565b6000601b5460085461123f9190613e24565b60000361126657601d546001036112575750600a5490565b6008600a54610c359190613e87565b60095442906000906112789083613e24565b905060006008600a5461128b9190613e87565b601b5460085461129b9190613e24565b6112a59190613eb2565b6001546112b29190613e9b565b905080821115611306576008600a546112cb9190613e87565b601b546008546112db9190613e24565b6112e59190613eb2565b6008600a546112f49190613e87565b6112fe9190613e24565b935050505090565b600a54601b546008546113199190613e24565b6113239190613eb2565b600a546112fe9190613e24565b600080600154836103786113449190613e9b565b61134e9190613e87565b90506000610378611360836064613e9b565b61136a9190613e87565b90506000610bb88210156113c65761138b610378610e3a856297bb70613e9b565b6113b5620c084061139d600287614005565b6113a890600f613e9b565b610e3a906207c2be613e9b565b6113bf9190613ec6565b90506113f5565b6113e46103786113d7856018613e9b565b610e3a90624d9b6c613e9b565b6113f29063ce09d1b0613ec6565b90505b61140b6305f5e10082601154610e3a9190613e9b565b95945050505050565b6000610c3560155442610a279190613e24565b6000610f79838333611777565b600061143e6116a3565b156114645760405162461bcd60e51b815260040161145b90614014565b60405180910390fd5b61146f83833361253f565b50604051635c46a7ef60e11b81523060048201523360248201526044810185905260806064820152600060848201526001600160a01b0386169063b88d4fde9060a4015b600060405180830381600087803b1580156114cd57600080fd5b505af11580156114e1573d6000803e3d6000fd5b505050506114ed6116a3565b60000361150657601a54611502906001613342565b601a555b506001949350505050565b60006008600f5410156115355761152a6012600a614071565b610c35906014613e9b565b610c356007600f546115479190613e24565b611552906002614071565b61155e6012600a614071565b610e3a906014613e9b565b6000806015544261157a9190613e24565b905061158581611330565b91505090565b6000808483886040516020016115a39392919061407d565b604051602081830303815290604052805190602001209050838160001c11156115cb57600080fd5b90941495945050505050565b60006115e16116a3565b156115fe5760405162461bcd60e51b815260040161145b90614014565b61160983833361253f565b50604051637921219560e11b8152306004820152336024820152604481018590526001606482015260a06084820152600060a48201526001600160a01b0386169063f242432a9060c4016114b3565b6000808333876040516020016116709392919061407d565b604051602081830303815290604052805190602001209050828160001c111561169857600080fd5b909314949350505050565b60006008600a546116b49190613e87565b601a54610c359190613eb2565b600080835160016116d29190613ec6565b67ffffffffffffffff8111156116ea576116ea613ac6565b604051908082528060200260200182016040528015611713578160200160208202803683370190505b50905060005b8451611726906001613ec6565b81101561176a578382828151811061174057611740613ed9565b6001600160a01b03909216602092830291909101909101528061176281613eef565b915050611719565b5061103986868684612920565b600080600e5433866040516020016117919392919061407d565b6040516020818303038152906040528051906020012090508381146117c85760405162461bcd60e51b815260040161145b906140a5565b600d5481106117e95760405162461bcd60e51b815260040161145b906140f3565b6117f1613390565b60155442116118425760405162461bcd60e51b815260206004820152601d60248201527f4e6f20736f6c766520666f722066697273742035207365636f6e64732e000000604482015260640161145b565b6000600154601554426118559190613e24565b61186190610378613e9b565b61186b9190613e87565b9050600061037861187d836064613e9b565b6118879190613e87565b905060648111156118a457601a546118a0906001613342565b601a555b610bb881101561192a576118c1610378610e3a846297bb70613e9b565b6118d3620c084061139d600286614005565b6118dd9190613ec6565b9350600a6118eb8282613ec6565b6118f59190613e87565b6119069066038d7ea4c68000613e87565b3410156119255760405162461bcd60e51b815260040161145b9061413b565b6119b5565b61193b6103786113d7846018613e9b565b6119499063ce09d1b0613ec6565b93506117708110156119b557611961610bb382613e24565b9050600a61196f8282613ec6565b6119799190613e87565b611985906101f4613e9b565b6119969066038d7ea4c68000613e87565b3410156119b55760405162461bcd60e51b815260040161145b906141be565b60006119cd6305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506119f39082613342565b6001600160a01b03871660008181526018602052604080822093909355915190919060008051602061432683398151915290611a329085815260200190565b60405180910390a3601754611a479082613342565b60175542601555600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d906060015b60405180910390a2505050509392505050565b600080600e543386604051602001611ac49392919061407d565b60408051808303601f19018152919052805160209091012095945050505050565b60008060015483610378611af99190613e9b565b611b039190613e87565b90506000610378611b15836064613e9b565b611b1f9190613e87565b9050610bb88110611b8857611770811015611b7e57611b40610bb382613e24565b9050600a611b4f826007613ec6565b611b599190613e87565b611b65906101f4613e9b565b611b769066038d7ea4c68000613e87565b949350505050565b5060009392505050565b6012811115611b9f57611b9c600382613e24565b90505b600a611bab8282613ec6565b611b659190613e87565b33600090815260186020526040812054611bcf90836132de565b33600090815260186020526040808220929092556001600160a01b03851681522054611bfb9083613342565b6001600160a01b03841660008181526018602052604090819020929092559051339060008051602061432683398151915290610d239086815260200190565b6000601b54600854610c359190613e24565b600080611c74868685600081518110611c6757611c67613ed9565b602002602001015161253f565b905060008111611cb35760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351611cc0906001613ec6565b835114611cdf5760405162461bcd60e51b815260040161145b90614259565b60005b8451811015611db657611cf6816001613ec6565b611d01906002614071565b600854611d0e9190613eb2565b600003611db6576000611d22826001613ec6565b90505b8551811015611da357858281518110611d4057611d40613ed9565b60200260200101516001600160a01b0316868281518110611d6357611d63613ed9565b60200260200101516001600160a01b031603611d915760405162461bcd60e51b815260040161145b906142b6565b80611d9b81613eef565b915050611d25565b5080611dae81613eef565b915050611ce2565b60008060005b83811015611fec57611dcf816001613ec6565b611dda906002614071565b600854611de79190613eb2565b600003611fda57878181518110611e0057611e00613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e749190613f08565b91508115611f1557611e87600382613eb2565b158015611e9357508015155b8015611ea2575063010c8e0085115b15611ee357611edc6501d1a94a20008684600f546002611ec29190614071565b611ecc9190613e9b565b611ed69190613e9b565b90613640565b9250611f15565b611f126501d1a94a20008684600f546002611efe9190614071565b611f089190613e9b565b610e3a9190613e9b565b92505b878181518110611f2757611f27613ed9565b60200260200101516001600160a01b031663a9059cbb88836001611f4b9190613ec6565b81518110611f5b57611f5b613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401611f959291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd891906142ed565b505b80611fe481613eef565b915050611dbc565b50600854600e5460408051928352602083019190915281018490526060810185905233907f87e5a7775b8ac2ead741e32752431bffeff76ec5f347cc202a6bad454653930b9060800160405180910390a25091979650505050505050565b6000546001600160a01b031633146120915760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b6021546a115eec47f6cf7e350000009060ff16156120b1576120b161430f565b6021805460ff19166001179055426015556120ce6012600a614071565b6120d9906014613e9b565b6011556000600f81905560178190556008819055601b55612102670de0b6b3a764000047613e87565b6013819055612114906203d090613e9b565b612121906203d090613ec6565b47600f5460026121319190614071565b61213b9190613e9b565b6121459190613e87565b601655600b54612157906103e8613225565b600d5542600755612166613390565b612171600282613e87565b6001600160a01b038416600081815260186020526040812092909255906000805160206143268339815191526121a8600285613e87565b60405190815260200160405180910390a3600280546001600160a01b03199081166001600160a01b038681169182179093556003805483169091179055600480549091169184169190911790556001601a5560085460145561220a60006136a8565b505050565b612221670de0b6b3a764000047613e87565b6013819055612233906203d090613e9b565b612240906203d090613ec6565b47600f5460026122509190614071565b61225a9190613e9b565b6122649190613e87565b601655601f546000906122779042613e24565b9050600060145460085461228b9190613e24565b905060006122998284613e87565b90506008600f5410156122c857600f546122b4906002614071565b6122c0906102d0613e9b565b6001556122de565b6122da6007600f546115479190613e24565b6011555b60006122f460015483610378611ed69190613e9b565b90506000610378612306836064613e9b565b6123109190613e87565b905060006107d082101561235457612331610378610e3a856297bb70613e9b565b612343620c084061139d600287614005565b61234d9190613ec6565b905061235b565b5063bebc20005b60006123746305f5e1008360115489611f089190613e9b565b6004546001600160a01b031660009081526018602052604090205490915061239c9082613342565b600480546001600160a01b039081166000908152601860205260408082209490945591549251921691600080516020614326833981519152906123e29085815260200190565b60405180910390a36012546123f79082613342565b601255600a5460165460049161240c91613e9b565b6124179060c8613e9b565b6124219190613e87565b4711156124a257600454601c546016546001600160a01b0390921691612451916305f5e10091611efe878c613e9b565b6040519093506001600160a01b0382169084156108fc029085906000818181858888f1935050505015801561248a573d6000803e3d6000fd5b50601d54612499906001613e9b565b601c55506124a8565b6000601c555b5050600854601455505042601f55505050565b60008060006124c8611c3a565b6000036124db5750600092839250829150565b60075442906000906124ed9083613e24565b905060006124f9611c3a565b6125039083613e87565b9050600061250f611132565b505050905060008282620151806125269190613e9b565b6125309190613e87565b98929750909550909350505050565b600080600e5433866040516020016125599392919061407d565b6040516020818303038152906040528051906020012090508381146125905760405162461bcd60e51b815260040161145b906140a5565b600d5481106125b15760405162461bcd60e51b815260040161145b906140f3565b6125b9613390565b60155442116126025760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b6000600154601554426126159190613e24565b61262190610378613e9b565b61262b9190613e87565b9050600061037861263d836064613e9b565b6126479190613e87565b9050606481111561266457601a54612660906001613342565b601a555b610bb88110156126ea57612681610378610e3a846297bb70613e9b565b612693620c084061139d600286614005565b61269d9190613ec6565b9350600a6126ab8282613ec6565b6126b59190613e87565b6126c69066038d7ea4c68000613e87565b3410156126e55760405162461bcd60e51b815260040161145b9061413b565b612779565b6126fb6103786113d7846018613e9b565b6127099063ce09d1b0613ec6565b9350611770811015612779576000612723610bb383613e24565b9050600a6127318282613ec6565b61273b9190613e87565b612747906101f4613e9b565b6127589066038d7ea4c68000613e87565b3410156127775760405162461bcd60e51b815260040161145b906141be565b505b60006127916305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506127b79082613342565b6001600160a01b038716600081815260186020526040808220939093559151909190600080516020614326833981519152906127f69085815260200190565b60405180910390a360175461280b9082613342565b60175542601555601c54156128d3576107d082101561287e576000869050806001600160a01b03166108fc61284f6305f5e100601c546016548b611f089190613e9b565b6040518115909202916000818181858888f19350505050158015612877573d6000803e3d6000fd5b50506128d3565b6000869050806001600160a01b03166108fc6128a8600a601c54601654610140611f089190613e9b565b6040518115909202916000818181858888f193505050501580156128d0573d6000803e3d6000fd5b50505b600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d90606001611a97565b60008061294886868560008151811061293b5761293b613ed9565b6020026020010151611777565b9050600081116129875760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351612994906001613ec6565b8351146129b35760405162461bcd60e51b815260040161145b90614259565b60005b8451811015612a8a576129ca816001613ec6565b6129d5906002614071565b6008546129e29190613eb2565b600003612a8a5760006129f6826001613ec6565b90505b8551811015612a7757858281518110612a1457612a14613ed9565b60200260200101516001600160a01b0316868281518110612a3757612a37613ed9565b60200260200101516001600160a01b031603612a655760405162461bcd60e51b815260040161145b906142b6565b80612a6f81613eef565b9150506129f9565b5080612a8281613eef565b9150506129b6565b60008060005b83811015611fec57612aa3816001613ec6565b612aae906002614071565b600854612abb9190613eb2565b600003612c8057878181518110612ad457612ad4613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b489190613f08565b91508115612bbb57612b5b600382613eb2565b158015612b6757508015155b8015612b76575063010c8e0085115b15612b9d57612b966501d1a94a20008684600f546002611ec29190614071565b9250612bbb565b612bb86501d1a94a20008684600f546002611efe9190614071565b92505b878181518110612bcd57612bcd613ed9565b60200260200101516001600160a01b031663a9059cbb88836001612bf19190613ec6565b81518110612c0157612c01613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401612c3b9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7e91906142ed565b505b80612c8a81613eef565b915050612a90565b600080600e543387604051602001612cac9392919061407d565b604051602081830303815290604052805190602001209050848114612ce35760405162461bcd60e51b815260040161145b906140a5565b600d548110612d045760405162461bcd60e51b815260040161145b906140f3565b612d0c613390565b6015544211612d555760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b8351835114612dcc5760405162461bcd60e51b815260206004820152603a60248201527f4d696e74546f2068617320746f20686176652073616d65206e756d626572206f60448201527f66206164647265737373657320617320457874726146756e6473000000000000606482015260840161145b565b60005b8451811015612ea357612de3816001613ec6565b612dee906002614071565b600854612dfb9190613eb2565b600003612ea3576000612e0f826001613ec6565b90505b8551811015612e9057858281518110612e2d57612e2d613ed9565b60200260200101516001600160a01b0316868281518110612e5057612e50613ed9565b60200260200101516001600160a01b031603612e7e5760405162461bcd60e51b815260040161145b906142b6565b80612e8881613eef565b915050612e12565b5080612e9b81613eef565b915050612dcf565b600060015460155442612eb69190613e24565b612ec290610378613e9b565b612ecc9190613e87565b90506000610378612ede836064613e9b565b612ee89190613e87565b905060006064821115612f0757601a54612f03906001613342565b601a555b610bb8821015612f8d57612f24610378610e3a856297bb70613e9b565b612f36620c084061139d600287614005565b612f409190613ec6565b9050600a612f4e8382613ec6565b612f589190613e87565b612f699066038d7ea4c68000613e87565b341015612f885760405162461bcd60e51b815260040161145b9061413b565b613018565b612f9e6103786113d7856018613e9b565b612fac9063ce09d1b0613ec6565b905061177082101561301857612fc4610bb383613e24565b9150600a612fd28382613ec6565b612fdc9190613e87565b612fe8906101f4613e9b565b612ff99066038d7ea4c68000613e87565b3410156130185760405162461bcd60e51b815260040161145b906141be565b6000805b858110156132125761302f856001613ec6565b61303a906002614071565b6008546130479190613eb2565b6000036132005789858151811061306057613060613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156130b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d49190613f08565b91508115613200576130e7600386613eb2565b1580156130f357508415155b8015613102575063010c8e0083115b15613129576131226501d1a94a20008484600f546002611ec29190614071565b9250613147565b6131446501d1a94a20008484600f546002611efe9190614071565b92505b89858151811061315957613159613ed9565b60200260200101516001600160a01b031663a9059cbb8a878151811061318157613181613ed9565b6020026020010151856040518363ffffffff1660e01b81526004016131bb9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156131da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fe91906142ed565b505b8061320a81613eef565b91505061301c565b5050426015559998505050505050505050565b6000816000036132655760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b61326f8284613e87565b9392505050565b60008260000361328857506000610d2f565b60006132948385613e9b565b9050826132a18583613e87565b1461326f5760405162461bcd60e51b815260206004820152600d60248201526c4d756c74206f766572666c6f7760981b604482015260640161145b565b6000818310156133205760405162461bcd60e51b815260206004820152600d60248201526c53756220756e646572666c6f7760981b604482015260640161145b565b61326f8284613e24565b60008183111561333b575080610d2f565b5090919050565b60008061334f8385613ec6565b90508381101561326f5760405162461bcd60e51b815260206004820152600c60248201526b416464206f766572666c6f7760a01b604482015260640161145b565b6010546011546017546133a291613342565b1180156133b05750600f8054105b1561348157600f546133c3906001613ec6565b600f8190556133eb906133d7906001613ec6565b6133e2906002614071565b60065490613225565b6006546133f89190613e24565b601055600f546008111561346b57600c54613414906002613225565b600c55600f54613425906002614071565b613431906102d0613e9b565b600155600f5460061115613466576010600a5411613453576008600a55613481565b6002600a546134629190613e87565b600a555b613481565b61347d6007600f546115479190613e24565b6011555b60085461348f906001613342565b6008908155600a546134a19190613e87565b601b546008546134b19190613e24565b6134bb9190613eb2565b60000361355d576134ca61220f565b6134dc600f5460016133d79190613ec6565b6006546134e99190613e24565b60105560095442906000906134fe9083613e24565b905060006008600a546135119190613e87565b60015461351e9190613e9b565b4260095590508082118061354c5750600a54601b546008546135409190613e24565b61354a9190613eb2565b155b1561355957613559613758565b5050505b60646001600160a01b0316632b407a82600160646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d29190613f08565b6135dc9190613e24565b6040518263ffffffff1660e01b81526004016135fa91815260200190565b602060405180830381865afa158015613617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363b9190613f08565b600e55565b6000816000036136805760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b600061368c8385613e87565b90506136988385613eb2565b1561326f57611b76816001613ec6565b6000546001600160a01b031633146136ef5760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b600054604080516001600160a01b03928316815291831660208301527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600754429060009061376a9083613e24565b90506000601b5460085461377e9190613e24565b90506000816001546137909190613e9b565b600854601b559050808310156137f65760006137b184610e3a846064613276565b6001601d55905060006137cb6103e8610e558460646132de565b90506137eb610e8182610e7b6107d0600d5461322590919063ffffffff16565b600d55506138479050565b600061380782610e3a866064613276565b6002601d55905060006138216103e8610e558460646132de565b9050613841610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5550505b8360078190555060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561388d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b19190613f08565b602055600c54600d5410156138c757600c54600d555b600b54600d5411156138da57600b54600d555b50505050565b600060208083528351808285015260005b8181101561390d578581018301518582016040015282016138f1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461394557600080fd5b919050565b6000806040838503121561395d57600080fd5b6139668361392e565b946020939093013593505050565b60008083601f84011261398657600080fd5b50813567ffffffffffffffff81111561399e57600080fd5b6020830191508360208285010111156139b657600080fd5b9250929050565b60008060008060008060a087890312156139d657600080fd5b6139df8761392e565b95506139ed6020880161392e565b94506040870135935060608701359250608087013567ffffffffffffffff811115613a1757600080fd5b613a2389828a01613974565b979a9699509497509295939492505050565b600080600080600060808688031215613a4d57600080fd5b613a568661392e565b9450613a646020870161392e565b935060408601359250606086013567ffffffffffffffff811115613a8757600080fd5b613a9388828901613974565b969995985093965092949392505050565b60008060408385031215613ab757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613aed57600080fd5b8135602067ffffffffffffffff80831115613b0a57613b0a613ac6565b8260051b604051601f19603f83011681018181108482111715613b2f57613b2f613ac6565b604052938452858101830193838101925087851115613b4d57600080fd5b83870191505b84821015613b7357613b648261392e565b83529183019190830190613b53565b979650505050505050565b60008060008060808587031215613b9457600080fd5b8435935060208501359250604085013567ffffffffffffffff811115613bb957600080fd5b613bc587828801613adc565b925050613bd46060860161392e565b905092959194509250565b600080600060608486031215613bf457600080fd5b613bfd8461392e565b9250613c0b6020850161392e565b9150604084013590509250925092565b600060208284031215613c2d57600080fd5b5035919050565b60008060008060808587031215613c4a57600080fd5b613c538561392e565b966020860135965060408601359560600135945092505050565b600080600080600060a08688031215613c8557600080fd5b85359450602086013593506040860135925060608601359150613caa6080870161392e565b90509295509295909350565b600060208284031215613cc857600080fd5b61326f8261392e565b60008060008060808587031215613ce757600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613d1857600080fd5b8335925060208401359150613d2f6040850161392e565b90509250925092565b600080600060608486031215613d4d57600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215613d7a57600080fd5b8435935060208501359250604085013567ffffffffffffffff80821115613da057600080fd5b613dac88838901613adc565b93506060870135915080821115613dc257600080fd5b50613dcf87828801613adc565b91505092959194509250565b60008060408385031215613dee57600080fd5b613df78361392e565b9150613e056020840161392e565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610d2f57610d2f613e0e565b600181811c90821680613e4b57607f821691505b602082108103613e6b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601260045260246000fd5b600082613e9657613e96613e71565b500490565b8082028115828204841417610d2f57610d2f613e0e565b600082613ec157613ec1613e71565b500690565b80820180821115610d2f57610d2f613e0e565b634e487b7160e01b600052603260045260246000fd5b600060018201613f0157613f01613e0e565b5060010190565b600060208284031215613f1a57600080fd5b5051919050565b600181815b80851115613f5c578160001904821115613f4257613f42613e0e565b80851615613f4f57918102915b93841c9390800290613f26565b509250929050565b600082613f7357506001610d2f565b81613f8057506000610d2f565b8160018114613f965760028114613fa057613fbc565b6001915050610d2f565b60ff841115613fb157613fb1613e0e565b50506001821b610d2f565b5060208310610133831016604e8410600b8410161715613fdf575081810a610d2f565b613fe98383613f21565b8060001904821115613ffd57613ffd613e0e565b029392505050565b600061326f60ff841683613f64565b60208082526039908201527f4f6e6c79206d696e74206f6e20736c6f77426c6f636b732025205f424c4f434b60408201527f535f5045525f524541444a5553544d454e542f38203d3d203000000000000000606082015260800190565b600061326f8383613f64565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6020808252602e908201527f4f6c64206368616c6c656e67655f646967657374206f722077726f6e6720636860408201526d185b1b195b99d957d91a59d95cdd60921b606082015260800190565b60208082526028908201527f446967657374206d75737420626520736d616c6c6572207468616e206d696e696040820152671b99d5185c99d95d60c21b606082015260800190565b6020808252605a908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f726573206574682c20636865636b20686f774d75636845544828292066756e6360608201527f74696f6e20746f2066696e6420616d6f756e74206e6565646564000000000000608082015260a00190565b6020808252606f908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f7265732065746820756e74696c203630782074617267657454696d652c20636860608201527f65636b20686f774d75636845544828292066756e6374696f6e20746f2066696e60808201526e1908185b5bdd5b9d081b9959591959608a1b60a082015260c00190565b6020808252603a908201527f4d696e74546f2068617320746f206861766520616e206578747261206164647260408201527f65737320636f6d706172656420746f20457874726146756e6473000000000000606082015260800190565b6020808252601b908201527f4e6f207072696e74696e67205468652073616d6520746f6b656e730000000000604082015260600190565b6000602082840312156142ff57600080fd5b8151801515811461326f57600080fd5b634e487b7160e01b600052600160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122071e9ef78024eb4834277a390da30104b57ebfd0816c68d6436d099cb420b937c64736f6c63430008110033417262697472756d20426974636f696e20616e64205374616b696e6720546f6b656e
Deployed Bytecode
0x60806040526004361061041b5760003560e01c806370a082311161021c578063a7ef6b8f11610122578063d0f66e4b116100b0578063f23a6e6111610077578063f23a6e61146104e9578063f2f3bf2d14610bd5578063f56f8d3614610be8578063f7a5f15514610bfc578063f95d391914610c0f57005b8063d0f66e4b14610b20578063dc6e9cf914610b50578063dd62ed3e14610b66578063ddfbd8dd14610bac578063e932012b14610bbf57005b8063c76ae540116100f4578063c76ae54014610aad578063c8a1465c14610ac2578063cb9ae70714610ad5578063cfcb52d414610aeb578063d0856d1614610b0b57005b8063a7ef6b8f14610a42578063a9059cbb14610a62578063b5ade81b14610a82578063c0abebe014610a9857005b80638ae0368b116101aa57806397566aa01161017157806397566aa0146109c057806399f584b3146109e05780639e96a23a146109f6578063a2ac4c3714610a0c578063a68eb88e14610a2c57005b80638ae0368b146109275780638c0838ab1461093d5780638da5cb5b1461095057806394b939ef1461097057806395d89b411461099057005b8063819c9d9e116101ee578063819c9d9e146108bd578063829965cc146108d257806387a2a9d6146108e85780638a083c98146108fe5780638a769d351461091157005b806370a082311461083f578063757991a81461087557806377ed6b141461088a57806381269a561461089d57005b80632d38bf7a1161032157806345d8a232116102af5780634ef37628116102765780634ef37628146107c95780634fa972e1146107de578063653517ef146107f457806369d3e5df146108095780636de9f32b1461082957005b806345d8a23214610762578063467d809e1461077857806347353b691461078b578063490203a71461079e5780634cbf68fe146107b357005b806334d5b131116102f357806334d5b131146106ec57806335b80bfb146107015780633c953615146107215780633dc8a068146107375780634513e1441461074d57005b80632d38bf7a146106625780632f104e0c14610678578063313ce567146106b057806332e99708146106d757005b80631763a089116103a9578063237ef7db11610370578063237ef7db146105ec5780632381a60e1461060257806323b872dd14610618578063240c3b70146106385780632b112e491461064d57005b80631763a0891461058657806317da485f1461059b5780631801fbe5146105b057806318160ddd146105c35780631fccb33c146105d957005b80630a891b83116103ed5780630a891b83146104b45780630c97e564146104e9578063102943171461052f578063111f95d814610545578063150b7a021461055a57005b8063012d3edf1461042457806305411d881461044d57806306fdde0314610462578063095ea7b31461048457005b3661042257005b005b34801561043057600080fd5b5061043a601b5481565b6040519081526020015b60405180910390f35b34801561045957600080fd5b5061043a610c25565b34801561046e57600080fd5b50610477610c3a565b60405161044491906138e0565b34801561049057600080fd5b506104a461049f36600461394a565b610cc8565b6040519015158152602001610444565b3480156104c057600080fd5b506104c9610d35565b604080519485526020850193909352918301526060820152608001610444565b3480156104f557600080fd5b506105166105043660046139bd565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b03199091168152602001610444565b34801561053b57600080fd5b5061043a60155481565b34801561055157600080fd5b5061043a610dbd565b34801561056657600080fd5b50610516610575366004613a35565b630a85bd0160e11b95945050505050565b34801561059257600080fd5b5061043a610f1c565b3480156105a757600080fd5b5061043a610f53565b6104a46105be366004613aa4565b610f6c565b3480156105cf57600080fd5b5061043a60055481565b6104a46105e7366004613b7e565b610f83565b3480156105f857600080fd5b5061043a60095481565b34801561060e57600080fd5b5061043a60115481565b34801561062457600080fd5b506104a4610633366004613bdf565b611046565b34801561064457600080fd5b506104c9611132565b34801561065957600080fd5b5061043a6111a2565b34801561066e57600080fd5b5061043a600f5481565b34801561068457600080fd5b50600454610698906001600160a01b031681565b6040516001600160a01b039091168152602001610444565b3480156106bc57600080fd5b506106c5601281565b60405160ff9091168152602001610444565b3480156106e357600080fd5b50600d5461043a565b3480156106f857600080fd5b5061043a61122d565b34801561070d57600080fd5b5061043a61071c366004613c1b565b611330565b34801561072d57600080fd5b5061043a601c5481565b34801561074357600080fd5b5061043a60145481565b34801561075957600080fd5b5061043a611414565b34801561076e57600080fd5b5061043a60015481565b6104a4610786366004613aa4565b611427565b6104a4610799366004613c34565b611434565b3480156107aa57600080fd5b5061043a611511565b3480156107bf57600080fd5b5061043a601a5481565b3480156107d557600080fd5b50600e5461043a565b3480156107ea57600080fd5b5061043a60105481565b34801561080057600080fd5b5061043a611569565b34801561081557600080fd5b506104a4610824366004613c6d565b61158b565b34801561083557600080fd5b5061043a60175481565b34801561084b57600080fd5b5061043a61085a366004613cb6565b6001600160a01b031660009081526018602052604090205490565b34801561088157600080fd5b5060085461043a565b6104a4610898366004613c34565b6115d7565b3480156108a957600080fd5b506104a46108b8366004613cd1565b611658565b3480156108c957600080fd5b5061043a6116a3565b3480156108de57600080fd5b5061043a60085481565b3480156108f457600080fd5b5061043a600b5481565b6104a461090c366004613b7e565b6116c1565b34801561091d57600080fd5b5061043a600d5481565b34801561093357600080fd5b5061043a600e5481565b61043a61094b366004613d03565b611777565b34801561095c57600080fd5b50600054610698906001600160a01b031681565b34801561097c57600080fd5b50600254610698906001600160a01b031681565b34801561099c57600080fd5b50610477604051806040016040528060048152602001634142415360e01b81525081565b3480156109cc57600080fd5b5061043a6109db366004613d38565b611aaa565b3480156109ec57600080fd5b5061043a60135481565b348015610a0257600080fd5b5061043a601d5481565b348015610a1857600080fd5b5061043a610a27366004613c1b565b611ae5565b348015610a3857600080fd5b5061043a60165481565b348015610a4e57600080fd5b50600354610698906001600160a01b031681565b348015610a6e57600080fd5b506104a4610a7d36600461394a565b611bb5565b348015610a8e57600080fd5b5061043a600a5481565b348015610aa457600080fd5b5060175461043a565b348015610ab957600080fd5b5061043a611c3a565b61043a610ad0366004613d64565b611c4c565b348015610ae157600080fd5b5061043a60205481565b348015610af757600080fd5b50610422610b06366004613ddb565b61204a565b348015610b1757600080fd5b5061042261220f565b348015610b2c57600080fd5b50610b356124bb565b60408051938452602084019290925290820152606001610444565b348015610b5c57600080fd5b5061043a600c5481565b348015610b7257600080fd5b5061043a610b81366004613ddb565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205490565b61043a610bba366004613d03565b61253f565b348015610bcb57600080fd5b5061043a60075481565b61043a610be3366004613d64565b612920565b348015610bf457600080fd5b50333161043a565b61043a610c0a366004613d64565b612c92565b348015610c1b57600080fd5b5061043a60125481565b600060155442610c359190613e24565b905090565b601e8054610c4790613e37565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7390613e37565b8015610cc05780601f10610c9557610100808354040283529160200191610cc0565b820191906000526020600020905b815481529060010190602001808311610ca357829003601f168201915b505050505081565b3360008181526019602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d239086815260200190565b60405180910390a35060015b92915050565b600080600080601b54600854610d4b9190613e24565b600003610d6357506000925082915081905080610db7565b6007544290600090610d759083613e24565b9050610d7f611c3a565b610d899082613e87565b9250610d9483611330565b93506301e13380610da58482613e87565b9550610db18686613e9b565b96505050505b90919293565b6000601b54600854610dcf9190613e24565b600003610de557600d54600b54610c3591613225565b6007544290600090610df79083613e24565b90506000601b54600854610e0b9190613e24565b9050600081600154610e1d9190613e9b565b9050600081841015610e93576000610e4085610e3a856064613276565b90613225565b90506000610e5b6103e8610e558460646132de565b9061332a565b9050610e8a610e8182610e7b6107d0600d5461322590919063ffffffff16565b90613276565b600d54906132de565b92505050610ee7565b6000610ea483610e3a876064613276565b90506000610eb96103e8610e558460646132de565b9050610ee2610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5490613342565b925050505b600c54811015610ef65750600c545b600b54811115610f055750600b545b600b54610f129082613225565b9550505050505090565b60006008600a54610f2d9190613e87565b601a54610f3a9190613eb2565b6008600a54610f499190613e87565b610c359190613e24565b6000610c35600d54600b5461322590919063ffffffff16565b6000610f7983833361253f565b5060019392505050565b60008083516001610f949190613ec6565b67ffffffffffffffff811115610fac57610fac613ac6565b604051908082528060200260200182016040528015610fd5578160200160208202803683370190505b50905060005b8451610fe8906001613ec6565b81101561102c578382828151811061100257611002613ed9565b6001600160a01b03909216602092830291909101909101528061102481613eef565b915050610fdb565b5061103986868684611c4c565b5060019695505050505050565b6001600160a01b03831660009081526018602052604081205461106990836132de565b6001600160a01b03851660009081526018602090815260408083209390935560198152828220338352905220546110a090836132de565b6001600160a01b0380861660009081526019602090815260408083203384528252808320949094559186168152601890915220546110de9083613342565b6001600160a01b038085166000818152601860205260409081902093909355915190861690600080516020614326833981519152906111209086815260200190565b60405180910390a35060019392505050565b6000806000806000611142610d35565b505050905061016d816111559190613e87565b91508160000361117357600080600080945094509450945050610db7565b816017546010546111849190613e24565b61118e9190613e87565b601054601754919650945092505090919293565b6003546040805160016224c73d60e11b0319815290516000926001600160a01b03169163ffb671869160048083019260209291908290030181865afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112139190613f08565b6012546017546112239190613ec6565b610c359190613ec6565b6000601b5460085461123f9190613e24565b60000361126657601d546001036112575750600a5490565b6008600a54610c359190613e87565b60095442906000906112789083613e24565b905060006008600a5461128b9190613e87565b601b5460085461129b9190613e24565b6112a59190613eb2565b6001546112b29190613e9b565b905080821115611306576008600a546112cb9190613e87565b601b546008546112db9190613e24565b6112e59190613eb2565b6008600a546112f49190613e87565b6112fe9190613e24565b935050505090565b600a54601b546008546113199190613e24565b6113239190613eb2565b600a546112fe9190613e24565b600080600154836103786113449190613e9b565b61134e9190613e87565b90506000610378611360836064613e9b565b61136a9190613e87565b90506000610bb88210156113c65761138b610378610e3a856297bb70613e9b565b6113b5620c084061139d600287614005565b6113a890600f613e9b565b610e3a906207c2be613e9b565b6113bf9190613ec6565b90506113f5565b6113e46103786113d7856018613e9b565b610e3a90624d9b6c613e9b565b6113f29063ce09d1b0613ec6565b90505b61140b6305f5e10082601154610e3a9190613e9b565b95945050505050565b6000610c3560155442610a279190613e24565b6000610f79838333611777565b600061143e6116a3565b156114645760405162461bcd60e51b815260040161145b90614014565b60405180910390fd5b61146f83833361253f565b50604051635c46a7ef60e11b81523060048201523360248201526044810185905260806064820152600060848201526001600160a01b0386169063b88d4fde9060a4015b600060405180830381600087803b1580156114cd57600080fd5b505af11580156114e1573d6000803e3d6000fd5b505050506114ed6116a3565b60000361150657601a54611502906001613342565b601a555b506001949350505050565b60006008600f5410156115355761152a6012600a614071565b610c35906014613e9b565b610c356007600f546115479190613e24565b611552906002614071565b61155e6012600a614071565b610e3a906014613e9b565b6000806015544261157a9190613e24565b905061158581611330565b91505090565b6000808483886040516020016115a39392919061407d565b604051602081830303815290604052805190602001209050838160001c11156115cb57600080fd5b90941495945050505050565b60006115e16116a3565b156115fe5760405162461bcd60e51b815260040161145b90614014565b61160983833361253f565b50604051637921219560e11b8152306004820152336024820152604481018590526001606482015260a06084820152600060a48201526001600160a01b0386169063f242432a9060c4016114b3565b6000808333876040516020016116709392919061407d565b604051602081830303815290604052805190602001209050828160001c111561169857600080fd5b909314949350505050565b60006008600a546116b49190613e87565b601a54610c359190613eb2565b600080835160016116d29190613ec6565b67ffffffffffffffff8111156116ea576116ea613ac6565b604051908082528060200260200182016040528015611713578160200160208202803683370190505b50905060005b8451611726906001613ec6565b81101561176a578382828151811061174057611740613ed9565b6001600160a01b03909216602092830291909101909101528061176281613eef565b915050611719565b5061103986868684612920565b600080600e5433866040516020016117919392919061407d565b6040516020818303038152906040528051906020012090508381146117c85760405162461bcd60e51b815260040161145b906140a5565b600d5481106117e95760405162461bcd60e51b815260040161145b906140f3565b6117f1613390565b60155442116118425760405162461bcd60e51b815260206004820152601d60248201527f4e6f20736f6c766520666f722066697273742035207365636f6e64732e000000604482015260640161145b565b6000600154601554426118559190613e24565b61186190610378613e9b565b61186b9190613e87565b9050600061037861187d836064613e9b565b6118879190613e87565b905060648111156118a457601a546118a0906001613342565b601a555b610bb881101561192a576118c1610378610e3a846297bb70613e9b565b6118d3620c084061139d600286614005565b6118dd9190613ec6565b9350600a6118eb8282613ec6565b6118f59190613e87565b6119069066038d7ea4c68000613e87565b3410156119255760405162461bcd60e51b815260040161145b9061413b565b6119b5565b61193b6103786113d7846018613e9b565b6119499063ce09d1b0613ec6565b93506117708110156119b557611961610bb382613e24565b9050600a61196f8282613ec6565b6119799190613e87565b611985906101f4613e9b565b6119969066038d7ea4c68000613e87565b3410156119b55760405162461bcd60e51b815260040161145b906141be565b60006119cd6305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506119f39082613342565b6001600160a01b03871660008181526018602052604080822093909355915190919060008051602061432683398151915290611a329085815260200190565b60405180910390a3601754611a479082613342565b60175542601555600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d906060015b60405180910390a2505050509392505050565b600080600e543386604051602001611ac49392919061407d565b60408051808303601f19018152919052805160209091012095945050505050565b60008060015483610378611af99190613e9b565b611b039190613e87565b90506000610378611b15836064613e9b565b611b1f9190613e87565b9050610bb88110611b8857611770811015611b7e57611b40610bb382613e24565b9050600a611b4f826007613ec6565b611b599190613e87565b611b65906101f4613e9b565b611b769066038d7ea4c68000613e87565b949350505050565b5060009392505050565b6012811115611b9f57611b9c600382613e24565b90505b600a611bab8282613ec6565b611b659190613e87565b33600090815260186020526040812054611bcf90836132de565b33600090815260186020526040808220929092556001600160a01b03851681522054611bfb9083613342565b6001600160a01b03841660008181526018602052604090819020929092559051339060008051602061432683398151915290610d239086815260200190565b6000601b54600854610c359190613e24565b600080611c74868685600081518110611c6757611c67613ed9565b602002602001015161253f565b905060008111611cb35760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351611cc0906001613ec6565b835114611cdf5760405162461bcd60e51b815260040161145b90614259565b60005b8451811015611db657611cf6816001613ec6565b611d01906002614071565b600854611d0e9190613eb2565b600003611db6576000611d22826001613ec6565b90505b8551811015611da357858281518110611d4057611d40613ed9565b60200260200101516001600160a01b0316868281518110611d6357611d63613ed9565b60200260200101516001600160a01b031603611d915760405162461bcd60e51b815260040161145b906142b6565b80611d9b81613eef565b915050611d25565b5080611dae81613eef565b915050611ce2565b60008060005b83811015611fec57611dcf816001613ec6565b611dda906002614071565b600854611de79190613eb2565b600003611fda57878181518110611e0057611e00613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e749190613f08565b91508115611f1557611e87600382613eb2565b158015611e9357508015155b8015611ea2575063010c8e0085115b15611ee357611edc6501d1a94a20008684600f546002611ec29190614071565b611ecc9190613e9b565b611ed69190613e9b565b90613640565b9250611f15565b611f126501d1a94a20008684600f546002611efe9190614071565b611f089190613e9b565b610e3a9190613e9b565b92505b878181518110611f2757611f27613ed9565b60200260200101516001600160a01b031663a9059cbb88836001611f4b9190613ec6565b81518110611f5b57611f5b613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401611f959291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd891906142ed565b505b80611fe481613eef565b915050611dbc565b50600854600e5460408051928352602083019190915281018490526060810185905233907f87e5a7775b8ac2ead741e32752431bffeff76ec5f347cc202a6bad454653930b9060800160405180910390a25091979650505050505050565b6000546001600160a01b031633146120915760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b6021546a115eec47f6cf7e350000009060ff16156120b1576120b161430f565b6021805460ff19166001179055426015556120ce6012600a614071565b6120d9906014613e9b565b6011556000600f81905560178190556008819055601b55612102670de0b6b3a764000047613e87565b6013819055612114906203d090613e9b565b612121906203d090613ec6565b47600f5460026121319190614071565b61213b9190613e9b565b6121459190613e87565b601655600b54612157906103e8613225565b600d5542600755612166613390565b612171600282613e87565b6001600160a01b038416600081815260186020526040812092909255906000805160206143268339815191526121a8600285613e87565b60405190815260200160405180910390a3600280546001600160a01b03199081166001600160a01b038681169182179093556003805483169091179055600480549091169184169190911790556001601a5560085460145561220a60006136a8565b505050565b612221670de0b6b3a764000047613e87565b6013819055612233906203d090613e9b565b612240906203d090613ec6565b47600f5460026122509190614071565b61225a9190613e9b565b6122649190613e87565b601655601f546000906122779042613e24565b9050600060145460085461228b9190613e24565b905060006122998284613e87565b90506008600f5410156122c857600f546122b4906002614071565b6122c0906102d0613e9b565b6001556122de565b6122da6007600f546115479190613e24565b6011555b60006122f460015483610378611ed69190613e9b565b90506000610378612306836064613e9b565b6123109190613e87565b905060006107d082101561235457612331610378610e3a856297bb70613e9b565b612343620c084061139d600287614005565b61234d9190613ec6565b905061235b565b5063bebc20005b60006123746305f5e1008360115489611f089190613e9b565b6004546001600160a01b031660009081526018602052604090205490915061239c9082613342565b600480546001600160a01b039081166000908152601860205260408082209490945591549251921691600080516020614326833981519152906123e29085815260200190565b60405180910390a36012546123f79082613342565b601255600a5460165460049161240c91613e9b565b6124179060c8613e9b565b6124219190613e87565b4711156124a257600454601c546016546001600160a01b0390921691612451916305f5e10091611efe878c613e9b565b6040519093506001600160a01b0382169084156108fc029085906000818181858888f1935050505015801561248a573d6000803e3d6000fd5b50601d54612499906001613e9b565b601c55506124a8565b6000601c555b5050600854601455505042601f55505050565b60008060006124c8611c3a565b6000036124db5750600092839250829150565b60075442906000906124ed9083613e24565b905060006124f9611c3a565b6125039083613e87565b9050600061250f611132565b505050905060008282620151806125269190613e9b565b6125309190613e87565b98929750909550909350505050565b600080600e5433866040516020016125599392919061407d565b6040516020818303038152906040528051906020012090508381146125905760405162461bcd60e51b815260040161145b906140a5565b600d5481106125b15760405162461bcd60e51b815260040161145b906140f3565b6125b9613390565b60155442116126025760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b6000600154601554426126159190613e24565b61262190610378613e9b565b61262b9190613e87565b9050600061037861263d836064613e9b565b6126479190613e87565b9050606481111561266457601a54612660906001613342565b601a555b610bb88110156126ea57612681610378610e3a846297bb70613e9b565b612693620c084061139d600286614005565b61269d9190613ec6565b9350600a6126ab8282613ec6565b6126b59190613e87565b6126c69066038d7ea4c68000613e87565b3410156126e55760405162461bcd60e51b815260040161145b9061413b565b612779565b6126fb6103786113d7846018613e9b565b6127099063ce09d1b0613ec6565b9350611770811015612779576000612723610bb383613e24565b9050600a6127318282613ec6565b61273b9190613e87565b612747906101f4613e9b565b6127589066038d7ea4c68000613e87565b3410156127775760405162461bcd60e51b815260040161145b906141be565b505b60006127916305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506127b79082613342565b6001600160a01b038716600081815260186020526040808220939093559151909190600080516020614326833981519152906127f69085815260200190565b60405180910390a360175461280b9082613342565b60175542601555601c54156128d3576107d082101561287e576000869050806001600160a01b03166108fc61284f6305f5e100601c546016548b611f089190613e9b565b6040518115909202916000818181858888f19350505050158015612877573d6000803e3d6000fd5b50506128d3565b6000869050806001600160a01b03166108fc6128a8600a601c54601654610140611f089190613e9b565b6040518115909202916000818181858888f193505050501580156128d0573d6000803e3d6000fd5b50505b600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d90606001611a97565b60008061294886868560008151811061293b5761293b613ed9565b6020026020010151611777565b9050600081116129875760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351612994906001613ec6565b8351146129b35760405162461bcd60e51b815260040161145b90614259565b60005b8451811015612a8a576129ca816001613ec6565b6129d5906002614071565b6008546129e29190613eb2565b600003612a8a5760006129f6826001613ec6565b90505b8551811015612a7757858281518110612a1457612a14613ed9565b60200260200101516001600160a01b0316868281518110612a3757612a37613ed9565b60200260200101516001600160a01b031603612a655760405162461bcd60e51b815260040161145b906142b6565b80612a6f81613eef565b9150506129f9565b5080612a8281613eef565b9150506129b6565b60008060005b83811015611fec57612aa3816001613ec6565b612aae906002614071565b600854612abb9190613eb2565b600003612c8057878181518110612ad457612ad4613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b489190613f08565b91508115612bbb57612b5b600382613eb2565b158015612b6757508015155b8015612b76575063010c8e0085115b15612b9d57612b966501d1a94a20008684600f546002611ec29190614071565b9250612bbb565b612bb86501d1a94a20008684600f546002611efe9190614071565b92505b878181518110612bcd57612bcd613ed9565b60200260200101516001600160a01b031663a9059cbb88836001612bf19190613ec6565b81518110612c0157612c01613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401612c3b9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7e91906142ed565b505b80612c8a81613eef565b915050612a90565b600080600e543387604051602001612cac9392919061407d565b604051602081830303815290604052805190602001209050848114612ce35760405162461bcd60e51b815260040161145b906140a5565b600d548110612d045760405162461bcd60e51b815260040161145b906140f3565b612d0c613390565b6015544211612d555760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b8351835114612dcc5760405162461bcd60e51b815260206004820152603a60248201527f4d696e74546f2068617320746f20686176652073616d65206e756d626572206f60448201527f66206164647265737373657320617320457874726146756e6473000000000000606482015260840161145b565b60005b8451811015612ea357612de3816001613ec6565b612dee906002614071565b600854612dfb9190613eb2565b600003612ea3576000612e0f826001613ec6565b90505b8551811015612e9057858281518110612e2d57612e2d613ed9565b60200260200101516001600160a01b0316868281518110612e5057612e50613ed9565b60200260200101516001600160a01b031603612e7e5760405162461bcd60e51b815260040161145b906142b6565b80612e8881613eef565b915050612e12565b5080612e9b81613eef565b915050612dcf565b600060015460155442612eb69190613e24565b612ec290610378613e9b565b612ecc9190613e87565b90506000610378612ede836064613e9b565b612ee89190613e87565b905060006064821115612f0757601a54612f03906001613342565b601a555b610bb8821015612f8d57612f24610378610e3a856297bb70613e9b565b612f36620c084061139d600287614005565b612f409190613ec6565b9050600a612f4e8382613ec6565b612f589190613e87565b612f699066038d7ea4c68000613e87565b341015612f885760405162461bcd60e51b815260040161145b9061413b565b613018565b612f9e6103786113d7856018613e9b565b612fac9063ce09d1b0613ec6565b905061177082101561301857612fc4610bb383613e24565b9150600a612fd28382613ec6565b612fdc9190613e87565b612fe8906101f4613e9b565b612ff99066038d7ea4c68000613e87565b3410156130185760405162461bcd60e51b815260040161145b906141be565b6000805b858110156132125761302f856001613ec6565b61303a906002614071565b6008546130479190613eb2565b6000036132005789858151811061306057613060613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156130b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d49190613f08565b91508115613200576130e7600386613eb2565b1580156130f357508415155b8015613102575063010c8e0083115b15613129576131226501d1a94a20008484600f546002611ec29190614071565b9250613147565b6131446501d1a94a20008484600f546002611efe9190614071565b92505b89858151811061315957613159613ed9565b60200260200101516001600160a01b031663a9059cbb8a878151811061318157613181613ed9565b6020026020010151856040518363ffffffff1660e01b81526004016131bb9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156131da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fe91906142ed565b505b8061320a81613eef565b91505061301c565b5050426015559998505050505050505050565b6000816000036132655760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b61326f8284613e87565b9392505050565b60008260000361328857506000610d2f565b60006132948385613e9b565b9050826132a18583613e87565b1461326f5760405162461bcd60e51b815260206004820152600d60248201526c4d756c74206f766572666c6f7760981b604482015260640161145b565b6000818310156133205760405162461bcd60e51b815260206004820152600d60248201526c53756220756e646572666c6f7760981b604482015260640161145b565b61326f8284613e24565b60008183111561333b575080610d2f565b5090919050565b60008061334f8385613ec6565b90508381101561326f5760405162461bcd60e51b815260206004820152600c60248201526b416464206f766572666c6f7760a01b604482015260640161145b565b6010546011546017546133a291613342565b1180156133b05750600f8054105b1561348157600f546133c3906001613ec6565b600f8190556133eb906133d7906001613ec6565b6133e2906002614071565b60065490613225565b6006546133f89190613e24565b601055600f546008111561346b57600c54613414906002613225565b600c55600f54613425906002614071565b613431906102d0613e9b565b600155600f5460061115613466576010600a5411613453576008600a55613481565b6002600a546134629190613e87565b600a555b613481565b61347d6007600f546115479190613e24565b6011555b60085461348f906001613342565b6008908155600a546134a19190613e87565b601b546008546134b19190613e24565b6134bb9190613eb2565b60000361355d576134ca61220f565b6134dc600f5460016133d79190613ec6565b6006546134e99190613e24565b60105560095442906000906134fe9083613e24565b905060006008600a546135119190613e87565b60015461351e9190613e9b565b4260095590508082118061354c5750600a54601b546008546135409190613e24565b61354a9190613eb2565b155b1561355957613559613758565b5050505b60646001600160a01b0316632b407a82600160646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d29190613f08565b6135dc9190613e24565b6040518263ffffffff1660e01b81526004016135fa91815260200190565b602060405180830381865afa158015613617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363b9190613f08565b600e55565b6000816000036136805760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b600061368c8385613e87565b90506136988385613eb2565b1561326f57611b76816001613ec6565b6000546001600160a01b031633146136ef5760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b600054604080516001600160a01b03928316815291831660208301527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600754429060009061376a9083613e24565b90506000601b5460085461377e9190613e24565b90506000816001546137909190613e9b565b600854601b559050808310156137f65760006137b184610e3a846064613276565b6001601d55905060006137cb6103e8610e558460646132de565b90506137eb610e8182610e7b6107d0600d5461322590919063ffffffff16565b600d55506138479050565b600061380782610e3a866064613276565b6002601d55905060006138216103e8610e558460646132de565b9050613841610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5550505b8360078190555060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561388d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b19190613f08565b602055600c54600d5410156138c757600c54600d555b600b54600d5411156138da57600b54600d555b50505050565b600060208083528351808285015260005b8181101561390d578581018301518582016040015282016138f1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461394557600080fd5b919050565b6000806040838503121561395d57600080fd5b6139668361392e565b946020939093013593505050565b60008083601f84011261398657600080fd5b50813567ffffffffffffffff81111561399e57600080fd5b6020830191508360208285010111156139b657600080fd5b9250929050565b60008060008060008060a087890312156139d657600080fd5b6139df8761392e565b95506139ed6020880161392e565b94506040870135935060608701359250608087013567ffffffffffffffff811115613a1757600080fd5b613a2389828a01613974565b979a9699509497509295939492505050565b600080600080600060808688031215613a4d57600080fd5b613a568661392e565b9450613a646020870161392e565b935060408601359250606086013567ffffffffffffffff811115613a8757600080fd5b613a9388828901613974565b969995985093965092949392505050565b60008060408385031215613ab757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613aed57600080fd5b8135602067ffffffffffffffff80831115613b0a57613b0a613ac6565b8260051b604051601f19603f83011681018181108482111715613b2f57613b2f613ac6565b604052938452858101830193838101925087851115613b4d57600080fd5b83870191505b84821015613b7357613b648261392e565b83529183019190830190613b53565b979650505050505050565b60008060008060808587031215613b9457600080fd5b8435935060208501359250604085013567ffffffffffffffff811115613bb957600080fd5b613bc587828801613adc565b925050613bd46060860161392e565b905092959194509250565b600080600060608486031215613bf457600080fd5b613bfd8461392e565b9250613c0b6020850161392e565b9150604084013590509250925092565b600060208284031215613c2d57600080fd5b5035919050565b60008060008060808587031215613c4a57600080fd5b613c538561392e565b966020860135965060408601359560600135945092505050565b600080600080600060a08688031215613c8557600080fd5b85359450602086013593506040860135925060608601359150613caa6080870161392e565b90509295509295909350565b600060208284031215613cc857600080fd5b61326f8261392e565b60008060008060808587031215613ce757600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613d1857600080fd5b8335925060208401359150613d2f6040850161392e565b90509250925092565b600080600060608486031215613d4d57600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215613d7a57600080fd5b8435935060208501359250604085013567ffffffffffffffff80821115613da057600080fd5b613dac88838901613adc565b93506060870135915080821115613dc257600080fd5b50613dcf87828801613adc565b91505092959194509250565b60008060408385031215613dee57600080fd5b613df78361392e565b9150613e056020840161392e565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610d2f57610d2f613e0e565b600181811c90821680613e4b57607f821691505b602082108103613e6b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601260045260246000fd5b600082613e9657613e96613e71565b500490565b8082028115828204841417610d2f57610d2f613e0e565b600082613ec157613ec1613e71565b500690565b80820180821115610d2f57610d2f613e0e565b634e487b7160e01b600052603260045260246000fd5b600060018201613f0157613f01613e0e565b5060010190565b600060208284031215613f1a57600080fd5b5051919050565b600181815b80851115613f5c578160001904821115613f4257613f42613e0e565b80851615613f4f57918102915b93841c9390800290613f26565b509250929050565b600082613f7357506001610d2f565b81613f8057506000610d2f565b8160018114613f965760028114613fa057613fbc565b6001915050610d2f565b60ff841115613fb157613fb1613e0e565b50506001821b610d2f565b5060208310610133831016604e8410600b8410161715613fdf575081810a610d2f565b613fe98383613f21565b8060001904821115613ffd57613ffd613e0e565b029392505050565b600061326f60ff841683613f64565b60208082526039908201527f4f6e6c79206d696e74206f6e20736c6f77426c6f636b732025205f424c4f434b60408201527f535f5045525f524541444a5553544d454e542f38203d3d203000000000000000606082015260800190565b600061326f8383613f64565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6020808252602e908201527f4f6c64206368616c6c656e67655f646967657374206f722077726f6e6720636860408201526d185b1b195b99d957d91a59d95cdd60921b606082015260800190565b60208082526028908201527f446967657374206d75737420626520736d616c6c6572207468616e206d696e696040820152671b99d5185c99d95d60c21b606082015260800190565b6020808252605a908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f726573206574682c20636865636b20686f774d75636845544828292066756e6360608201527f74696f6e20746f2066696e6420616d6f756e74206e6565646564000000000000608082015260a00190565b6020808252606f908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f7265732065746820756e74696c203630782074617267657454696d652c20636860608201527f65636b20686f774d75636845544828292066756e6374696f6e20746f2066696e60808201526e1908185b5bdd5b9d081b9959591959608a1b60a082015260c00190565b6020808252603a908201527f4d696e74546f2068617320746f206861766520616e206578747261206164647260408201527f65737320636f6d706172656420746f20457874726146756e6473000000000000606082015260800190565b6020808252601b908201527f4e6f207072696e74696e67205468652073616d6520746f6b656e730000000000604082015260600190565b6000602082840312156142ff57600080fd5b8151801515811461326f57600080fd5b634e487b7160e01b600052600160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122071e9ef78024eb4834277a390da30104b57ebfd0816c68d6436d099cb420b937c64736f6c63430008110033
Deployed Bytecode Sourcemap
18565:33506:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21549:24;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;21549:24:0;;;;;;;;38404:131;;;;;;;;;;;;;:::i;21690:57::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50445:204::-;;;;;;;;;;-1:-1:-1;50445:204:0;;;;;:::i;:::-;;:::i;:::-;;;1351:14:1;;1344:22;1326:41;;1314:2;1299:18;50445:204:0;1186:187:1;45019:662:0;;;;;;;;;;;;;:::i;:::-;;;;1609:25:1;;;1665:2;1650:18;;1643:34;;;;1693:18;;;1686:34;1751:2;1736:18;;1729:34;1596:3;1581:19;45019:662:0;1378:391:1;18982:173:0;;;;;;;;;;-1:-1:-1;18982:173:0;;;;;:::i;:::-;-1:-1:-1;;;18982:173:0;;;;;;;;;;;;-1:-1:-1;;;;;;2988:33:1;;;2970:52;;2958:2;2943:18;18982:173:0;2826:202:1;21139:49:0;;;;;;;;;;;;;;;;41980:1514;;;;;;;;;;;;;:::i;18628:167::-;;;;;;;;;;-1:-1:-1;18628:167:0;;;;;:::i;:::-;-1:-1:-1;;;18628:167:0;;;;;;;;25244:153;;;;;;;;;;;;;:::i;47597:109::-;;;;;;;;;;;;;:::i;25074:162::-;;;;;;:::i;:::-;;:::i;19685:64::-;;;;;;;;;;;;;;;;33274:391;;;;;;:::i;:::-;;:::i;20065:51::-;;;;;;;;;;;;;;;;20833:29;;;;;;;;;;;;;;;;51191:327;;;;;;;;;;-1:-1:-1;51191:327:0;;;;;:::i;:::-;;:::i;45689:391::-;;;;;;;;;;;;;:::i;47898:140::-;;;;;;;;;;;;;:::i;20710:25::-;;;;;;;;;;;;;;;;19303:30;;;;;;;;;;-1:-1:-1;19303:30:0;;;;-1:-1:-1;;;;;19303:30:0;;;;;;-1:-1:-1;;;;;6023:32:1;;;6005:51;;5993:2;5978:18;19303:30:0;5859:203:1;21799:35:0;;;;;;;;;;;;21832:2;21799:35;;;;;6239:4:1;6227:17;;;6209:36;;6197:2;6182:18;21799:35:0;6067:184:1;47713:86:0;;;;;;;;;;-1:-1:-1;47781:12:0;;47713:86;;39349:784;;;;;;;;;;;;;:::i;38719:493::-;;;;;;;;;;-1:-1:-1;38719:493:0;;;;;:::i;:::-;;:::i;21617:22::-;;;;;;;;;;;;;;;;21057:25;;;;;;;;;;;;;;;;29368:135;;;;;;;;;;;;;:::i;19164:32::-;;;;;;;;;;;;;;;;29622:177;;;;;;:::i;:::-;;:::i;25519:438::-;;;;;;:::i;:::-;;:::i;48287:318::-;;;;;;;;;;;;;:::i;21478:26::-;;;;;;;;;;;;;;;;47413:96;;;;;;;;;;-1:-1:-1;47487:15:0;;47413:96;;20742:84;;;;;;;;;;;;;;;;38540:173;;;;;;;;;;;;;:::i;46969:354::-;;;;;;;;;;-1:-1:-1;46969:354:0;;;;;:::i;:::-;;:::i;21310:28::-;;;;;;;;;;;;;;;;49199:124;;;;;;;;;;-1:-1:-1;49199:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;49296:20:0;49268:12;49296:20;;;:8;:20;;;;;;;49199:124;48612:79;;;;;;;;;;-1:-1:-1;48673:10:0;;48612:79;;25962:444;;;;;;:::i;:::-;;:::i;46632:332::-;;;;;;;;;;-1:-1:-1;46632:332:0;;;;;:::i;:::-;;:::i;25403:110::-;;;;;;;;;;;;;:::i;20009:26::-;;;;;;;;;;;;;;;;20192:37;;;;;;;;;;;;;;;;35275:407;;;;;;:::i;:::-;;:::i;20348:63::-;;;;;;;;;;;;;;;;20482:170;;;;;;;;;;;;;;;;29804:1876;;;;;;:::i;:::-;;:::i;2668:20::-;;;;;;;;;;-1:-1:-1;2668:20:0;;;;-1:-1:-1;;;;;2668:20:0;;;19228:29;;;;;;;;;;-1:-1:-1;19228:29:0;;;;-1:-1:-1;;;;;19228:29:0;;;21754:38;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21754:38:0;;;;;48729:246;;;;;;;;;;-1:-1:-1;48729:246:0;;;;;:::i;:::-;;:::i;20959:25::-;;;;;;;;;;;;;;;;21646:20;;;;;;;;;;;;;;;;28820:496;;;;;;;;;;-1:-1:-1;28820:496:0;;;;;:::i;:::-;;:::i;21217:40::-;;;;;;;;;;;;;;;;19264:32;;;;;;;;;;-1:-1:-1;19264:32:0;;;;-1:-1:-1;;;;;19264:32:0;;;49673:257;;;;;;;;;;-1:-1:-1;49673:257:0;;;;;:::i;:::-;;:::i;20124:43::-;;;;;;;;;;;;;;;;47806:83;;;;;;;;;;-1:-1:-1;47872:12:0;;47806:83;;39217:126;;;;;;;;;;;;;:::i;31687:1582::-;;;;;;:::i;:::-;;:::i;21884:111::-;;;;;;;;;;;;;;;;22207:1067;;;;;;;;;;-1:-1:-1;22207:1067:0;;;;;:::i;:::-;;:::i;23312:1731::-;;;;;;;;;;;;;:::i;46088:508::-;;;;;;;;;;;;;:::i;:::-;;;;10147:25:1;;;10203:2;10188:18;;10181:34;;;;10231:18;;;10224:34;10135:2;10120:18;46088:508:0;9945:319:1;20236:61:0;;;;;;;;;;;;;;;;51805:151;;;;;;;;;;-1:-1:-1;51805:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;51921:19:0;;;51891:14;51921:19;;;:7;:19;;;;;;;;:28;;;;;;;;;;;;;51805:151;26411:2403;;;;;;:::i;:::-;;:::i;19909:60::-;;;;;;;;;;;;;;;;33672:1598;;;;;;:::i;:::-;;:::i;29509:108::-;;;;;;;;;;-1:-1:-1;29593:10:0;29592:20;29509:108;;35711:2688;;;;;;:::i;:::-;;:::i;20899:24::-;;;;;;;;;;;;;;;;38404:131;38454:12;38497:17;;38479:15;:35;;;;:::i;:::-;38472:42;;38404:131;:::o;21690:57::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50445:204::-;50546:10;50517:12;50538:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;50538:28:0;;;;;;;;;;:37;;;50587;50517:12;;50538:28;;50587:37;;;;50569:6;160:25:1;;148:2;133:18;;14:177;50587:37:0;;;;;;;;-1:-1:-1;50638:4:0;50445:204;;;;;:::o;45019:662::-;45067:20;45089:18;45109;45129:17;45168:8;;45155:10;;:21;;;;:::i;:::-;45180:1;45155:26;45152:61;;-1:-1:-1;45196:1:0;;-1:-1:-1;45196:1:0;;-1:-1:-1;45196:1:0;;-1:-1:-1;45196:1:0;45188:19;;45152:61;45313:30;;45240:15;;45217:20;;45298:45;;45240:15;45298:45;:::i;:::-;45260:83;;45408:20;:18;:20::i;:::-;45375:53;;:30;:53;:::i;:::-;45360:68;;45450:26;45463:12;45450;:26::i;:::-;45434:42;-1:-1:-1;45493:18:0;45532:19;45539:12;45493:18;45532:19;:::i;:::-;45516:35;-1:-1:-1;45574:29:0;45516:35;45574:13;:29;:::i;:::-;45556:47;;45608:68;;;45019:662;;;;;:::o;41980:1514::-;42038:15;42076:8;;42063:10;;:21;;;;:::i;:::-;42088:1;42063:26;42060:82;;42123:12;;42103:15;;:33;;:19;:33::i;42060:82::-;42242:30;;42169:15;;42146:20;;42227:45;;42169:15;42227:45;:::i;:::-;42189:83;;42277:15;42308:8;;42295:10;;:21;;;;:::i;:::-;42277:39;;42321:24;42362:10;42348;;:24;;;;:::i;:::-;42321:51;;42384:18;42512:19;42479:30;:52;42475:737;;;42543:21;42567:69;42604:30;42568:29;:19;42593:3;42568:24;:29::i;:::-;42567:35;;:69::i;:::-;42543:93;-1:-1:-1;42642:27:0;42672:45;42712:4;42672:25;42543:93;42693:3;42672:20;:25::i;:::-;:39;;:45::i;:::-;42642:75;;42761:69;42778:51;42806:22;42778;42795:4;42778:12;;:16;;:22;;;;:::i;:::-;:27;;:51::i;:::-;42761:12;;;:16;:69::i;:::-;42745:85;;42537:317;;42475:737;;;42864:23;42890:69;42938:19;42891:40;:30;42927:3;42891:35;:40::i;42890:69::-;42864:95;-1:-1:-1;42967:29:0;42999:47;43041:4;42999:27;42864:95;43022:3;42999:22;:27::i;:47::-;42967:79;;43117:70;43134:52;43161:24;43134:21;43151:3;43134:12;;:16;;:21;;;;:::i;:52::-;43117:12;;;:16;:70::i;:::-;43101:86;;42858:354;;42475:737;43237:15;;43221:13;:31;43218:99;;;-1:-1:-1;43296:15:0;;43218:99;43340:15;;43324:13;:31;43321:94;;;-1:-1:-1;43394:15:0;;43321:94;43432:15;;:34;;43452:13;43432:19;:34::i;:::-;43419:47;;43472:17;;;;;41980:1514;:::o;25244:153::-;25297:8;25388:1;25363:24;;:26;;;;:::i;:::-;25349:10;;:42;;;;:::i;:::-;25344:1;25319:24;;:26;;;;:::i;:::-;:73;;;;:::i;47597:109::-;47649:4;47668:33;47688:12;;47668:15;;:19;;:33;;;;:::i;25074:162::-;25153:12;25172:43;25179:5;25186:16;25204:10;25172:6;:43::i;:::-;-1:-1:-1;25227:4:0;;25074:162;-1:-1:-1;;;25074:162:0:o;33274:391::-;33415:12;33434:19;33470:10;:17;33490:1;33470:21;;;;:::i;:::-;33456:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33456:36:0;;33434:58;;33504:6;33500:76;33518:17;;:21;;33538:1;33518:21;:::i;:::-;33514:1;:26;33500:76;;;33564:6;33556:2;33559:1;33556:5;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33556:14:0;;;:5;;;;;;;;;;;:14;33542:3;;;;:::i;:::-;;;;33500:76;;;;33584:58;33602:5;33609:16;33627:10;33639:2;33584:17;:58::i;:::-;-1:-1:-1;33656:4:0;;33274:391;-1:-1:-1;;;;;;33274:391:0:o;51191:327::-;-1:-1:-1;;;;;51315:14:0;;51277:12;51315:14;;;:8;:14;;;;;;:26;;51334:6;51315:18;:26::i;:::-;-1:-1:-1;;;;;51298:14:0;;;;;;:8;:14;;;;;;;;:43;;;;51374:7;:13;;;;;51388:10;51374:25;;;;;;:37;;51404:6;51374:29;:37::i;:::-;-1:-1:-1;;;;;51346:13:0;;;;;;;:7;:13;;;;;;;;51360:10;51346:25;;;;;;;:65;;;;51431:12;;;;;:8;:12;;;;;:24;;51448:6;51431:16;:24::i;:::-;-1:-1:-1;;;;;51416:12:0;;;;;;;:8;:12;;;;;;;:39;;;;51467:26;;;;;;-1:-1:-1;;;;;;;;;;;51467:26:0;;;51486:6;160:25:1;;148:2;133:18;;14:177;51467:26:0;;;;;;;;-1:-1:-1;51507:4:0;51191:327;;;;;:::o;45689:391::-;45736:18;45756:21;45779:18;45799:13;45827;45847:16;:14;:16::i;:::-;45826:37;;;;;45892:3;45881:8;:14;;;;:::i;:::-;45868:27;;45903:8;45915:1;45903:13;45900:44;;45930:1;45932;45934;45936;45923:15;;;;;;;;;;;45900:44;45999:8;45983:12;;45965:15;;:30;;;;:::i;:::-;45964:43;;;;:::i;:::-;46035:15;;46052:12;;45948:59;;-1:-1:-1;46035:15:0;-1:-1:-1;46052:12:0;-1:-1:-1;;45689:391:0;;;;:::o;47898:140::-;48002:10;;:27;;;-1:-1:-1;;;;;;48002:27:0;;;;47951:4;;-1:-1:-1;;;;;48002:10:0;;:25;;:27;;;;;;;;;;;;;;:10;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47991:8;;47976:12;;:23;;;;:::i;:::-;:53;;;;:::i;39349:784::-;39398:11;39432:8;;39419:10;;:21;;;;:::i;:::-;39445:1;39418:28;39415:158;;39456:4;;39464:1;39456:9;39453:115;;-1:-1:-1;39481:24:0;;;39349:784::o;39453:115::-;39559:1;39532:24;;:28;;;;:::i;39453:115::-;39673:21;;39600:15;;39577:20;;39658:36;;39600:15;39658:36;:::i;:::-;39620:74;;39699:24;39792:1;39767:24;;:26;;;;:::i;:::-;39754:8;;39741:10;;:21;;;;:::i;:::-;39740:54;;;;:::i;:::-;39726:10;;:69;;;;:::i;:::-;39699:96;;39840:19;39807:30;:52;39803:323;;;39962:1;39937:24;;:26;;;;:::i;:::-;39924:8;;39911:10;;:21;;;;:::i;:::-;39910:54;;;;:::i;:::-;39905:1;39880:24;;:26;;;;:::i;:::-;:85;;;;:::i;:::-;39871:94;;39972:15;;;39349:784;:::o;39803:323::-;40070:24;;40058:8;;40045:10;;:21;;;;:::i;:::-;40044:50;;;;:::i;:::-;40016:24;;:79;;;;:::i;38719:493::-;38783:15;38804:9;38841:10;;38817:14;38834:3;38817:20;;;;:::i;:::-;38816:35;;;;:::i;:::-;38804:47;-1:-1:-1;38856:10:0;38879:3;38869:7;38804:47;38873:3;38869:7;:::i;:::-;:13;;;;:::i;:::-;38856:26;;38888:14;38978:4;38970:5;:12;38967:161;;;39035:24;39055:3;39036:13;39047:1;39036:7;:13;:::i;39035:24::-;39001:32;39024:8;39013:4;39016:1;39013;:4;:::i;:::-;39010:7;;:2;:7;:::i;:::-;39002:16;;:6;:16;:::i;39001:32::-;:58;;;;:::i;:::-;38989:70;;38967:161;;;39088:23;39107:3;39089:4;39092:1;39089:2;:4;:::i;:::-;:12;;39094:7;39089:12;:::i;39088:23::-;:34;;39112:10;39088:34;:::i;:::-;39076:46;;38967:161;39144:42;39176:9;39161;39145:13;;:25;;;;:::i;39144:42::-;39134:52;38719:493;-1:-1:-1;;;;;38719:493:0:o;29368:135::-;29411:19;29443:55;29479:17;;29461:15;:35;;;;:::i;29622:177::-;29709:12;29727:51;29742:5;29749:16;29767:10;29727:14;:51::i;25519:438::-;25637:12;25664:11;:9;:11::i;:::-;:16;25656:86;;;;-1:-1:-1;;;25656:86:0;;;;;;;:::i;:::-;;;;;;;;;25747:43;25754:5;25761:16;25779:10;25747:6;:43::i;:::-;-1:-1:-1;25795:75:0;;-1:-1:-1;;;25795:75:0;;25837:4;25795:75;;;14171:34:1;25844:10:0;14221:18:1;;;14214:43;14273:18;;;14266:34;;;14336:3;14316:18;;;14309:31;-1:-1:-1;14356:19:1;;;14349:30;-1:-1:-1;;;;;25795:33:0;;;;;14396:19:1;;25795:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25878:11;:9;:11::i;:::-;25893:1;25878:16;25875:62;;25914:10;;:17;;25929:1;25914:14;:17::i;:::-;25901:10;:30;25875:62;-1:-1:-1;25948:4:0;25519:438;;;;;;:::o;48287:318::-;48335:4;48476:1;48464:9;;:13;48461:139;;;48498:18;21832:2;48498;:18;:::i;:::-;48493:23;;:2;:23;:::i;48461:139::-;48540:54;48588:1;48576:9;;:13;;;;:::i;:::-;48572:20;;:1;:20;:::i;:::-;48547:18;21832:2;48547;:18;:::i;:::-;48542:23;;:2;:23;:::i;38540:173::-;38592:14;38612:9;38643:17;;38625:15;:35;;;;:::i;:::-;38612:49;;38675:15;38688:1;38675:12;:15::i;:::-;38666:24;;38695:13;38540:173;:::o;46969:354::-;47127:12;47146:14;47198:16;47215:6;47222:5;47181:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47171:58;;;;;;47146:84;;47256:10;47246:6;47238:15;;:28;47235:41;;;47268:8;;;47235:41;47291:26;;;;46969:354;-1:-1:-1;;;;;46969:354:0:o;25962:444::-;26081:12;26108:11;:9;:11::i;:::-;:16;26100:86;;;;-1:-1:-1;;;26100:86:0;;;;;;;:::i;:::-;26191:43;26198:5;26205:16;26223:10;26191:6;:43::i;:::-;-1:-1:-1;26239:80:0;;-1:-1:-1;;;26239:80:0;;26282:4;26239:80;;;15267:34:1;26289:10:0;15317:18:1;;;15310:43;15369:18;;;15362:34;;;26312:1:0;15412:18:1;;;15405:34;15247:3;15455:19;;;15448:32;-1:-1:-1;15496:19:1;;;15489:30;-1:-1:-1;;;;;26239:34:0;;;;;15536:19:1;;26239:80:0;14926:635:1;46632:332:0;46764:12;46783:14;46835:16;46852:10;46863:5;46818:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46808:62;;;;;;46783:88;;46897:10;46887:6;46879:15;;:28;46876:41;;;46909:8;;;46876:41;46932:26;;;;46632:332;-1:-1:-1;;;;46632:332:0:o;25403:110::-;25445:8;25506:1;25481:24;;:26;;;;:::i;:::-;25467:10;;:41;;;;:::i;35275:407::-;35424:12;35443:19;35479:10;:17;35499:1;35479:21;;;;:::i;:::-;35465:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35465:36:0;;35443:58;;35513:6;35509:76;35527:17;;:21;;35547:1;35527:21;:::i;:::-;35523:1;:26;35509:76;;;35573:6;35565:2;35568:1;35565:5;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35565:14:0;;;:5;;;;;;;;;;;:14;35551:3;;;;:::i;:::-;;;;35509:76;;;;35593:66;35619:5;35626:16;35644:10;35656:2;35593:25;:66::i;29804:1876::-;29916:17;29942:14;29987:15;;30004:10;30016:5;29970:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29960:63;;;;;;29942:81;;30098:16;30088:6;:26;30080:85;;;;-1:-1:-1;;;30080:85:0;;;;;;;:::i;:::-;30246:12;;30228:30;;30220:83;;;;-1:-1:-1;;;30220:83:0;;;;;;;:::i;:::-;30308:22;:20;:22::i;:::-;30363:17;;30345:15;:35;30337:77;;;;-1:-1:-1;;;30337:77:0;;16592:2:1;30337:77:0;;;16574:21:1;16631:2;16611:18;;;16604:30;16670:31;16650:18;;;16643:59;16719:18;;30337:77:0;16390:353:1;30337:77:0;30477:9;30537:10;;30509:17;;30491:15;:35;;;;:::i;:::-;30490:43;;30530:3;30490:43;:::i;:::-;30489:58;;;;:::i;:::-;30477:70;-1:-1:-1;30552:10:0;30575:3;30565:7;30477:70;30569:3;30565:7;:::i;:::-;:13;;;;:::i;:::-;30552:26;;30603:3;30595:5;:11;30592:67;;;30631:10;;:17;;30646:1;30631:14;:17::i;:::-;30618:10;:30;30592:67;30730:4;30722:5;:12;30719:556;;;30787:24;30807:3;30788:13;30799:1;30788:7;:13;:::i;30787:24::-;30753:32;30776:8;30765:4;30768:1;30765;:4;:::i;30753:32::-;:58;;;;:::i;:::-;30741:70;-1:-1:-1;30866:2:0;30856:8;:5;30866:2;30856:8;:::i;:::-;30855:13;;;;:::i;:::-;30839:30;;30840:10;30839:30;:::i;:::-;30825:9;:45;;30817:148;;;;-1:-1:-1;;;30817:148:0;;;;;;;:::i;:::-;30719:556;;;30994:23;31013:3;30995:4;30998:1;30995:2;:4;:::i;30994:23::-;:34;;31018:10;30994:34;:::i;:::-;30982:46;;31045:4;31037:5;:12;31034:236;;;31065:12;31073:4;31065:5;:12;:::i;:::-;31057:20;-1:-1:-1;31136:2:0;31124:8;31057:20;31136:2;31124:8;:::i;:::-;31123:15;;;;:::i;:::-;31122:23;;31142:3;31122:23;:::i;:::-;31106:40;;31107:10;31106:40;:::i;:::-;31092:9;:55;;31084:179;;;;-1:-1:-1;;;31084:179:0;;;;;;;:::i;:::-;31281:18;31302:42;31334:9;31319;31303:13;;:25;;;;:::i;31302:42::-;-1:-1:-1;;;;;31379:23:0;;;;;;:8;:23;;;;;;31281:63;;-1:-1:-1;31379:42:0;;31281:63;31379:27;:42::i;:::-;-1:-1:-1;;;;;31353:23:0;;;;;;:8;:23;;;;;;:68;;;;31431:50;;31353:23;;;-1:-1:-1;;;;;;;;;;;31431:50:0;;;31467:13;160:25:1;;148:2;133:18;;14:177;31431:50:0;;;;;;;;31503:12;;:31;;31520:13;31503:16;:31::i;:::-;31488:12;:46;31559:15;31539:17;:35;31621:10;;31633:15;;31586:64;;;10147:25:1;;;10203:2;10188:18;;10181:34;;;;10231:18;;10224:34;-1:-1:-1;;;;;31586:64:0;;;;;10135:2:1;10120:18;31586:64:0;;;;;;;;31657:16;;;;29804:1876;;;;;:::o;48729:246::-;48840:18;48867:14;48912:15;;48929:10;48941:5;48895:52;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;48895:52:0;;;;;;48885:63;;48895:52;48885:63;;;;;48729:246;-1:-1:-1;;;;;48729:246:0:o;28820:496::-;28893:19;28918:9;28962:10;;28932:19;28955:3;28931:27;;;;:::i;:::-;28930:42;;;;:::i;:::-;28918:54;-1:-1:-1;28977:10:0;29000:3;28990:7;28918:54;28994:3;28990:7;:::i;:::-;:13;;;;:::i;:::-;28977:26;;29028:4;29019:5;:13;29016:254;;29050:4;29042:5;:12;29039:106;;;29070:12;29078:4;29070:5;:12;:::i;:::-;29062:20;-1:-1:-1;29126:2:0;29115:7;29062:20;29121:1;29115:7;:::i;:::-;29114:14;;;;:::i;:::-;29113:22;;29132:3;29113:22;:::i;:::-;29097:39;;29098:10;29097:39;:::i;:::-;29089:48;28820:496;-1:-1:-1;;;;28820:496:0:o;29039:106::-;-1:-1:-1;29157:1:0;;28820:496;-1:-1:-1;;;28820:496:0:o;29016:254::-;29180:2;29172:5;:10;29169:101;;;29255:9;29263:1;29255:5;:9;:::i;:::-;29247:17;;29169:101;29307:2;29297:8;:5;29307:2;29297:8;:::i;:::-;29296:13;;;;:::i;49673:257::-;49794:10;49741:12;49785:20;;;:8;:20;;;;;;:32;;49810:6;49785:24;:32::i;:::-;49771:10;49762:20;;;;:8;:20;;;;;;:55;;;;-1:-1:-1;;;;;49837:12:0;;;;;;:24;;49854:6;49837:16;:24::i;:::-;-1:-1:-1;;;;;49822:12:0;;;;;;:8;:12;;;;;;;:39;;;;49873:32;;49882:10;;-1:-1:-1;;;;;;;;;;;49873:32:0;;;49898:6;160:25:1;;148:2;133:18;;14:177;39217:126:0;39268:14;39311:8;;39298:10;;:21;;;;:::i;31687:1582::-;31833:12;31852:15;31870:41;31877:5;31883:16;31901:6;31908:1;31901:9;;;;;;;;:::i;:::-;;;;;;;31870:6;:41::i;:::-;31852:59;;31934:1;31924:7;:11;31916:34;;;;-1:-1:-1;;;31916:34:0;;18334:2:1;31916:34:0;;;18316:21:1;18373:2;18353:18;;;18346:30;-1:-1:-1;;;18392:18:1;;;18385:40;18442:18;;31916:34:0;18132:334:1;31916:34:0;31982:17;;:21;;32002:1;31982:21;:::i;:::-;31965:6;:13;:38;31957:108;;;;-1:-1:-1;;;31957:108:0;;;;;;;:::i;:::-;32070:7;32084:240;32100:10;:17;32096:2;:21;32084:240;;;32155:4;:2;32158:1;32155:4;:::i;:::-;32151:9;;:1;:9;:::i;:::-;32137:10;;:24;;;;:::i;:::-;32165:1;32137:29;32174:5;32134:52;32195:6;32202:4;:2;32205:1;32202:4;:::i;:::-;32195:11;;32191:128;32211:10;:17;32208:1;:20;32191:128;;;32266:10;32277:2;32266:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32249:31:0;:10;32260:1;32249:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32249:31:0;;32241:71;;;;-1:-1:-1;;;32241:71:0;;;;;;;:::i;:::-;32230:3;;;;:::i;:::-;;;;32191:128;;;-1:-1:-1;32119:4:0;;;;:::i;:::-;;;;32084:240;;;32332:17;32358:18;32389:6;32385:759;32401:2;32399:1;:4;32385:759;;;32700:3;:1;32702;32700:3;:::i;:::-;32696:8;;:1;:8;:::i;:::-;32682:10;;:23;;;;:::i;:::-;32709:1;32682:28;32679:460;;32738:10;32749:1;32738:13;;;;;;;;:::i;:::-;;;;;;;;;;;32731:46;;-1:-1:-1;;;32731:46:0;;32771:4;32731:46;;;6005:51:1;-1:-1:-1;;;;;32731:31:0;;;;;;5978:18:1;;32731:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32718:59;-1:-1:-1;32787:15:0;;32784:285;;32815:5;32819:1;32815;:5;:::i;:::-;:10;:20;;;;-1:-1:-1;32829:6:0;;;32815:20;:42;;;;;32849:8;32839:7;:18;32815:42;32811:251;;;32879:68;32929:17;32911:7;32898:10;32886:9;;32882:1;:13;;;;:::i;:::-;32881:27;;;;:::i;:::-;:37;;;;:::i;:::-;32879:49;;:68::i;:::-;32867:80;;32811:251;;;32989:64;33035:17;33022:7;33009:10;32996:9;;32992:1;:13;;;;:::i;:::-;32991:28;;;;:::i;:::-;:38;;;;:::i;32989:64::-;32977:76;;32811:251;33085:10;33096:1;33085:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;33078:30:0;;33109:6;33116:1;33118;33116:3;;;;:::i;:::-;33109:11;;;;;;;;:::i;:::-;;;;;;;33122:9;33078:54;;;;;;;;;;;;;;;-1:-1:-1;;;;;19446:32:1;;;;19428:51;;19510:2;19495:18;;19488:34;19416:2;19401:18;;19254:274;33078:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32679:460;32405:3;;;;:::i;:::-;;;;32385:759;;;-1:-1:-1;33196:10:0;;33208:15;;33175:63;;;1609:25:1;;;1665:2;1650:18;;1643:34;;;;1693:18;;1686:34;;;1751:2;1736:18;;1729:34;;;33184:10:0;;33175:63;;1596:3:1;1581:19;33175:63:0;;;;;;;-1:-1:-1;33252:7:0;;31687:1582;-1:-1:-1;;;;;;;31687:1582:0:o;22207:1067::-;2927:5;;-1:-1:-1;;;;;2927:5:0;2913:10;:19;2905:42;;;;-1:-1:-1;;;2905:42:0;;20413:2:1;2905:42:0;;;20395:21:1;20452:2;20432:18;;;20425:30;-1:-1:-1;;;20471:18:1;;;20464:40;20521:18;;2905:42:0;20211:334:1;2905:42:0;22374:7:::1;::::0;22301:26:::1;::::0;22374:7:::1;;22373:8;22366:16;;;;:::i;:::-;22393:7;:14:::0;;-1:-1:-1;;22393:14:0::1;22403:4;22393:14;::::0;;22431:15:::1;22411:17;:35:::0;22471:18:::1;21832:2;22471;:18;:::i;:::-;22466:23;::::0;:2:::1;:23;:::i;:::-;22450:13;:39:::0;22509:1:::1;22497:9;:13:::0;;;22514:12:::1;:16:::0;;;22534:10:::1;:14:::0;;;22552:8:::1;:12:::0;22580:38:::1;22605:12;22580:21;:38;:::i;:::-;22568:9;:50:::0;;;22688:18:::1;::::0;:6:::1;:18;:::i;:::-;22679:27;::::0;:6:::1;:27;:::i;:::-;22654:21;22641:9;;22637:1;:13;;;;:::i;:::-;22636:39;;;;:::i;:::-;:71;;;;:::i;:::-;22624:9;:83:::0;22775:15:::1;::::0;:25:::1;::::0;22795:4:::1;22775:19;:25::i;:::-;22760:12;:40:::0;22844:15:::1;22811:30;:48:::0;22867:22:::1;:20;:22::i;:::-;22973:3;22975:1;22973::::0;:3:::1;:::i;:::-;-1:-1:-1::0;;;;;22945:25:0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:31;;;;:25;-1:-1:-1;;;;;;;;;;;23033:3:0::1;23035:1;23033::::0;:3:::1;:::i;:::-;22995:42;::::0;160:25:1;;;148:2;133:18;22995:42:0::1;;;;;;;23048:14;:32:::0;;-1:-1:-1;;;;;;23048:32:0;;::::1;-1:-1:-1::0;;;;;23048:32:0;;::::1;::::0;;::::1;::::0;;;23091:10:::1;:43:::0;;;::::1;::::0;;::::1;::::0;;23145:15:::1;:35:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;23185:10:0::1;:14:::0;23222:10:::1;::::0;23210:9:::1;:22:::0;23239:20:::1;-1:-1:-1::0;23239:8:0::1;:20::i;:::-;22281:993;22207:1067:::0;;:::o;23312:1731::-;23408:38;23433:12;23408:21;:38;:::i;:::-;23396:9;:50;;;23517:18;;:6;:18;:::i;:::-;23508:27;;:6;:27;:::i;:::-;23483:21;23470:9;;23466:1;:13;;;;:::i;:::-;23465:39;;;;:::i;:::-;:71;;;;:::i;:::-;23453:9;:83;23619:7;;23586:12;;23601:25;;:15;:25;:::i;:::-;23586:40;;23633:18;23667:9;;23654:10;;:22;;;;:::i;:::-;23633:43;-1:-1:-1;23698:20:0;23721:17;23633:43;23721:4;:17;:::i;:::-;23698:40;;23758:1;23746:9;;:13;23743:159;;;23800:9;;23797:12;;:1;:12;:::i;:::-;23785:24;;23786:7;23785:24;:::i;:::-;23771:10;:39;23743:159;;;23842:54;23890:1;23878:9;;:13;;;;:::i;23842:54::-;23826:13;:70;23743:159;23906:9;23918:41;23948:10;;23919:12;23934:3;23919:18;;;;:::i;23918:41::-;23906:53;-1:-1:-1;23964:13:0;23990:3;23980:7;23906:53;23984:3;23980:7;:::i;:::-;:13;;;;:::i;:::-;23964:29;;23998:17;24036:4;24028:5;:12;24025:140;;;24093:24;24113:3;24094:13;24105:1;24094:7;:13;:::i;24093:24::-;24059:32;24082:8;24071:4;24074:1;24071;:4;:::i;24059:32::-;:58;;;;:::i;:::-;24047:70;;24025:140;;;-1:-1:-1;24148:10:0;24025:140;24172:18;24193:55;24238:9;24223;24207:13;;24194:10;:26;;;;:::i;24193:55::-;24290:15;;-1:-1:-1;;;;;24290:15:0;24281:25;;;;:8;:25;;;;;;24172:76;;-1:-1:-1;24281:44:0;;24172:76;24281:29;:44::i;:::-;24262:15;;;-1:-1:-1;;;;;24262:15:0;;;24253:25;;;;:8;:25;;;;;;:72;;;;24356:15;;24335:52;;24356:15;;;-1:-1:-1;;;;;;;;;;;24335:52:0;;;24373:13;160:25:1;;148:2;133:18;;14:177;24335:52:0;;;;;;;;24403:8;;:27;;24416:13;24403:12;:27::i;:::-;24392:8;:38;24483:24;;24471:9;;24509:1;;24471:36;;;:::i;:::-;24464:44;;:3;:44;:::i;:::-;:46;;;;:::i;:::-;24439:21;:72;24435:524;;;24759:15;;24834:6;;24822:9;;-1:-1:-1;;;;;24759:15:0;;;;24794:62;;24846:9;;24795:24;24810:9;24796:10;24795:24;:::i;24794:62::-;24871:22;;24782:74;;-1:-1:-1;;;;;;24871:11:0;;;:22;;;;;24782:74;;24871:22;;;;24782:74;24871:11;:22;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24923:4:0;;24919:8;;:1;:8;:::i;:::-;24910:6;:17;-1:-1:-1;24435:524:0;;;24952:1;24943:6;:10;24435:524;-1:-1:-1;;24979:10:0;;24967:9;:22;-1:-1:-1;;25023:15:0;25013:7;:25;-1:-1:-1;;;23312:1731:0:o;46088:508::-;46138:11;46151:14;46167:18;46194:20;:18;:20::i;:::-;46218:1;46194:25;46191:61;;-1:-1:-1;46234:1:0;;;;-1:-1:-1;46234:1:0;;-1:-1:-1;46088:508:0:o;46191:61::-;46358:30;;46279:15;;46256:20;;46343:45;;46279:15;46343:45;:::i;:::-;46305:83;;46393:17;46446:20;:18;:20::i;:::-;46413:53;;:30;:53;:::i;:::-;46393:73;;46472:10;46489:15;:13;:15::i;:::-;46471:33;;;;;46509:8;46541:12;46520:5;46529:8;46520:18;;;;:::i;:::-;:33;;;;:::i;:::-;46509:44;46571:12;;-1:-1:-1;46585:5:0;;-1:-1:-1;46088:508:0;;-1:-1:-1;;;;46088:508:0:o;26411:2403::-;26515:17;26541:14;26586:15;;26603:10;26615:5;26569:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26559:63;;;;;;26541:81;;26697:16;26687:6;:26;26679:85;;;;-1:-1:-1;;;26679:85:0;;;;;;;:::i;:::-;26845:12;;26827:30;;26819:83;;;;-1:-1:-1;;;26819:83:0;;;;;;;:::i;:::-;26907:22;:20;:22::i;:::-;26962:17;;26944:15;:35;26936:69;;;;-1:-1:-1;;;26936:69:0;;20884:2:1;26936:69:0;;;20866:21:1;20923:2;20903:18;;;20896:30;-1:-1:-1;;;20942:18:1;;;20935:51;21003:18;;26936:69:0;20682:345:1;26936:69:0;27068:9;27128:10;;27100:17;;27082:15;:35;;;;:::i;:::-;27081:43;;27121:3;27081:43;:::i;:::-;27080:58;;;;:::i;:::-;27068:70;-1:-1:-1;27143:10:0;27166:3;27156:7;27068:70;27160:3;27156:7;:::i;:::-;:13;;;;:::i;:::-;27143:26;;27193:3;27185:5;:11;27182:67;;;27221:10;;:17;;27236:1;27221:14;:17::i;:::-;27208:10;:30;27182:67;27320:4;27312:5;:12;27309:567;;;27377:24;27397:3;27378:13;27389:1;27378:7;:13;:::i;27377:24::-;27343:32;27366:8;27355:4;27358:1;27355;:4;:::i;27343:32::-;:58;;;;:::i;:::-;27331:70;-1:-1:-1;27456:2:0;27446:8;:5;27456:2;27446:8;:::i;:::-;27445:13;;;;:::i;:::-;27429:30;;27430:10;27429:30;:::i;:::-;27415:9;:45;;27407:148;;;;-1:-1:-1;;;27407:148:0;;;;;;;:::i;:::-;27309:567;;;27584:23;27603:3;27585:4;27588:1;27585:2;:4;:::i;27584:23::-;:34;;27608:10;27584:34;:::i;:::-;27572:46;;27635:4;27627:5;:12;27624:247;;;27647:13;27663:12;27671:4;27663:5;:12;:::i;:::-;27647:28;-1:-1:-1;27737:2:0;27722:11;27647:28;27737:2;27722:11;:::i;:::-;27721:18;;;;:::i;:::-;27720:26;;27743:3;27720:26;:::i;:::-;27704:43;;27705:10;27704:43;:::i;:::-;27690:9;:58;;27682:182;;;;-1:-1:-1;;;27682:182:0;;;;;;;:::i;:::-;27640:231;27624:247;27882:18;27903:42;27935:9;27920;27904:13;;:25;;;;:::i;27903:42::-;-1:-1:-1;;;;;27980:23:0;;;;;;:8;:23;;;;;;27882:63;;-1:-1:-1;27980:42:0;;27882:63;27980:27;:42::i;:::-;-1:-1:-1;;;;;27954:23:0;;;;;;:8;:23;;;;;;:68;;;;28032:50;;27954:23;;;-1:-1:-1;;;;;;;;;;;28032:50:0;;;28068:13;160:25:1;;148:2;133:18;;14:177;28032:50:0;;;;;;;;28106:12;;:31;;28123:13;28106:16;:31::i;:::-;28091:12;:46;28162:15;28142:17;:35;28185:6;;:10;28182:527;;28213:4;28205:5;:12;28202:502;;;28236:18;28265:13;28236:43;;28298:2;-1:-1:-1;;;;;28298:11:0;:60;28310:47;28347:9;28335:6;;28323:9;;28311;:21;;;;:::i;28310:47::-;28298:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28218:252;28202:502;;;28495:18;28524:13;28495:43;;28559:2;-1:-1:-1;;;;;28559:11:0;:47;28571:34;28602:2;28590:6;;28578:9;;28572:3;:15;;;;:::i;28571:34::-;28559:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28474:230;28202:502;28755:10;;28767:15;;28720:64;;;10147:25:1;;;10203:2;10188:18;;10181:34;;;;10231:18;;10224:34;-1:-1:-1;;;;;28720:64:0;;;;;10135:2:1;10120:18;28720:64:0;9945:319:1;33672:1598:0;33826:12;33845:15;33863:49;33878:5;33884:16;33902:6;33909:1;33902:9;;;;;;;;:::i;:::-;;;;;;;33863:14;:49::i;:::-;33845:67;;33935:1;33925:7;:11;33917:34;;;;-1:-1:-1;;;33917:34:0;;18334:2:1;33917:34:0;;;18316:21:1;18373:2;18353:18;;;18346:30;-1:-1:-1;;;18392:18:1;;;18385:40;18442:18;;33917:34:0;18132:334:1;33917:34:0;33983:17;;:21;;34003:1;33983:21;:::i;:::-;33966:6;:13;:38;33958:108;;;;-1:-1:-1;;;33958:108:0;;;;;;;:::i;:::-;34071:7;34085:240;34101:10;:17;34097:2;:21;34085:240;;;34156:4;:2;34159:1;34156:4;:::i;:::-;34152:9;;:1;:9;:::i;:::-;34138:10;;:24;;;;:::i;:::-;34166:1;34138:29;34175:5;34135:52;34196:6;34203:4;:2;34206:1;34203:4;:::i;:::-;34196:11;;34192:128;34212:10;:17;34209:1;:20;34192:128;;;34267:10;34278:2;34267:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;34250:31:0;:10;34261:1;34250:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;34250:31:0;;34242:71;;;;-1:-1:-1;;;34242:71:0;;;;;;;:::i;:::-;34231:3;;;;:::i;:::-;;;;34192:128;;;-1:-1:-1;34120:4:0;;;;:::i;:::-;;;;34085:240;;;34333:17;34359:18;34390:6;34386:759;34402:2;34400:1;:4;34386:759;;;34701:3;:1;34703;34701:3;:::i;:::-;34697:8;;:1;:8;:::i;:::-;34683:10;;:23;;;;:::i;:::-;34710:1;34683:28;34680:460;;34739:10;34750:1;34739:13;;;;;;;;:::i;:::-;;;;;;;;;;;34732:46;;-1:-1:-1;;;34732:46:0;;34772:4;34732:46;;;6005:51:1;-1:-1:-1;;;;;34732:31:0;;;;;;5978:18:1;;34732:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34719:59;-1:-1:-1;34788:15:0;;34785:285;;34816:5;34820:1;34816;:5;:::i;:::-;:10;:20;;;;-1:-1:-1;34830:6:0;;;34816:20;:42;;;;;34850:8;34840:7;:18;34816:42;34812:251;;;34880:68;34930:17;34912:7;34899:10;34887:9;;34883:1;:13;;;;:::i;34880:68::-;34868:80;;34812:251;;;34990:64;35036:17;35023:7;35010:10;34997:9;;34993:1;:13;;;;:::i;34990:64::-;34978:76;;34812:251;35086:10;35097:1;35086:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;35079:30:0;;35110:6;35117:1;35119;35117:3;;;;:::i;:::-;35110:11;;;;;;;;:::i;:::-;;;;;;;35123:9;35079:54;;;;;;;;;;;;;;;-1:-1:-1;;;;;19446:32:1;;;;19428:51;;19510:2;19495:18;;19488:34;19416:2;19401:18;;19254:274;35079:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34680:460;34406:3;;;;:::i;:::-;;;;34386:759;;35711:2688;35852:12;35871:14;35916:15;;35933:10;35945:5;35899:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35889:63;;;;;;35871:81;;36027:16;36017:6;:26;36009:85;;;;-1:-1:-1;;;36009:85:0;;;;;;;:::i;:::-;36175:12;;36157:30;;36149:83;;;;-1:-1:-1;;;36149:83:0;;;;;;;:::i;:::-;36237:22;:20;:22::i;:::-;36292:17;;36274:15;:35;36266:69;;;;-1:-1:-1;;;36266:69:0;;20884:2:1;36266:69:0;;;20866:21:1;20923:2;20903:18;;;20896:30;-1:-1:-1;;;20942:18:1;;;20935:51;21003:18;;36266:69:0;20682:345:1;36266:69:0;36365:10;:17;36348:6;:13;:34;36340:104;;;;-1:-1:-1;;;36340:104:0;;21234:2:1;36340:104:0;;;21216:21:1;21273:2;21253:18;;;21246:30;21312:34;21292:18;;;21285:62;21383:28;21363:18;;;21356:56;21429:19;;36340:104:0;21032:422:1;36340:104:0;36451:7;36465:240;36481:10;:17;36477:2;:21;36465:240;;;36536:4;:2;36539:1;36536:4;:::i;:::-;36532:9;;:1;:9;:::i;:::-;36518:10;;:24;;;;:::i;:::-;36546:1;36518:29;36555:5;36515:52;36576:6;36583:4;:2;36586:1;36583:4;:::i;:::-;36576:11;;36572:128;36592:10;:17;36589:1;:20;36572:128;;;36647:10;36658:2;36647:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;36630:31:0;:10;36641:1;36630:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;36630:31:0;;36622:71;;;;-1:-1:-1;;;36622:71:0;;;;;;;:::i;:::-;36611:3;;;;:::i;:::-;;;;36572:128;;;-1:-1:-1;36500:4:0;;;;:::i;:::-;;;;36465:240;;;36711:9;36771:10;;36743:17;;36725:15;:35;;;;:::i;:::-;36724:43;;36764:3;36724:43;:::i;:::-;36723:58;;;;:::i;:::-;36711:70;-1:-1:-1;36786:10:0;36809:3;36799:7;36711:70;36803:3;36799:7;:::i;:::-;:13;;;;:::i;:::-;36786:26;;36818:14;36858:3;36850:5;:11;36847:67;;;36886:10;;:17;;36901:1;36886:14;:17::i;:::-;36873:10;:30;36847:67;36984:4;36976:5;:12;36973:556;;;37041:24;37061:3;37042:13;37053:1;37042:7;:13;:::i;37041:24::-;37007:32;37030:8;37019:4;37022:1;37019;:4;:::i;37007:32::-;:58;;;;:::i;:::-;36995:70;-1:-1:-1;37120:2:0;37110:8;:5;37120:2;37110:8;:::i;:::-;37109:13;;;;:::i;:::-;37093:30;;37094:10;37093:30;:::i;:::-;37079:9;:45;;37071:148;;;;-1:-1:-1;;;37071:148:0;;;;;;;:::i;:::-;36973:556;;;37248:23;37267:3;37249:4;37252:1;37249:2;:4;:::i;37248:23::-;:34;;37272:10;37248:34;:::i;:::-;37236:46;;37299:4;37291:5;:12;37288:236;;;37319:12;37327:4;37319:5;:12;:::i;:::-;37311:20;-1:-1:-1;37390:2:0;37378:8;37311:20;37390:2;37378:8;:::i;:::-;37377:15;;;;:::i;:::-;37376:23;;37396:3;37376:23;:::i;:::-;37360:40;;37361:10;37360:40;:::i;:::-;37346:9;:55;;37338:179;;;;-1:-1:-1;;;37338:179:0;;;;;;;:::i;:::-;37535:18;;37558:773;37574:2;37572:1;:4;37558:773;;;37868:3;:1;37870;37868:3;:::i;:::-;37864:8;;:1;:8;:::i;:::-;37850:10;;:23;;;;:::i;:::-;37877:1;37850:28;37847:479;;37906:10;37917:1;37906:13;;;;;;;;:::i;:::-;;;;;;;;;;;37899:46;;-1:-1:-1;;;37899:46:0;;37939:4;37899:46;;;6005:51:1;-1:-1:-1;;;;;37899:31:0;;;;;;5978:18:1;;37899:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37886:59;-1:-1:-1;37955:15:0;;37952:362;;37983:5;37987:1;37983;:5;:::i;:::-;:10;:20;;;;-1:-1:-1;37997:6:0;;;37983:20;:44;;;;;38019:8;38007:9;:20;37983:44;37979:254;;;38049:71;38102:17;38082:9;38069:10;38056:9;;38052:1;:13;;;;:::i;38049:71::-;38037:83;;37979:254;;;38154:67;38202:17;38187:9;38174:10;38161:9;;38157:1;:13;;;;:::i;38154:67::-;38142:79;;37979:254;38250:10;38261:1;38250:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;38243:30:0;;38274:6;38281:1;38274:9;;;;;;;;:::i;:::-;;;;;;;38285;38243:52;;;;;;;;;;;;;;;-1:-1:-1;;;;;19446:32:1;;;;19428:51;;19510:2;19495:18;;19488:34;19416:2;19401:18;;19254:274;38243:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37952:362;37578:3;;;;:::i;:::-;;;;37558:773;;;-1:-1:-1;;38355:15:0;38335:17;:35;38382:9;35711:2688;-1:-1:-1;;;;;;;;;35711:2688:0:o;5085:139::-;5143:7;5171:1;5176;5171:6;5163:30;;;;-1:-1:-1;;;5163:30:0;;21661:2:1;5163:30:0;;;21643:21:1;21700:2;21680:18;;;21673:30;-1:-1:-1;;;21719:18:1;;;21712:41;21770:18;;5163:30:0;21459:335:1;5163:30:0;5211:5;5215:1;5211;:5;:::i;:::-;5204:12;5085:139;-1:-1:-1;;;5085:139:0:o;4848:229::-;4907:7;4931:1;4936;4931:6;4927:47;;-1:-1:-1;4961:1:0;4954:8;;4927:47;4986:9;4998:5;5002:1;4998;:5;:::i;:::-;4986:17;-1:-1:-1;5031:1:0;5022:5;5026:1;4986:17;5022:5;:::i;:::-;:10;5014:36;;;;-1:-1:-1;;;5014:36:0;;22001:2:1;5014:36:0;;;21983:21:1;22040:2;22020:18;;;22013:30;-1:-1:-1;;;22059:18:1;;;22052:43;22112:18;;5014:36:0;21799:337:1;4699:141:0;4757:7;4790:1;4785;:6;;4777:32;;;;-1:-1:-1;;;4777:32:0;;22343:2:1;4777:32:0;;;22325:21:1;22382:2;22362:18;;;22355:30;-1:-1:-1;;;22401:18:1;;;22394:43;22454:18;;4777:32:0;22141:337:1;4777:32:0;4827:5;4831:1;4827;:5;:::i;5594:132::-;5656:6;5684:1;5680;:5;5677:18;;;-1:-1:-1;5694:1:0;5687:8;;5677:18;-1:-1:-1;5715:1:0;;5594:132;-1:-1:-1;5594:132:0:o;4527:164::-;4585:7;;4617:5;4621:1;4617;:5;:::i;:::-;4605:17;;4646:1;4641;:6;;4633:31;;;;-1:-1:-1;;;4633:31:0;;22685:2:1;4633:31:0;;;22667:21:1;22724:2;22704:18;;;22697:30;-1:-1:-1;;;22743:18:1;;;22736:42;22795:18;;4633:31:0;22483:336:1;40140:1833:0;40395:15;;40378:13;;40361:12;;:31;;:16;:31::i;:::-;:49;:67;;;;;40426:2;40414:9;;:14;40361:67;40357:594;;;40451:9;;:13;;40463:1;40451:13;:::i;:::-;40439:9;:25;;;40503:37;;40525:13;;40537:1;40525:13;:::i;:::-;40521:18;;:1;:18;:::i;:::-;40503:12;;;:16;:37::i;:::-;40488:12;;:52;;;;:::i;:::-;40470:15;:70;40549:9;;40561:1;-1:-1:-1;40546:400:0;;;40588:15;;:22;;40608:1;40588:19;:22::i;:::-;40570:15;:40;40646:9;;40643:12;;:1;:12;:::i;:::-;40631:24;;40632:7;40631:24;:::i;:::-;40617:10;:39;40666:9;;40678:1;-1:-1:-1;40663:189:0;;;40719:2;40691:24;;:30;40688:157;;40758:1;40731:24;:28;40546:400;;40688:157;40835:1;40808:24;;:28;;;;:::i;:::-;40781:24;:55;40688:157;40546:400;;;40885:54;40933:1;40921:9;;:13;;;;:::i;40885:54::-;40869:13;:70;40546:400;41128:10;;:17;;41143:1;41128:14;:17::i;:::-;41115:10;:30;;;41253:24;;:28;;41115:10;41253:28;:::i;:::-;41240:8;;41227:10;;:21;;;;:::i;:::-;41226:56;;;;:::i;:::-;41286:1;41226:61;41223:586;;41298:15;:13;:15::i;:::-;41352:37;41374:9;;41386:1;41374:13;;;;:::i;41352:37::-;41337:12;;:52;;;;:::i;:::-;41319:15;:70;41494:21;;41420:15;;41397:20;;41479:36;;41420:15;41479:36;:::i;:::-;41441:74;;41521:24;41590:1;41563:24;;:28;;;;:::i;:::-;41548:10;;:44;;;;:::i;:::-;41624:15;41600:21;:39;41521:71;-1:-1:-1;41651:52:0;;;;:111;;;41733:24;;41721:8;;41708:10;;:21;;;;:::i;:::-;41707:50;;;;:::i;:::-;:55;41651:111;41647:157;;;41776:21;:19;:21::i;:::-;41292:517;;;41223:586;41838:42;-1:-1:-1;;;;;41831:63:0;;41966:1;41903:42;-1:-1:-1;;;;;41896:65:0;;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;;;:::i;:::-;41831:137;;;;;;;;;;;;;160:25:1;;148:2;133:18;;14:177;41831:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41813:15;:155;40140:1833::o;5232:232::-;5295:7;5323:1;5328;5323:6;5315:30;;;;-1:-1:-1;;;5315:30:0;;21661:2:1;5315:30:0;;;21643:21:1;21700:2;21680:18;;;21673:30;-1:-1:-1;;;21719:18:1;;;21712:41;21770:18;;5315:30:0;21459:335:1;5315:30:0;5356:9;5368:5;5372:1;5368;:5;:::i;:::-;5356:17;-1:-1:-1;5388:5:0;5392:1;5388;:5;:::i;:::-;:10;5384:52;;5419:5;:1;5423;5419:5;:::i;2975:134::-;2927:5;;-1:-1:-1;;;;;2927:5:0;2913:10;:19;2905:42;;;;-1:-1:-1;;;2905:42:0;;20413:2:1;2905:42:0;;;20395:21:1;20452:2;20432:18;;;20425:30;-1:-1:-1;;;20471:18:1;;;20464:40;20521:18;;2905:42:0;20211:334:1;2905:42:0;3062:5:::1;::::0;3044:32:::1;::::0;;-1:-1:-1;;;;;3062:5:0;;::::1;23225:34:1::0;;23295:15;;;23290:2;23275:18;;23268:43;3044:32:0::1;::::0;23160:18:1;3044:32:0::1;;;;;;;3087:5;:14:::0;;-1:-1:-1;;;;;;3087:14:0::1;-1:-1:-1::0;;;;;3087:14:0;;;::::1;::::0;;;::::1;::::0;;2975:134::o;43501:1491::-;43642:30;;43569:15;;43546:20;;43627:45;;43569:15;43627:45;:::i;:::-;43589:83;;43677:15;43708:8;;43695:10;;:21;;;;:::i;:::-;43677:39;;43721:24;43762:10;43748;;:24;;;;:::i;:::-;43789:10;;43778:8;:21;43721:51;-1:-1:-1;43874:52:0;;;43870:761;;;43938:21;43962:69;43999:30;43963:29;:19;43988:3;43963:24;:29::i;43962:69::-;44044:1;44037:4;:8;43938:93;-1:-1:-1;44051:27:0;44081:45;44121:4;44081:25;43938:93;44102:3;44081:20;:25::i;:45::-;44051:75;;44169:69;44186:51;44214:22;44186;44203:4;44186:12;;:16;;:22;;;;:::i;44169:69::-;44154:12;:84;-1:-1:-1;43870:761:0;;-1:-1:-1;43870:761:0;;44272:23;44298:69;44346:19;44299:40;:30;44335:3;44299:35;:40::i;44298:69::-;44380:1;44373:4;:8;44272:95;-1:-1:-1;44387:29:0;44419:47;44461:4;44419:27;44272:95;44442:3;44419:22;:27::i;:47::-;44387:79;;44536:70;44553:52;44580:24;44553:21;44570:3;44553:12;;:16;;:21;;;;:::i;44536:70::-;44521:12;:85;-1:-1:-1;;43870:761:0;44670:12;44637:30;:45;;;;44726:42;-1:-1:-1;;;;;44719:65:0;;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44687:29;:99;44809:15;;44794:12;;:30;44791:97;;;44867:15;;44852:12;:30;44791:97;44910:15;;44895:12;;:30;44892:92;;;44963:15;;44948:12;:30;44892:92;43541:1451;;;;43501:1491::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:173::-;817:20;;-1:-1:-1;;;;;866:31:1;;856:42;;846:70;;912:1;909;902:12;846:70;749:173;;;:::o;927:254::-;995:6;1003;1056:2;1044:9;1035:7;1031:23;1027:32;1024:52;;;1072:1;1069;1062:12;1024:52;1095:29;1114:9;1095:29;:::i;:::-;1085:39;1171:2;1156:18;;;;1143:32;;-1:-1:-1;;;927:254:1:o;1774:347::-;1825:8;1835:6;1889:3;1882:4;1874:6;1870:17;1866:27;1856:55;;1907:1;1904;1897:12;1856:55;-1:-1:-1;1930:20:1;;1973:18;1962:30;;1959:50;;;2005:1;2002;1995:12;1959:50;2042:4;2034:6;2030:17;2018:29;;2094:3;2087:4;2078:6;2070;2066:19;2062:30;2059:39;2056:59;;;2111:1;2108;2101:12;2056:59;1774:347;;;;;:::o;2126:695::-;2232:6;2240;2248;2256;2264;2272;2325:3;2313:9;2304:7;2300:23;2296:33;2293:53;;;2342:1;2339;2332:12;2293:53;2365:29;2384:9;2365:29;:::i;:::-;2355:39;;2413:38;2447:2;2436:9;2432:18;2413:38;:::i;:::-;2403:48;;2498:2;2487:9;2483:18;2470:32;2460:42;;2549:2;2538:9;2534:18;2521:32;2511:42;;2604:3;2593:9;2589:19;2576:33;2632:18;2624:6;2621:30;2618:50;;;2664:1;2661;2654:12;2618:50;2703:58;2753:7;2744:6;2733:9;2729:22;2703:58;:::i;:::-;2126:695;;;;-1:-1:-1;2126:695:1;;-1:-1:-1;2126:695:1;;2780:8;;2126:695;-1:-1:-1;;;2126:695:1:o;3033:626::-;3130:6;3138;3146;3154;3162;3215:3;3203:9;3194:7;3190:23;3186:33;3183:53;;;3232:1;3229;3222:12;3183:53;3255:29;3274:9;3255:29;:::i;:::-;3245:39;;3303:38;3337:2;3326:9;3322:18;3303:38;:::i;:::-;3293:48;;3388:2;3377:9;3373:18;3360:32;3350:42;;3443:2;3432:9;3428:18;3415:32;3470:18;3462:6;3459:30;3456:50;;;3502:1;3499;3492:12;3456:50;3541:58;3591:7;3582:6;3571:9;3567:22;3541:58;:::i;:::-;3033:626;;;;-1:-1:-1;3033:626:1;;-1:-1:-1;3618:8:1;;3515:84;3033:626;-1:-1:-1;;;3033:626:1:o;3664:248::-;3732:6;3740;3793:2;3781:9;3772:7;3768:23;3764:32;3761:52;;;3809:1;3806;3799:12;3761:52;-1:-1:-1;;3832:23:1;;;3902:2;3887:18;;;3874:32;;-1:-1:-1;3664:248:1:o;3917:127::-;3978:10;3973:3;3969:20;3966:1;3959:31;4009:4;4006:1;3999:15;4033:4;4030:1;4023:15;4049:908;4103:5;4156:3;4149:4;4141:6;4137:17;4133:27;4123:55;;4174:1;4171;4164:12;4123:55;4210:6;4197:20;4236:4;4259:18;4296:2;4292;4289:10;4286:36;;;4302:18;;:::i;:::-;4348:2;4345:1;4341:10;4380:2;4374:9;4443:2;4439:7;4434:2;4430;4426:11;4422:25;4414:6;4410:38;4498:6;4486:10;4483:22;4478:2;4466:10;4463:18;4460:46;4457:72;;;4509:18;;:::i;:::-;4545:2;4538:22;4595:18;;;4671:15;;;4667:24;;;4629:15;;;;-1:-1:-1;4703:15:1;;;4700:35;;;4731:1;4728;4721:12;4700:35;4767:2;4759:6;4755:15;4744:26;;4779:148;4795:6;4790:3;4787:15;4779:148;;;4861:23;4880:3;4861:23;:::i;:::-;4849:36;;4905:12;;;;4812;;;;4779:148;;;4945:6;4049:908;-1:-1:-1;;;;;;;4049:908:1:o;4962:559::-;5073:6;5081;5089;5097;5150:3;5138:9;5129:7;5125:23;5121:33;5118:53;;;5167:1;5164;5157:12;5118:53;5203:9;5190:23;5180:33;;5260:2;5249:9;5245:18;5232:32;5222:42;;5315:2;5304:9;5300:18;5287:32;5342:18;5334:6;5331:30;5328:50;;;5374:1;5371;5364:12;5328:50;5397:61;5450:7;5441:6;5430:9;5426:22;5397:61;:::i;:::-;5387:71;;;5477:38;5511:2;5500:9;5496:18;5477:38;:::i;:::-;5467:48;;4962:559;;;;;;;:::o;5526:328::-;5603:6;5611;5619;5672:2;5660:9;5651:7;5647:23;5643:32;5640:52;;;5688:1;5685;5678:12;5640:52;5711:29;5730:9;5711:29;:::i;:::-;5701:39;;5759:38;5793:2;5782:9;5778:18;5759:38;:::i;:::-;5749:48;;5844:2;5833:9;5829:18;5816:32;5806:42;;5526:328;;;;;:::o;6256:180::-;6315:6;6368:2;6356:9;6347:7;6343:23;6339:32;6336:52;;;6384:1;6381;6374:12;6336:52;-1:-1:-1;6407:23:1;;6256:180;-1:-1:-1;6256:180:1:o;6441:391::-;6527:6;6535;6543;6551;6604:3;6592:9;6583:7;6579:23;6575:33;6572:53;;;6621:1;6618;6611:12;6572:53;6644:29;6663:9;6644:29;:::i;:::-;6634:39;6720:2;6705:18;;6692:32;;-1:-1:-1;6771:2:1;6756:18;;6743:32;;6822:2;6807:18;6794:32;;-1:-1:-1;6441:391:1;-1:-1:-1;;;6441:391:1:o;7019:460::-;7114:6;7122;7130;7138;7146;7199:3;7187:9;7178:7;7174:23;7170:33;7167:53;;;7216:1;7213;7206:12;7167:53;7252:9;7239:23;7229:33;;7309:2;7298:9;7294:18;7281:32;7271:42;;7360:2;7349:9;7345:18;7332:32;7322:42;;7411:2;7400:9;7396:18;7383:32;7373:42;;7434:39;7468:3;7457:9;7453:19;7434:39;:::i;:::-;7424:49;;7019:460;;;;;;;;:::o;7484:186::-;7543:6;7596:2;7584:9;7575:7;7571:23;7567:32;7564:52;;;7612:1;7609;7602:12;7564:52;7635:29;7654:9;7635:29;:::i;7675:385::-;7761:6;7769;7777;7785;7838:3;7826:9;7817:7;7813:23;7809:33;7806:53;;;7855:1;7852;7845:12;7806:53;-1:-1:-1;;7878:23:1;;;7948:2;7933:18;;7920:32;;-1:-1:-1;7999:2:1;7984:18;;7971:32;;8050:2;8035:18;8022:32;;-1:-1:-1;7675:385:1;-1:-1:-1;7675:385:1:o;8065:322::-;8142:6;8150;8158;8211:2;8199:9;8190:7;8186:23;8182:32;8179:52;;;8227:1;8224;8217:12;8179:52;8263:9;8250:23;8240:33;;8320:2;8309:9;8305:18;8292:32;8282:42;;8343:38;8377:2;8366:9;8362:18;8343:38;:::i;:::-;8333:48;;8065:322;;;;;:::o;8392:316::-;8469:6;8477;8485;8538:2;8526:9;8517:7;8513:23;8509:32;8506:52;;;8554:1;8551;8544:12;8506:52;-1:-1:-1;;8577:23:1;;;8647:2;8632:18;;8619:32;;-1:-1:-1;8698:2:1;8683:18;;;8670:32;;8392:316;-1:-1:-1;8392:316:1:o;8943:732::-;9079:6;9087;9095;9103;9156:3;9144:9;9135:7;9131:23;9127:33;9124:53;;;9173:1;9170;9163:12;9124:53;9209:9;9196:23;9186:33;;9266:2;9255:9;9251:18;9238:32;9228:42;;9321:2;9310:9;9306:18;9293:32;9344:18;9385:2;9377:6;9374:14;9371:34;;;9401:1;9398;9391:12;9371:34;9424:61;9477:7;9468:6;9457:9;9453:22;9424:61;:::i;:::-;9414:71;;9538:2;9527:9;9523:18;9510:32;9494:48;;9567:2;9557:8;9554:16;9551:36;;;9583:1;9580;9573:12;9551:36;;9606:63;9661:7;9650:8;9639:9;9635:24;9606:63;:::i;:::-;9596:73;;;8943:732;;;;;;;:::o;9680:260::-;9748:6;9756;9809:2;9797:9;9788:7;9784:23;9780:32;9777:52;;;9825:1;9822;9815:12;9777:52;9848:29;9867:9;9848:29;:::i;:::-;9838:39;;9896:38;9930:2;9919:9;9915:18;9896:38;:::i;:::-;9886:48;;9680:260;;;;;:::o;10269:127::-;10330:10;10325:3;10321:20;10318:1;10311:31;10361:4;10358:1;10351:15;10385:4;10382:1;10375:15;10401:128;10468:9;;;10489:11;;;10486:37;;;10503:18;;:::i;10534:380::-;10613:1;10609:12;;;;10656;;;10677:61;;10731:4;10723:6;10719:17;10709:27;;10677:61;10784:2;10776:6;10773:14;10753:18;10750:38;10747:161;;10830:10;10825:3;10821:20;10818:1;10811:31;10865:4;10862:1;10855:15;10893:4;10890:1;10883:15;10747:161;;10534:380;;;:::o;10919:127::-;10980:10;10975:3;10971:20;10968:1;10961:31;11011:4;11008:1;11001:15;11035:4;11032:1;11025:15;11051:120;11091:1;11117;11107:35;;11122:18;;:::i;:::-;-1:-1:-1;11156:9:1;;11051:120::o;11176:168::-;11249:9;;;11280;;11297:15;;;11291:22;;11277:37;11267:71;;11318:18;;:::i;11349:112::-;11381:1;11407;11397:35;;11412:18;;:::i;:::-;-1:-1:-1;11446:9:1;;11349:112::o;11466:125::-;11531:9;;;11552:10;;;11549:36;;;11565:18;;:::i;11596:127::-;11657:10;11652:3;11648:20;11645:1;11638:31;11688:4;11685:1;11678:15;11712:4;11709:1;11702:15;11728:135;11767:3;11788:17;;;11785:43;;11808:18;;:::i;:::-;-1:-1:-1;11855:1:1;11844:13;;11728:135::o;11868:184::-;11938:6;11991:2;11979:9;11970:7;11966:23;11962:32;11959:52;;;12007:1;12004;11997:12;11959:52;-1:-1:-1;12030:16:1;;11868:184;-1:-1:-1;11868:184:1:o;12057:422::-;12146:1;12189:5;12146:1;12203:270;12224:7;12214:8;12211:21;12203:270;;;12283:4;12279:1;12275:6;12271:17;12265:4;12262:27;12259:53;;;12292:18;;:::i;:::-;12342:7;12332:8;12328:22;12325:55;;;12362:16;;;;12325:55;12441:22;;;;12401:15;;;;12203:270;;;12207:3;12057:422;;;;;:::o;12484:806::-;12533:5;12563:8;12553:80;;-1:-1:-1;12604:1:1;12618:5;;12553:80;12652:4;12642:76;;-1:-1:-1;12689:1:1;12703:5;;12642:76;12734:4;12752:1;12747:59;;;;12820:1;12815:130;;;;12727:218;;12747:59;12777:1;12768:10;;12791:5;;;12815:130;12852:3;12842:8;12839:17;12836:43;;;12859:18;;:::i;:::-;-1:-1:-1;;12915:1:1;12901:16;;12930:5;;12727:218;;13029:2;13019:8;13016:16;13010:3;13004:4;13001:13;12997:36;12991:2;12981:8;12978:16;12973:2;12967:4;12964:12;12960:35;12957:77;12954:159;;;-1:-1:-1;13066:19:1;;;13098:5;;12954:159;13145:34;13170:8;13164:4;13145:34;:::i;:::-;13215:6;13211:1;13207:6;13203:19;13194:7;13191:32;13188:58;;;13226:18;;:::i;:::-;13264:20;;12484:806;-1:-1:-1;;;12484:806:1:o;13295:140::-;13353:5;13382:47;13423:4;13413:8;13409:19;13403:4;13382:47;:::i;13440:421::-;13642:2;13624:21;;;13681:2;13661:18;;;13654:30;13720:34;13715:2;13700:18;;13693:62;13791:27;13786:2;13771:18;;13764:55;13851:3;13836:19;;13440:421::o;14426:131::-;14486:5;14515:36;14542:8;14536:4;14515:36;:::i;14562:359::-;14747:19;;;14804:2;14800:15;;;;-1:-1:-1;;14796:53:1;14791:2;14782:12;;14775:75;14875:2;14866:12;;14859:28;14912:2;14903:12;;14562:359::o;15566:410::-;15768:2;15750:21;;;15807:2;15787:18;;;15780:30;15846:34;15841:2;15826:18;;15819:62;-1:-1:-1;;;15912:2:1;15897:18;;15890:44;15966:3;15951:19;;15566:410::o;15981:404::-;16183:2;16165:21;;;16222:2;16202:18;;;16195:30;16261:34;16256:2;16241:18;;16234:62;-1:-1:-1;;;16327:2:1;16312:18;;16305:38;16375:3;16360:19;;15981:404::o;16748:494::-;16950:2;16932:21;;;16989:2;16969:18;;;16962:30;17028:34;17023:2;17008:18;;17001:62;17099:34;17094:2;17079:18;;17072:62;17171:28;17165:3;17150:19;;17143:57;17232:3;17217:19;;16748:494::o;17247:556::-;17449:2;17431:21;;;17488:3;17468:18;;;17461:31;17528:34;17523:2;17508:18;;17501:62;17599:34;17594:2;17579:18;;17572:62;17671:34;17665:3;17650:19;;17643:63;-1:-1:-1;;;17737:3:1;17722:19;;17715:46;17793:3;17778:19;;17247:556::o;18471:422::-;18673:2;18655:21;;;18712:2;18692:18;;;18685:30;18751:34;18746:2;18731:18;;18724:62;18822:28;18817:2;18802:18;;18795:56;18883:3;18868:19;;18471:422::o;18898:351::-;19100:2;19082:21;;;19139:2;19119:18;;;19112:30;19178:29;19173:2;19158:18;;19151:57;19240:2;19225:18;;18898:351::o;19533:277::-;19600:6;19653:2;19641:9;19632:7;19628:23;19624:32;19621:52;;;19669:1;19666;19659:12;19621:52;19701:9;19695:16;19754:5;19747:13;19740:21;19733:5;19730:32;19720:60;;19776:1;19773;19766:12;20550:127;20611:10;20606:3;20602:20;20599:1;20592:31;20642:4;20639:1;20632:15;20666:4;20663:1;20656:15
Swarm Source
ipfs://71e9ef78024eb4834277a390da30104b57ebfd0816c68d6436d099cb420b937c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.
Add Token to MetaMask (Web3)