More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 127 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Funds | 18126798 | 538 days ago | IN | 0 ETH | 0.00115085 | ||||
Withdraw Funds | 18126781 | 538 days ago | IN | 0 ETH | 0.00052549 | ||||
Withdraw Funds | 18126722 | 538 days ago | IN | 0 ETH | 0.00053577 | ||||
Settle Bet | 18107236 | 541 days ago | IN | 0 ETH | 0.00201065 | ||||
Place Bet | 18107233 | 541 days ago | IN | 0.01 ETH | 0.0024914 | ||||
Settle Bet | 18104899 | 541 days ago | IN | 0 ETH | 0.00268253 | ||||
Place Bet | 18104893 | 541 days ago | IN | 0.01 ETH | 0.002757 | ||||
Settle Bet | 17923940 | 567 days ago | IN | 0 ETH | 0.00445743 | ||||
Place Bet | 17923938 | 567 days ago | IN | 0.05059 ETH | 0.00522405 | ||||
Settle Bet | 17923914 | 567 days ago | IN | 0 ETH | 0.0055551 | ||||
Place Bet | 17923912 | 567 days ago | IN | 0.04047 ETH | 0.00446673 | ||||
Settle Bet | 17923898 | 567 days ago | IN | 0 ETH | 0.00376862 | ||||
Place Bet | 17923892 | 567 days ago | IN | 0.03038 ETH | 0.00445486 | ||||
Settle Bet | 17923887 | 567 days ago | IN | 0 ETH | 0.0058227 | ||||
Place Bet | 17923884 | 567 days ago | IN | 0.03032 ETH | 0.00465263 | ||||
Settle Bet | 17923871 | 567 days ago | IN | 0 ETH | 0.00577472 | ||||
Place Bet | 17923863 | 567 days ago | IN | 0.03004 ETH | 0.00476771 | ||||
Settle Bet | 17876874 | 573 days ago | IN | 0 ETH | 0.0039204 | ||||
Settle Bet | 17876868 | 573 days ago | IN | 0 ETH | 0.00405231 | ||||
Place Bet | 17876865 | 573 days ago | IN | 0.01 ETH | 0.00436056 | ||||
Place Bet | 17876862 | 573 days ago | IN | 0.01 ETH | 0.00507161 | ||||
Settle Bet | 17840554 | 578 days ago | IN | 0 ETH | 0.00316846 | ||||
Place Bet | 17840548 | 578 days ago | IN | 0.0302 ETH | 0.00415639 | ||||
Settle Bet | 17840543 | 578 days ago | IN | 0 ETH | 0.0054855 | ||||
Place Bet | 17840539 | 578 days ago | IN | 0.02023 ETH | 0.00541232 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
18126798 | 538 days ago | 27.6622438 ETH | ||||
18104899 | 541 days ago | 0.01188 ETH | ||||
17923914 | 567 days ago | 0.060097 ETH | ||||
17923887 | 567 days ago | 0.045025 ETH | ||||
17923871 | 567 days ago | 0.059479 ETH | ||||
17840543 | 578 days ago | 0.041724 ETH | ||||
17840536 | 578 days ago | 0.025304 ETH | ||||
17801365 | 584 days ago | 0.104167 ETH | ||||
17755794 | 590 days ago | 0.0198 ETH | ||||
17755546 | 590 days ago | 0.019411 ETH | ||||
17755510 | 590 days ago | 0.0594 ETH | ||||
17712045 | 596 days ago | 2.020408 ETH | ||||
17712035 | 596 days ago | 6.061224 ETH | ||||
17712006 | 596 days ago | 2.020408 ETH | ||||
17711995 | 596 days ago | 6.061224 ETH | ||||
17711970 | 596 days ago | 2.020408 ETH | ||||
17711959 | 596 days ago | 6.061224 ETH | ||||
17705975 | 597 days ago | 3.030612 ETH | ||||
17705965 | 597 days ago | 6.061224 ETH | ||||
17705935 | 597 days ago | 6.061224 ETH | ||||
17705899 | 597 days ago | 6.061224 ETH | ||||
17675766 | 601 days ago | 0.0198 ETH | ||||
17644782 | 606 days ago | 0.0594 ETH | ||||
17644771 | 606 days ago | 0.019411 ETH | ||||
17633074 | 607 days ago | 4.141836 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
HashBet
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-15 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/HashBet.sol pragma solidity ^0.8.0; contract HashBet is Ownable, ReentrancyGuard { // Modulo is the number of equiprobable outcomes in a game: // 2 for coin flip // 6 for dice roll // 6*6 = 36 for double dice // 37 for roulette // 100 for hashroll uint constant MAX_MODULO = 100; // Modulos below MAX_MASK_MODULO are checked against a bit mask, allowing betting on specific outcomes. // For example in a dice roll (modolo = 6), // 000001 mask means betting on 1. 000001 converted from binary to decimal becomes 1. // 101000 mask means betting on 4 and 6. 101000 converted from binary to decimal becomes 40. // The specific value is dictated by the fact that 256-bit intermediate // multiplication result allows implementing population count efficiently // for numbers that are up to 42 bits, and 40 is the highest multiple of // eight below 42. uint constant MAX_MASK_MODULO = 40; // EVM BLOCKHASH opcode can query no further than 256 blocks into the // past. Given that settleBet uses block hash of placeBet as one of // complementary entropy sources, we cannot process bets older than this // threshold. On rare occasions dice2.win croupier may fail to invoke // settleBet in this timespan due to technical issues or extreme Ethereum // congestion; such bets can be refunded via invoking refundBet. uint constant BET_EXPIRATION_BLOCKS = 250; // This is a check on bet mask overflow. Maximum mask is equivalent to number of possible binary outcomes for maximum modulo. uint constant MAX_BET_MASK = 2 ** MAX_MASK_MODULO; // These are constants taht make O(1) population count in placeBet possible. uint constant POPCNT_MULT = 0x0000000000002000000000100000000008000000000400000000020000000001; uint constant POPCNT_MASK = 0x0001041041041041041041041041041041041041041041041041041041041041; uint constant POPCNT_MODULO = 0x3F; // Sum of all historical deposits and withdrawals. Used for calculating profitability. Profit = Balance - cumulativeDeposit + cumulativeWithdrawal uint public cumulativeDeposit; uint public cumulativeWithdrawal; // In addition to house edge, wealth tax is added every time the bet amount exceeds a multiple of a threshold. // For example, if wealthTaxIncrementThreshold = 3000 ether, // A bet amount of 3000 ether will have a wealth tax of 1% in addition to house edge. // A bet amount of 6000 ether will have a wealth tax of 2% in addition to house edge. uint public wealthTaxIncrementThreshold = 3000 ether; uint public wealthTaxIncrementPercent = 1; // The minimum and maximum bets. uint public minBetAmount = 0.01 ether; uint public maxBetAmount = 10000 ether; // max bet profit. Used to cap bets against dynamic odds. uint public maxProfit = 300000 ether; // Funds that are locked in potentially winning bets. Prevents contract from committing to new bets that it cannot pay out. uint public lockedInBets; // The minimum larger comparison value. uint public minOverValue = 50; // The maximum smaller comparison value. uint public maxUnderValue = 50; struct BetItem { // Wager amount in wei. uint amount; // Modulo of a game. uint8 modulo; } // Info of each bet. struct Bet { BetItem item; // Number of winning outcomes, used to compute winning payment (* modulo/rollEdge), // and used instead of mask for games with modulo > MAX_MASK_MODULO. uint8 rollEdge; // Bit mask representing winning bet outcomes (see MAX_MASK_MODULO comment). uint40 mask; // Block number of placeBet tx. uint placeBlockNumber; // Address of a gambler, used to pay out winning bets. address payable gambler; // Status of bet settlement. bool isSettled; // Outcome of bet. uint outcome; // Win amount. uint winAmount; // Final Win amount. uint finalWinAmount; // Random number used to settle bet. uint randomNumber; // Keccak256 hash of some secret "reveal" random number. uint commit; // Comparison method. bool isLarger; } // Each bet is deducted dynamic uint public houseEdgePercent = 2; // Mapping from commits to all currently active & processed bets. mapping (uint => Bet) public bets; // Events event BetPlaced(address indexed gambler, uint amount, uint8 indexed modulo, uint8 rollEdge, uint40 mask, uint commit, bool isLarger); event BetSettled(address indexed gambler, uint amount, uint8 indexed modulo, uint8 rollEdge, uint40 mask, uint outcome, uint winAmount, uint finalWinAmount); event BetRefunded(address indexed gambler, uint amount); // Fallback payable function used to top up the bank roll. fallback() external payable { cumulativeDeposit += msg.value; } receive() external payable { cumulativeDeposit += msg.value; } // See ETH balance. function getBalance() external view returns (uint) { return address(this).balance; } // Set minimum larger comparison value. function setMinOverValue(uint value) external onlyOwner { minOverValue = value; } // Set maximum smaller comparison value. function setMaxUnderValue(uint value) external onlyOwner { maxUnderValue = value; } // Set min house edge percent function setHouseEdgePercent(uint _houseEdgePercent) external onlyOwner { require ( _houseEdgePercent >= 1 && _houseEdgePercent <= 100, "houseEdgePercent must be a sane number"); houseEdgePercent = _houseEdgePercent; } // Set min bet amount. minBetAmount should be large enough such that its house edge fee can cover the Chainlink oracle fee. function setMinBetAmount(uint _minBetAmount) external onlyOwner { minBetAmount = _minBetAmount * 1 gwei; } // Set max bet amount. function setMaxBetAmount(uint _maxBetAmount) external onlyOwner { require (_maxBetAmount < 5000000 ether, "maxBetAmount must be a sane number"); maxBetAmount = _maxBetAmount; } // Set max bet reward. Setting this to zero effectively disables betting. function setMaxProfit(uint _maxProfit) external onlyOwner { require (_maxProfit < 50000000 ether, "maxProfit must be a sane number"); maxProfit = _maxProfit; } // Set wealth tax percentage to be added to house edge percent. Setting this to zero effectively disables wealth tax. function setWealthTaxIncrementPercent(uint _wealthTaxIncrementPercent) external onlyOwner { wealthTaxIncrementPercent = _wealthTaxIncrementPercent; } // Set threshold to trigger wealth tax. function setWealthTaxIncrementThreshold(uint _wealthTaxIncrementThreshold) external onlyOwner { wealthTaxIncrementThreshold = _wealthTaxIncrementThreshold; } // Owner can withdraw funds not exceeding balance minus potential win prizes by open bets function withdrawFunds(address payable beneficiary, uint withdrawAmount) external onlyOwner { require (withdrawAmount <= address(this).balance, "Withdrawal amount larger than balance."); require (withdrawAmount <= address(this).balance - lockedInBets, "Withdrawal amount larger than balance minus lockedInBets"); beneficiary.transfer(withdrawAmount); cumulativeWithdrawal += withdrawAmount; } function emitBetPlacedEvent(address gambler, uint amount, uint8 modulo, uint8 rollEdge, uint40 mask, uint commit, bool isLarger) private { // Record bet in event logs emit BetPlaced(gambler, amount, uint8(modulo), uint8(rollEdge), uint40(mask), commit, isLarger); } // Place bet function placeBet(uint betMask, uint modulo, uint commitLastBlock, uint commit, bool isLarger, bytes32 r, bytes32 s) external payable nonReentrant { Bet storage bet = bets[commit]; require (bet.gambler == address(0), "Bet should be in a 'clean' state."); uint amount = msg.value; validateArguments(amount, betMask, modulo, commitLastBlock, commit, isLarger, r, s); uint rollEdge; uint mask; if (modulo <= MAX_MASK_MODULO) { // Small modulo games can specify exact bet outcomes via bit mask. // rollEdge is a number of 1 bits in this mask (population count). // This magic looking formula is an efficient way to compute population // count on EVM for numbers below 2**40. rollEdge = ((betMask * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO; mask = betMask; } else { // Larger modulos games specify the right edge of half-open interval of winning bet outcomes. require (betMask > 0 && betMask <= modulo, "High modulo range, betMask larger than modulo."); rollEdge = betMask; } // Winning amount. uint possibleWinAmount = getDiceWinAmount(amount, modulo, rollEdge, isLarger); // Enforce max profit limit. Bet will not be placed if condition is not met. require (possibleWinAmount <= amount + maxProfit, "maxProfit limit violation."); // Check whether contract has enough funds to accept this bet. require (lockedInBets + possibleWinAmount <= address(this).balance, "Unable to accept bet due to insufficient funds"); // Update lock funds. lockedInBets += possibleWinAmount; // Store bet bet.item.amount=amount; bet.item.modulo=uint8(modulo); bet.rollEdge=uint8(rollEdge); bet.mask=uint40(mask); bet.placeBlockNumber=block.number; bet.gambler=payable(msg.sender); bet.isSettled=false; bet.outcome=0; bet.winAmount=0; bet.finalWinAmount=0; bet.randomNumber=0; bet.commit=commit; bet.isLarger=isLarger; // Record bet in event logs emitBetPlacedEvent(bet.gambler, amount, uint8(modulo), uint8(rollEdge), uint40(mask), commit, isLarger); } // Get the expected win amount after house edge is subtracted. function getDiceWinAmount(uint amount, uint modulo, uint rollEdge, bool isLarger) private view returns (uint winAmount) { require (0 < rollEdge && rollEdge <= modulo, "Win probability out of range."); uint houseEdge = amount * (houseEdgePercent + getWealthTax(amount)) / 100; uint realRollEdge = rollEdge; if (modulo == MAX_MODULO && isLarger) { realRollEdge = MAX_MODULO - rollEdge; } winAmount = (amount - houseEdge) * modulo / realRollEdge; uint maxWinAmount = amount + maxProfit; if(winAmount > maxWinAmount) { winAmount = maxWinAmount; } } // Get wealth tax function getWealthTax(uint amount) private view returns (uint wealthTax) { wealthTax = amount / wealthTaxIncrementThreshold * wealthTaxIncrementPercent; } // This is the method used to settle 99% of bets. To process a bet with a specific // "commit", settleBet should supply a "reveal" number that would Keccak256-hash to // "commit". "transactionHash" is the block hash of placeBet block as seen by croupier; it // is additionally asserted to prevent changing the bet outcomes on Ethereum reorgs. function settleBet(uint reveal, bytes32 transactionHash, uint finalWinAmount) external onlyOwner { uint commit = uint(keccak256(abi.encodePacked(reveal))); Bet storage bet = bets[commit]; uint placeBlockNumber = bet.placeBlockNumber; require (bet.gambler != address(0), "Bet should be in a 'bet' state."); // Check that bet has not expired yet (see comment to BET_EXPIRATION_BLOCKS). require (block.number >= placeBlockNumber, "settleBet before placeBet"); // Set final win amount bet.finalWinAmount = finalWinAmount; // Settle bet using reveal and blockHash as entropy sources. settleBetCommon(bet, reveal, transactionHash); } // This method is used to settle a bet that was mined into an uncle block. At this // point the player was shown some bet outcome, but the blockhash at placeBet height // is different because of Ethereum chain reorg. We supply a full merkle proof of the // placeBet transaction receipt to provide untamperable evidence that uncle block hash // indeed was present on-chain at some point. function settleBetUncleMerkleProof(uint reveal, uint40 canonicalBlockNumber) external onlyOwner { // "commit" for bet settlement can only be obtained by hashing a "reveal". uint commit = uint(keccak256(abi.encodePacked(reveal))); Bet storage bet = bets[commit]; // Check that canonical block hash can still be verified. require (block.number <= canonicalBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM."); // Verify placeBet receipt. requireCorrectReceipt(4 + 32 + 32 + 4); // Reconstruct canonical & uncle block hashes from a receipt merkle proof, verify them. bytes32 canonicalHash; bytes32 uncleHash; (canonicalHash, uncleHash) = verifyMerkleProof(commit, 4 + 32 + 32); require (blockhash(canonicalBlockNumber) == canonicalHash); // Settle bet using reveal and uncleHash as entropy sources. settleBetCommon(bet, reveal, uncleHash); } // Common settlement code for settleBet & settleBetUncleMerkleProof. function settleBetCommon(Bet storage bet, uint reveal, bytes32 entropyBlockHash) private { // Fetch bet parameters into local variables (to save gas). uint amount = bet.item.amount; // Validation check require (amount > 0, "Bet does not exist."); // Check that bet exists require(bet.isSettled == false, "Bet is settled already"); // Check that bet is not settled yet // Fetch bet parameters into local variables (to save gas). uint modulo = bet.item.modulo; uint rollEdge = bet.rollEdge; address payable gambler = bet.gambler; bool isLarger = bet.isLarger; // The RNG - combine "reveal" and blockhash of placeBet using Keccak256. Miners // are not aware of "reveal" and cannot deduce it from "commit" (as Keccak256 // preimage is intractable), and house is unable to alter the "reveal" after // placeBet have been mined (as Keccak256 collision finding is also intractable). bytes32 entropy = keccak256(abi.encodePacked(reveal, entropyBlockHash)); // Do a roll by taking a modulo of entropy. Compute winning amount. uint outcome = uint(entropy) % modulo; // Win amount if gambler wins this bet uint possibleWinAmount = getDiceWinAmount(amount, modulo, rollEdge, isLarger); // Actual win amount by gambler uint winAmount = 0; // Determine dice outcome. if (modulo <= MAX_MASK_MODULO) { // For small modulo games, check the outcome against a bit mask. if ((2 ** outcome) & bet.mask != 0) { winAmount = possibleWinAmount; } } else { // For larger modulos, check inclusion into half-open interval. if (isLarger){ if (outcome > rollEdge) { winAmount = possibleWinAmount; } } else{ if (outcome < rollEdge) { winAmount = possibleWinAmount; } } } // Unlock possibleWinAmount from lockedInBets, regardless of the outcome. lockedInBets -= possibleWinAmount; // Update bet records bet.isSettled = true; bet.winAmount = winAmount; bet.randomNumber = uint(entropy); bet.outcome = outcome; if (bet.finalWinAmount == 0 || bet.finalWinAmount > bet.winAmount) { bet.finalWinAmount = winAmount; } // Send win amount to gambler. if (bet.finalWinAmount > 0) { gambler.transfer(bet.finalWinAmount); } emitSettledEvent(bet); } function emitSettledEvent(Bet storage bet) private { uint amount = bet.item.amount; uint outcome = bet.outcome; uint winAmount = bet.winAmount; uint finalWinAmount = bet.finalWinAmount; // Fetch bet parameters into local variables (to save gas). uint modulo = bet.item.modulo; uint rollEdge = bet.rollEdge; address payable gambler = bet.gambler; // Record bet settlement in event log. emit BetSettled(gambler, amount, uint8(modulo), uint8(rollEdge), bet.mask, outcome, winAmount, finalWinAmount); } // Return the bet in extremely unlikely scenario it was not settled by Chainlink VRF. // In case you ever find yourself in a situation like this, just contact hashbet support. // However, nothing precludes you from calling this method yourself. function refundBet(uint commit) external nonReentrant payable { Bet storage bet = bets[commit]; uint amount = bet.item.amount; bool isLarger = bet.isLarger; // Validation check require (amount > 0, "Bet does not exist."); // Check that bet exists require (bet.isSettled == false, "Bet is settled already."); // Check that bet is still open require (block.number > bet.placeBlockNumber + 43200, "Wait after placing bet before requesting refund."); uint possibleWinAmount = getDiceWinAmount(amount, bet.item.modulo, bet.rollEdge, isLarger); // Unlock possibleWinAmount from lockedInBets, regardless of the outcome. lockedInBets -= possibleWinAmount; // Update bet records bet.isSettled = true; bet.winAmount = amount; // Send the refund. bet.gambler.transfer(amount); // Record refund in event logs emit BetRefunded(bet.gambler, amount); } // This helpers are used to verify cryptographic proofs of placeBet inclusion into // uncle blocks. They are used to prevent bet outcome changing on Ethereum reorgs without // compromising the security of the smart contract. Proof data is appended to the input data // in a simple prefix length format and does not adhere to the ABI. // Invariants checked: // - receipt trie entry contains a (1) successful transaction (2) directed at this smart // contract (3) containing commit as a payload. // - receipt trie entry is a part of a valid merkle proof of a block header // - the block header is a part of uncle list of some block on canonical chain // The implementation is optimized for gas cost and relies on the specifics of Ethereum internal data structures. // Read the whitepaper for details. // Helper to verify a full merkle proof starting from some seedHash (usually commit). "offset" is the location of the proof // beginning in the calldata. function verifyMerkleProof(uint seedHash, uint offset) pure private returns (bytes32 blockHash, bytes32 uncleHash) { // (Safe) assumption - nobody will write into RAM during this method invocation. uint scratchBuf1; assembly { scratchBuf1 := mload(0x40) } uint uncleHeaderLength; uint blobLength; uint shift; uint hashSlot; // Verify merkle proofs up to uncle block header. Calldata layout is: // - 2 byte big-endian slice length // - 2 byte big-endian offset to the beginning of previous slice hash within the current slice (should be zeroed) // - followed by the current slice verbatim for (;; offset += blobLength) { assembly { blobLength := and(calldataload(sub(offset, 30)), 0xffff) } if (blobLength == 0) { // Zero slice length marks the end of uncle proof. break; } assembly { shift := and(calldataload(sub(offset, 28)), 0xffff) } require (shift + 32 <= blobLength, "Shift bounds check."); offset += 4; assembly { hashSlot := calldataload(add(offset, shift)) } require (hashSlot == 0, "Non-empty hash slot."); assembly { calldatacopy(scratchBuf1, offset, blobLength) mstore(add(scratchBuf1, shift), seedHash) seedHash := keccak256(scratchBuf1, blobLength) uncleHeaderLength := blobLength } } // At this moment the uncle hash is known. uncleHash = bytes32(seedHash); // Construct the uncle list of a canonical block. uint scratchBuf2 = scratchBuf1 + uncleHeaderLength; uint unclesLength; assembly { unclesLength := and(calldataload(sub(offset, 28)), 0xffff) } uint unclesShift; assembly { unclesShift := and(calldataload(sub(offset, 26)), 0xffff) } require (unclesShift + uncleHeaderLength <= unclesLength, "Shift bounds check."); offset += 6; assembly { calldatacopy(scratchBuf2, offset, unclesLength) } memcpy(scratchBuf2 + unclesShift, scratchBuf1, uncleHeaderLength); assembly { seedHash := keccak256(scratchBuf2, unclesLength) } offset += unclesLength; // Verify the canonical block header using the computed sha3Uncles. assembly { blobLength := and(calldataload(sub(offset, 30)), 0xffff) shift := and(calldataload(sub(offset, 28)), 0xffff) } require (shift + 32 <= blobLength, "Shift bounds check."); offset += 4; assembly { hashSlot := calldataload(add(offset, shift)) } require (hashSlot == 0, "Non-empty hash slot."); assembly { calldatacopy(scratchBuf1, offset, blobLength) mstore(add(scratchBuf1, shift), seedHash) // At this moment the canonical block hash is known. blockHash := keccak256(scratchBuf1, blobLength) } } // Helper to check the placeBet receipt. "offset" is the location of the proof beginning in the calldata. // RLP layout: [triePath, str([status, cumGasUsed, bloomFilter, [[address, [topics], data]])] function requireCorrectReceipt(uint offset) view private { uint leafHeaderByte; assembly { leafHeaderByte := byte(0, calldataload(offset)) } require (leafHeaderByte >= 0xf7, "Receipt leaf longer than 55 bytes."); offset += leafHeaderByte - 0xf6; uint pathHeaderByte; assembly { pathHeaderByte := byte(0, calldataload(offset)) } if (pathHeaderByte <= 0x7f) { offset += 1; } else { require (pathHeaderByte >= 0x80 && pathHeaderByte <= 0xb7, "Path is an RLP string."); offset += pathHeaderByte - 0x7f; } uint receiptStringHeaderByte; assembly { receiptStringHeaderByte := byte(0, calldataload(offset)) } require (receiptStringHeaderByte == 0xb9, "Receipt string is always at least 256 bytes long, but less than 64k."); offset += 3; uint receiptHeaderByte; assembly { receiptHeaderByte := byte(0, calldataload(offset)) } require (receiptHeaderByte == 0xf9, "Receipt is always at least 256 bytes long, but less than 64k."); offset += 3; uint statusByte; assembly { statusByte := byte(0, calldataload(offset)) } require (statusByte == 0x1, "Status should be success."); offset += 1; uint cumGasHeaderByte; assembly { cumGasHeaderByte := byte(0, calldataload(offset)) } if (cumGasHeaderByte <= 0x7f) { offset += 1; } else { require (cumGasHeaderByte >= 0x80 && cumGasHeaderByte <= 0xb7, "Cumulative gas is an RLP string."); offset += cumGasHeaderByte - 0x7f; } uint bloomHeaderByte; assembly { bloomHeaderByte := byte(0, calldataload(offset)) } require (bloomHeaderByte == 0xb9, "Bloom filter is always 256 bytes long."); offset += 256 + 3; uint logsListHeaderByte; assembly { logsListHeaderByte := byte(0, calldataload(offset)) } require (logsListHeaderByte == 0xf8, "Logs list is less than 256 bytes long."); offset += 2; uint logEntryHeaderByte; assembly { logEntryHeaderByte := byte(0, calldataload(offset)) } require (logEntryHeaderByte == 0xf8, "Log entry is less than 256 bytes long."); offset += 2; uint addressHeaderByte; assembly { addressHeaderByte := byte(0, calldataload(offset)) } require (addressHeaderByte == 0x94, "Address is 20 bytes long."); uint logAddress; assembly { logAddress := and(calldataload(sub(offset, 11)), 0xffffffffffffffffffffffffffffffffffffffff) } require (logAddress == uint(uint160(address(this)))); } // Memory copy. function memcpy(uint dest, uint src, uint len) pure private { // Full 32 byte words for(; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } // Check arguments function validateArguments(uint amount, uint betMask, uint modulo, uint commitLastBlock, uint commit, bool isLarger, bytes32 r, bytes32 s) view private { // Validate input data. require (modulo > 1 && modulo <= MAX_MODULO, "Modulo should be within range."); require (amount >= minBetAmount && amount <= maxBetAmount, "Bet amount should be within range."); require (betMask > 0 && betMask < MAX_BET_MASK, "Mask should be within range."); // Check that commit is valid - it has not expired and its signature is valid. require (block.number <= commitLastBlock, "Commit has expired."); bytes32 signatureHash = keccak256(abi.encodePacked(betMask, modulo, commitLastBlock, commit, isLarger)); require (owner() == ecrecover(signatureHash, 27, r, s), "ECDSA signature is not valid."); if (modulo > MAX_MASK_MODULO) { if (isLarger){ require (betMask >= minOverValue && betMask <= modulo, "High modulo range, betMask must larger than minimum larger comparison value."); } else{ require (betMask > 0 && betMask <= maxUnderValue, "High modulo range, betMask must smaller than maximum smaller comparison value."); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"modulo","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"rollEdge","type":"uint8"},{"indexed":false,"internalType":"uint40","name":"mask","type":"uint40"},{"indexed":false,"internalType":"uint256","name":"commit","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLarger","type":"bool"}],"name":"BetPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BetRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"modulo","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"rollEdge","type":"uint8"},{"indexed":false,"internalType":"uint40","name":"mask","type":"uint40"},{"indexed":false,"internalType":"uint256","name":"outcome","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finalWinAmount","type":"uint256"}],"name":"BetSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bets","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"modulo","type":"uint8"}],"internalType":"struct HashBet.BetItem","name":"item","type":"tuple"},{"internalType":"uint8","name":"rollEdge","type":"uint8"},{"internalType":"uint40","name":"mask","type":"uint40"},{"internalType":"uint256","name":"placeBlockNumber","type":"uint256"},{"internalType":"address payable","name":"gambler","type":"address"},{"internalType":"bool","name":"isSettled","type":"bool"},{"internalType":"uint256","name":"outcome","type":"uint256"},{"internalType":"uint256","name":"winAmount","type":"uint256"},{"internalType":"uint256","name":"finalWinAmount","type":"uint256"},{"internalType":"uint256","name":"randomNumber","type":"uint256"},{"internalType":"uint256","name":"commit","type":"uint256"},{"internalType":"bool","name":"isLarger","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cumulativeDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cumulativeWithdrawal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseEdgePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedInBets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxUnderValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minOverValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betMask","type":"uint256"},{"internalType":"uint256","name":"modulo","type":"uint256"},{"internalType":"uint256","name":"commitLastBlock","type":"uint256"},{"internalType":"uint256","name":"commit","type":"uint256"},{"internalType":"bool","name":"isLarger","type":"bool"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"placeBet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"commit","type":"uint256"}],"name":"refundBet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_houseEdgePercent","type":"uint256"}],"name":"setHouseEdgePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBetAmount","type":"uint256"}],"name":"setMaxBetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxProfit","type":"uint256"}],"name":"setMaxProfit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxUnderValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBetAmount","type":"uint256"}],"name":"setMinBetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinOverValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wealthTaxIncrementPercent","type":"uint256"}],"name":"setWealthTaxIncrementPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wealthTaxIncrementThreshold","type":"uint256"}],"name":"setWealthTaxIncrementThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reveal","type":"uint256"},{"internalType":"bytes32","name":"transactionHash","type":"bytes32"},{"internalType":"uint256","name":"finalWinAmount","type":"uint256"}],"name":"settleBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reveal","type":"uint256"},{"internalType":"uint40","name":"canonicalBlockNumber","type":"uint40"}],"name":"settleBetUncleMerkleProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wealthTaxIncrementPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wealthTaxIncrementThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405268a2a15d09519be000006004556001600555662386f26fc1000060065569021e19e0c9bab2400000600755693f870857a3e0e38000006008556032600a556032600b556002600c553480156200005957600080fd5b506200007a6200006e6200008760201b60201c565b6200008f60201b60201c565b6001808190555062000153565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61437b80620001636000396000f3fe6080604052600436106101c65760003560e01c80638eb12c20116100f7578063cab11d5d11610095578063e1fdb4b411610064578063e1fdb4b41461061a578063f2fde38b14610636578063fa968eea1461065f578063fbd668a91461068a576101e6565b8063cab11d5d14610570578063cf96ce031461059b578063d98e6ae6146105c4578063df88126f146105ef576101e6565b8063b539cd55116100d1578063b539cd55146104d7578063bd7fd78d14610502578063c10753291461052b578063c6d1d5aa14610554576101e6565b80638eb12c201461045c5780638fedadf114610485578063af3dc07f146104ae576101e6565b806370d8c5781161016457806374e048d51161013e57806374e048d5146103b657806377010f70146103df5780637cfbc7a5146104085780638da5cb5b14610431576101e6565b806370d8c57814610349578063715018a61461037457806372318cf91461038b576101e6565b80631f9d3a2b116101a05780631f9d3a2b1461028257806322af00fa146102ad578063386d5fe6146102f55780636c18859314610320576101e6565b80630c531f271461020157806312065fe01461022c578063177c55c814610257576101e6565b366101e65734600260008282546101dd9190612520565b92505081905550005b34600260008282546101f89190612520565b92505081905550005b34801561020d57600080fd5b506102166106b3565b6040516102239190612585565b60405180910390f35b34801561023857600080fd5b506102416106b9565b60405161024e9190612585565b60405180910390f35b34801561026357600080fd5b5061026c6106c1565b6040516102799190612585565b60405180910390f35b34801561028e57600080fd5b506102976106c7565b6040516102a49190612585565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf91906125d1565b6106cd565b6040516102ec9c9b9a999897969594939291906126e3565b60405180910390f35b34801561030157600080fd5b5061030a6107b6565b6040516103179190612585565b60405180910390f35b34801561032c57600080fd5b50610347600480360381019061034291906125d1565b6107bc565b005b34801561035557600080fd5b5061035e6107dd565b60405161036b9190612585565b60405180910390f35b34801561038057600080fd5b506103896107e3565b005b34801561039757600080fd5b506103a06107f7565b6040516103ad9190612585565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d891906127ca565b6107fd565b005b3480156103eb57600080fd5b50610406600480360381019061040191906125d1565b6108e7565b005b34801561041457600080fd5b5061042f600480360381019061042a91906125d1565b6108f9565b005b34801561043d57600080fd5b50610446610958565b604051610453919061282b565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e919061287c565b610981565b005b34801561049157600080fd5b506104ac60048036038101906104a791906125d1565b610aca565b005b3480156104ba57600080fd5b506104d560048036038101906104d091906125d1565b610adc565b005b3480156104e357600080fd5b506104ec610aee565b6040516104f99190612585565b60405180910390f35b34801561050e57600080fd5b50610529600480360381019061052491906125d1565b610af4565b005b34801561053757600080fd5b50610552600480360381019061054d91906128fb565b610b06565b005b61056e60048036038101906105699190612967565b610c05565b005b34801561057c57600080fd5b50610585610fbd565b6040516105929190612585565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd91906125d1565b610fc3565b005b3480156105d057600080fd5b506105d9611026565b6040516105e69190612585565b60405180910390f35b3480156105fb57600080fd5b5061060461102c565b6040516106119190612585565b60405180910390f35b610634600480360381019061062f91906125d1565b611032565b005b34801561064257600080fd5b5061065d60048036038101906106589190612a35565b6112c7565b005b34801561066b57600080fd5b5061067461134b565b6040516106819190612585565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac91906125d1565b611351565b005b60025481565b600047905090565b600b5481565b600c5481565b600d60205280600052604060002060009150905080600001604051806040016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff1681525050908060020160009054906101000a900460ff16908060020160019054906101000a900464ffffffffff16908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160149054906101000a900460ff169080600501549080600601549080600701549080600801549080600901549080600a0160009054906101000a900460ff1690508c565b60055481565b6107c46113b0565b633b9aca00816107d49190612a62565b60068190555050565b60045481565b6107eb6113b0565b6107f5600061142e565b565b60035481565b6108056113b0565b6000826040516020016108189190612add565b6040516020818303038152906040528051906020012060001c90506000600d6000838152602001908152602001600020905060fa8364ffffffffff1661085e9190612520565b4311156108a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089790612b7b565b60405180910390fd5b6108aa60486114f2565b6000806108b8846044611939565b8092508193505050818564ffffffffff1640146108d457600080fd5b6108df838783611bcd565b505050505050565b6108ef6113b0565b80600b8190555050565b6109016113b0565b6a0422ca8b0a00a425000000811061094e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094590612c0d565b60405180910390fd5b8060078190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6109896113b0565b60008360405160200161099c9190612add565b6040516020818303038152906040528051906020012060001c90506000600d60008381526020019081526020016000209050600081600301549050600073ffffffffffffffffffffffffffffffffffffffff168260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290612c79565b60405180910390fd5b80431015610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa590612ce5565b60405180910390fd5b838260070181905550610ac2828787611bcd565b505050505050565b610ad26113b0565b80600a8190555050565b610ae46113b0565b8060048190555050565b60085481565b610afc6113b0565b8060058190555050565b610b0e6113b0565b47811115610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890612d77565b60405180910390fd5b60095447610b5f9190612d97565b811115610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890612e3d565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610be7573d6000803e3d6000fd5b508060036000828254610bfa9190612520565b925050819055505050565b610c0d611e8f565b6000600d60008681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90612ecf565b60405180910390fd5b6000349050610ccc818a8a8a8a8a8a8a611edf565b60008060288a11610d3457603f7e010410410410410410410410410410410410410410410410410410410410417920000000001000000000080000000004000000000200000000018d610d1f9190612a62565b16610d2a9190612f1e565b91508a9050610d87565b60008b118015610d445750898b11155b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90612fc1565b60405180910390fd5b8a91505b6000610d95848c858b6121da565b905060085484610da59190612520565b811115610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde9061302d565b60405180910390fd5b4781600954610df69190612520565b1115610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e906130bf565b60405180910390fd5b8060096000828254610e499190612520565b925050819055508385600001600001819055508a8560000160010160006101000a81548160ff021916908360ff160217905550828560020160006101000a81548160ff021916908360ff160217905550818560020160016101000a81548164ffffffffff021916908364ffffffffff160217905550438560030181905550338560040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008560040160146101000a81548160ff021916908315150217905550600085600501819055506000856006018190555060008560070181905550600085600801819055508885600901819055508785600a0160006101000a81548160ff021916908315150217905550610fa78560040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858d86868e8e6122d0565b5050505050610fb4612333565b50505050505050565b60075481565b610fcb6113b0565b60018110158015610fdd575060648111155b61101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390613151565b60405180910390fd5b80600c8190555050565b600a5481565b60095481565b61103a611e8f565b6000600d60008381526020019081526020016000209050600081600001600001549050600082600a0160009054906101000a900460ff169050600082116110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad906131bd565b60405180910390fd5b600015158360040160149054906101000a900460ff1615151461110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590613229565b60405180910390fd5b61a8c083600301546111209190612520565b4311611161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611158906132bb565b60405180910390fd5b600061119a838560000160010160009054906101000a900460ff1660ff168660020160009054906101000a900460ff1660ff16856121da565b905080600960008282546111ae9190612d97565b9250508190555060018460040160146101000a81548160ff0219169083151502179055508284600601819055508360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611245573d6000803e3d6000fd5b508360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f95a7aa5c378b3f64e4945d7b72f659200d9fa121b2fabc0a521125f46267ab22846040516112b09190612585565b60405180910390a2505050506112c4612333565b50565b6112cf6113b0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561133f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113369061334d565b60405180910390fd5b6113488161142e565b50565b60065481565b6113596113b0565b6a295be96e6406697200000081106113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d906133b9565b60405180910390fd5b8060088190555050565b6113b861233c565b73ffffffffffffffffffffffffffffffffffffffff166113d6610958565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613425565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000813560001a905060f781101561153f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611536906134b7565b60405180910390fd5b60f68161154c9190612d97565b826115579190612520565b91506000823560001a9050607f811161157e576001836115779190612520565b92506115ea565b60808110158015611590575060b78111155b6115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690613523565b60405180910390fd5b607f816115dc9190612d97565b836115e79190612520565b92505b6000833560001a905060b98114611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906135db565b60405180910390fd5b6003846116439190612520565b93506000843560001a905060f98114611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116889061366d565b60405180910390fd5b60038561169e9190612520565b94506000853560001a9050600181146116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e3906136d9565b60405180910390fd5b6001866116f99190612520565b95506000863560001a9050607f8111611720576001876117199190612520565b965061178c565b60808110158015611732575060b78111155b611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613745565b60405180910390fd5b607f8161177e9190612d97565b876117899190612520565b96505b6000873560001a905060b981146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf906137d7565b60405180910390fd5b610103886117e69190612520565b97506000883560001a905060f88114611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613869565b60405180910390fd5b6002896118419190612520565b98506000893560001a905060f8811461188f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611886906138fb565b60405180910390fd5b60028a61189c9190612520565b995060008a3560001a9050609481146118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190613967565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff600b8d03351690503073ffffffffffffffffffffffffffffffffffffffff16811461192b57600080fd5b505050505050505050505050565b600080600060405190506000806000805b61ffff601e890335169250600083141561196357611a39565b61ffff601c8903351691508260208361197c9190612520565b11156119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b4906139d3565b60405180910390fd5b6004886119ca9190612520565b975081880135905060008114611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90613a3f565b60405180910390fd5b82888637888286015282852098508293508288611a329190612520565b975061194a565b8860001b955060008486611a4d9190612520565b9050600061ffff601c8b0335169050600061ffff601a8c0335169050818782611a769190612520565b1115611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae906139d3565b60405180910390fd5b60068b611ac49190612520565b9a50818b8437611ae08184611ad99190612520565b8989612344565b8183209b50818b611af19190612520565b9a5061ffff601e8c033516955061ffff601c8c033516945085602086611b179190612520565b1115611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f906139d3565b60405180910390fd5b60048b611b659190612520565b9a50848b0135935060008414611bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba790613a3f565b60405180910390fd5b858b89378b85890152858820995050505050505050509250929050565b60008360000160000154905060008111611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906131bd565b60405180910390fd5b600015158460040160149054906101000a900460ff16151514611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b90613aab565b60405180910390fd5b60008460000160010160009054906101000a900460ff1660ff16905060008560020160009054906101000a900460ff1660ff16905060008660040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600087600a0160009054906101000a900460ff16905060008787604051602001611cfd929190613aec565b6040516020818303038152906040528051906020012090506000858260001c611d269190612f1e565b90506000611d36888888876121da565b9050600060288811611d7d5760008c60020160019054906101000a900464ffffffffff1664ffffffffff16846002611d6e9190613c4b565b1614611d78578190505b611da2565b8415611d945786831115611d8f578190505b611da1565b86831015611da0578190505b5b5b8160096000828254611db49190612d97565b9250508190555060018c60040160146101000a81548160ff021916908315150217905550808c600601819055508360001c8c60080181905550828c6005018190555060008c600701541480611e1057508b600601548c60070154115b15611e1f57808c600701819055505b60008c600701541115611e78578573ffffffffffffffffffffffffffffffffffffffff166108fc8d600701549081150290604051600060405180830381858888f19350505050158015611e76573d6000803e3d6000fd5b505b611e818c6123c3565b505050505050505050505050565b60026001541415611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc90613ce2565b60405180910390fd5b6002600181905550565b600186118015611ef0575060648611155b611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2690613d4e565b60405180910390fd5b6006548810158015611f4357506007548811155b611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990613de0565b60405180910390fd5b600087118015611f9e575060286002611f9b9190613c4b565b87105b611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd490613e4c565b60405180910390fd5b84431115612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790613eb8565b60405180910390fd5b6000878787878760405160200161203b959493929190613f20565b604051602081830303815290604052805190602001209050600181601b8585604051600081526020016040526040516120779493929190613fd3565b6020604051602081039080840390855afa158015612099573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff166120c1610958565b73ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e90614064565b60405180910390fd5b60288711156121cf57831561217c57600a5488101580156121385750868811155b612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e9061411c565b60405180910390fd5b6121ce565b60008811801561218e5750600b548811155b6121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c4906141d4565b60405180910390fd5b5b5b505050505050505050565b60008260001080156121ec5750838311155b61222b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222290614240565b60405180910390fd5b60006064612238876124c3565b600c546122459190612520565b876122509190612a62565b61225a9190614260565b9050600084905060648614801561226e5750835b15612283578460646122809190612d97565b90505b808683896122919190612d97565b61229b9190612a62565b6122a59190614260565b92506000600854886122b79190612520565b9050808411156122c5578093505b505050949350505050565b8460ff168773ffffffffffffffffffffffffffffffffffffffff167fe49dc342a2664c9376180e6cd7e3e53ba5d52541c470911b4b8f8a2fcb1b2c618887878787604051612322959493929190614291565b60405180910390a350505050505050565b60018081905550565b600033905090565b5b60208110612383578151835260208361235e9190612520565b925060208261236d9190612520565b915060208161237c9190612d97565b9050612345565b600060018260206123949190612d97565b6101006123a19190613c4b565b6123ab9190612d97565b90508019835116818551168181178652505050505050565b60008160000160000154905060008260050154905060008360060154905060008460070154905060008560000160010160009054906101000a900460ff1660ff16905060008660020160009054906101000a900460ff1660ff16905060008760040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508260ff168173ffffffffffffffffffffffffffffffffffffffff167f6e66a5f78adb6dee2af6a518dc7a979c4ed4794fa1056b8bf6ac19280e81d19489858c60020160019054906101000a900464ffffffffff168b8b8b6040516124b1969594939291906142e4565b60405180910390a35050505050505050565b6000600554600454836124d69190614260565b6124e09190612a62565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061252b826124e7565b9150612536836124e7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561256b5761256a6124f1565b5b828201905092915050565b61257f816124e7565b82525050565b600060208201905061259a6000830184612576565b92915050565b600080fd5b6125ae816124e7565b81146125b957600080fd5b50565b6000813590506125cb816125a5565b92915050565b6000602082840312156125e7576125e66125a0565b5b60006125f5848285016125bc565b91505092915050565b612607816124e7565b82525050565b600060ff82169050919050565b6126238161260d565b82525050565b60408201600082015161263f60008501826125fe565b506020820151612652602085018261261a565b50505050565b6126618161260d565b82525050565b600064ffffffffff82169050919050565b61268181612667565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126b282612687565b9050919050565b6126c2816126a7565b82525050565b60008115159050919050565b6126dd816126c8565b82525050565b60006101a0820190506126f9600083018f612629565b612706604083018e612658565b612713606083018d612678565b612720608083018c612576565b61272d60a083018b6126b9565b61273a60c083018a6126d4565b61274760e0830189612576565b612755610100830188612576565b612763610120830187612576565b612771610140830186612576565b61277f610160830185612576565b61278d6101808301846126d4565b9d9c50505050505050505050505050565b6127a781612667565b81146127b257600080fd5b50565b6000813590506127c48161279e565b92915050565b600080604083850312156127e1576127e06125a0565b5b60006127ef858286016125bc565b9250506020612800858286016127b5565b9150509250929050565b600061281582612687565b9050919050565b6128258161280a565b82525050565b6000602082019050612840600083018461281c565b92915050565b6000819050919050565b61285981612846565b811461286457600080fd5b50565b60008135905061287681612850565b92915050565b600080600060608486031215612895576128946125a0565b5b60006128a3868287016125bc565b93505060206128b486828701612867565b92505060406128c5868287016125bc565b9150509250925092565b6128d8816126a7565b81146128e357600080fd5b50565b6000813590506128f5816128cf565b92915050565b60008060408385031215612912576129116125a0565b5b6000612920858286016128e6565b9250506020612931858286016125bc565b9150509250929050565b612944816126c8565b811461294f57600080fd5b50565b6000813590506129618161293b565b92915050565b600080600080600080600060e0888a031215612986576129856125a0565b5b60006129948a828b016125bc565b97505060206129a58a828b016125bc565b96505060406129b68a828b016125bc565b95505060606129c78a828b016125bc565b94505060806129d88a828b01612952565b93505060a06129e98a828b01612867565b92505060c06129fa8a828b01612867565b91505092959891949750929550565b612a128161280a565b8114612a1d57600080fd5b50565b600081359050612a2f81612a09565b92915050565b600060208284031215612a4b57612a4a6125a0565b5b6000612a5984828501612a20565b91505092915050565b6000612a6d826124e7565b9150612a78836124e7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ab157612ab06124f1565b5b828202905092915050565b6000819050919050565b612ad7612ad2826124e7565b612abc565b82525050565b6000612ae98284612ac6565b60208201915081905092915050565b600082825260208201905092915050565b7f426c6f636b686173682063616e2774206265207175657269656420627920455660008201527f4d2e000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b65602283612af8565b9150612b7082612b09565b604082019050919050565b60006020820190508181036000830152612b9481612b58565b9050919050565b7f6d6178426574416d6f756e74206d75737420626520612073616e65206e756d6260008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000612bf7602283612af8565b9150612c0282612b9b565b604082019050919050565b60006020820190508181036000830152612c2681612bea565b9050919050565b7f4265742073686f756c6420626520696e20612027626574272073746174652e00600082015250565b6000612c63601f83612af8565b9150612c6e82612c2d565b602082019050919050565b60006020820190508181036000830152612c9281612c56565b9050919050565b7f736574746c65426574206265666f726520706c61636542657400000000000000600082015250565b6000612ccf601983612af8565b9150612cda82612c99565b602082019050919050565b60006020820190508181036000830152612cfe81612cc2565b9050919050565b7f5769746864726177616c20616d6f756e74206c6172676572207468616e20626160008201527f6c616e63652e0000000000000000000000000000000000000000000000000000602082015250565b6000612d61602683612af8565b9150612d6c82612d05565b604082019050919050565b60006020820190508181036000830152612d9081612d54565b9050919050565b6000612da2826124e7565b9150612dad836124e7565b925082821015612dc057612dbf6124f1565b5b828203905092915050565b7f5769746864726177616c20616d6f756e74206c6172676572207468616e20626160008201527f6c616e6365206d696e7573206c6f636b6564496e426574730000000000000000602082015250565b6000612e27603883612af8565b9150612e3282612dcb565b604082019050919050565b60006020820190508181036000830152612e5681612e1a565b9050919050565b7f4265742073686f756c6420626520696e20612027636c65616e2720737461746560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000612eb9602183612af8565b9150612ec482612e5d565b604082019050919050565b60006020820190508181036000830152612ee881612eac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f29826124e7565b9150612f34836124e7565b925082612f4457612f43612eef565b5b828206905092915050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676560008201527f72207468616e206d6f64756c6f2e000000000000000000000000000000000000602082015250565b6000612fab602e83612af8565b9150612fb682612f4f565b604082019050919050565b60006020820190508181036000830152612fda81612f9e565b9050919050565b7f6d617850726f666974206c696d69742076696f6c6174696f6e2e000000000000600082015250565b6000613017601a83612af8565b915061302282612fe1565b602082019050919050565b600060208201905081810360008301526130468161300a565b9050919050565b7f556e61626c6520746f20616363657074206265742064756520746f20696e737560008201527f6666696369656e742066756e6473000000000000000000000000000000000000602082015250565b60006130a9602e83612af8565b91506130b48261304d565b604082019050919050565b600060208201905081810360008301526130d88161309c565b9050919050565b7f686f7573654564676550657263656e74206d75737420626520612073616e652060008201527f6e756d6265720000000000000000000000000000000000000000000000000000602082015250565b600061313b602683612af8565b9150613146826130df565b604082019050919050565b6000602082019050818103600083015261316a8161312e565b9050919050565b7f42657420646f6573206e6f742065786973742e00000000000000000000000000600082015250565b60006131a7601383612af8565b91506131b282613171565b602082019050919050565b600060208201905081810360008301526131d68161319a565b9050919050565b7f42657420697320736574746c656420616c72656164792e000000000000000000600082015250565b6000613213601783612af8565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b9050919050565b7f5761697420616674657220706c6163696e6720626574206265666f726520726560008201527f7175657374696e6720726566756e642e00000000000000000000000000000000602082015250565b60006132a5603083612af8565b91506132b082613249565b604082019050919050565b600060208201905081810360008301526132d481613298565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613337602683612af8565b9150613342826132db565b604082019050919050565b600060208201905081810360008301526133668161332a565b9050919050565b7f6d617850726f666974206d75737420626520612073616e65206e756d62657200600082015250565b60006133a3601f83612af8565b91506133ae8261336d565b602082019050919050565b600060208201905081810360008301526133d281613396565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061340f602083612af8565b915061341a826133d9565b602082019050919050565b6000602082019050818103600083015261343e81613402565b9050919050565b7f52656365697074206c656166206c6f6e676572207468616e203535206279746560008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b60006134a1602283612af8565b91506134ac82613445565b604082019050919050565b600060208201905081810360008301526134d081613494565b9050919050565b7f5061746820697320616e20524c5020737472696e672e00000000000000000000600082015250565b600061350d601683612af8565b9150613518826134d7565b602082019050919050565b6000602082019050818103600083015261353c81613500565b9050919050565b7f5265636569707420737472696e6720697320616c77617973206174206c65617360008201527f7420323536206279746573206c6f6e672c20627574206c657373207468616e2060208201527f36346b2e00000000000000000000000000000000000000000000000000000000604082015250565b60006135c5604483612af8565b91506135d082613543565b606082019050919050565b600060208201905081810360008301526135f4816135b8565b9050919050565b7f5265636569707420697320616c77617973206174206c6561737420323536206260008201527f79746573206c6f6e672c20627574206c657373207468616e2036346b2e000000602082015250565b6000613657603d83612af8565b9150613662826135fb565b604082019050919050565b600060208201905081810360008301526136868161364a565b9050919050565b7f5374617475732073686f756c6420626520737563636573732e00000000000000600082015250565b60006136c3601983612af8565b91506136ce8261368d565b602082019050919050565b600060208201905081810360008301526136f2816136b6565b9050919050565b7f43756d756c61746976652067617320697320616e20524c5020737472696e672e600082015250565b600061372f602083612af8565b915061373a826136f9565b602082019050919050565b6000602082019050818103600083015261375e81613722565b9050919050565b7f426c6f6f6d2066696c74657220697320616c776179732032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b60006137c1602683612af8565b91506137cc82613765565b604082019050919050565b600060208201905081810360008301526137f0816137b4565b9050919050565b7f4c6f6773206c697374206973206c657373207468616e2032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b6000613853602683612af8565b915061385e826137f7565b604082019050919050565b6000602082019050818103600083015261388281613846565b9050919050565b7f4c6f6720656e747279206973206c657373207468616e2032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b60006138e5602683612af8565b91506138f082613889565b604082019050919050565b60006020820190508181036000830152613914816138d8565b9050919050565b7f41646472657373206973203230206279746573206c6f6e672e00000000000000600082015250565b6000613951601983612af8565b915061395c8261391b565b602082019050919050565b6000602082019050818103600083015261398081613944565b9050919050565b7f536869667420626f756e647320636865636b2e00000000000000000000000000600082015250565b60006139bd601383612af8565b91506139c882613987565b602082019050919050565b600060208201905081810360008301526139ec816139b0565b9050919050565b7f4e6f6e2d656d707479206861736820736c6f742e000000000000000000000000600082015250565b6000613a29601483612af8565b9150613a34826139f3565b602082019050919050565b60006020820190508181036000830152613a5881613a1c565b9050919050565b7f42657420697320736574746c656420616c726561647900000000000000000000600082015250565b6000613a95601683612af8565b9150613aa082613a5f565b602082019050919050565b60006020820190508181036000830152613ac481613a88565b9050919050565b6000819050919050565b613ae6613ae182612846565b613acb565b82525050565b6000613af88285612ac6565b602082019150613b088284613ad5565b6020820191508190509392505050565b60008160011c9050919050565b6000808291508390505b6001851115613b6f57808604811115613b4b57613b4a6124f1565b5b6001851615613b5a5780820291505b8081029050613b6885613b18565b9450613b2f565b94509492505050565b600082613b885760019050613c44565b81613b965760009050613c44565b8160018114613bac5760028114613bb657613be5565b6001915050613c44565b60ff841115613bc857613bc76124f1565b5b8360020a915084821115613bdf57613bde6124f1565b5b50613c44565b5060208310610133831016604e8410600b8410161715613c1a5782820a905083811115613c1557613c146124f1565b5b613c44565b613c278484846001613b25565b92509050818404811115613c3e57613c3d6124f1565b5b81810290505b9392505050565b6000613c56826124e7565b9150613c61836124e7565b9250613c8e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613b78565b905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613ccc601f83612af8565b9150613cd782613c96565b602082019050919050565b60006020820190508181036000830152613cfb81613cbf565b9050919050565b7f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000600082015250565b6000613d38601e83612af8565b9150613d4382613d02565b602082019050919050565b60006020820190508181036000830152613d6781613d2b565b9050919050565b7f42657420616d6f756e742073686f756c642062652077697468696e2072616e6760008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dca602283612af8565b9150613dd582613d6e565b604082019050919050565b60006020820190508181036000830152613df981613dbd565b9050919050565b7f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000600082015250565b6000613e36601c83612af8565b9150613e4182613e00565b602082019050919050565b60006020820190508181036000830152613e6581613e29565b9050919050565b7f436f6d6d69742068617320657870697265642e00000000000000000000000000600082015250565b6000613ea2601383612af8565b9150613ead82613e6c565b602082019050919050565b60006020820190508181036000830152613ed181613e95565b9050919050565b60008160f81b9050919050565b6000613ef082613ed8565b9050919050565b6000613f0282613ee5565b9050919050565b613f1a613f15826126c8565b613ef7565b82525050565b6000613f2c8288612ac6565b602082019150613f3c8287612ac6565b602082019150613f4c8286612ac6565b602082019150613f5c8285612ac6565b602082019150613f6c8284613f09565b6001820191508190509695505050505050565b613f8881612846565b82525050565b6000819050919050565b6000819050919050565b6000613fbd613fb8613fb384613f8e565b613f98565b61260d565b9050919050565b613fcd81613fa2565b82525050565b6000608082019050613fe86000830187613f7f565b613ff56020830186613fc4565b6140026040830185613f7f565b61400f6060830184613f7f565b95945050505050565b7f4543445341207369676e6174757265206973206e6f742076616c69642e000000600082015250565b600061404e601d83612af8565b915061405982614018565b602082019050919050565b6000602082019050818103600083015261407d81614041565b9050919050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206d7573742060008201527f6c6172676572207468616e206d696e696d756d206c617267657220636f6d706160208201527f7269736f6e2076616c75652e0000000000000000000000000000000000000000604082015250565b6000614106604c83612af8565b915061411182614084565b606082019050919050565b60006020820190508181036000830152614135816140f9565b9050919050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206d7573742060008201527f736d616c6c6572207468616e206d6178696d756d20736d616c6c657220636f6d60208201527f70617269736f6e2076616c75652e000000000000000000000000000000000000604082015250565b60006141be604e83612af8565b91506141c98261413c565b606082019050919050565b600060208201905081810360008301526141ed816141b1565b9050919050565b7f57696e2070726f626162696c697479206f7574206f662072616e67652e000000600082015250565b600061422a601d83612af8565b9150614235826141f4565b602082019050919050565b600060208201905081810360008301526142598161421d565b9050919050565b600061426b826124e7565b9150614276836124e7565b92508261428657614285612eef565b5b828204905092915050565b600060a0820190506142a66000830188612576565b6142b36020830187612658565b6142c06040830186612678565b6142cd6060830185612576565b6142da60808301846126d4565b9695505050505050565b600060c0820190506142f96000830189612576565b6143066020830188612658565b6143136040830187612678565b6143206060830186612576565b61432d6080830185612576565b61433a60a0830184612576565b97965050505050505056fea2646970667358221220209146505a33f37184ebe6312ec5cd3770a8875735c5c0e052f5aee7126a475764736f6c634300080c0033
Deployed Bytecode
0x6080604052600436106101c65760003560e01c80638eb12c20116100f7578063cab11d5d11610095578063e1fdb4b411610064578063e1fdb4b41461061a578063f2fde38b14610636578063fa968eea1461065f578063fbd668a91461068a576101e6565b8063cab11d5d14610570578063cf96ce031461059b578063d98e6ae6146105c4578063df88126f146105ef576101e6565b8063b539cd55116100d1578063b539cd55146104d7578063bd7fd78d14610502578063c10753291461052b578063c6d1d5aa14610554576101e6565b80638eb12c201461045c5780638fedadf114610485578063af3dc07f146104ae576101e6565b806370d8c5781161016457806374e048d51161013e57806374e048d5146103b657806377010f70146103df5780637cfbc7a5146104085780638da5cb5b14610431576101e6565b806370d8c57814610349578063715018a61461037457806372318cf91461038b576101e6565b80631f9d3a2b116101a05780631f9d3a2b1461028257806322af00fa146102ad578063386d5fe6146102f55780636c18859314610320576101e6565b80630c531f271461020157806312065fe01461022c578063177c55c814610257576101e6565b366101e65734600260008282546101dd9190612520565b92505081905550005b34600260008282546101f89190612520565b92505081905550005b34801561020d57600080fd5b506102166106b3565b6040516102239190612585565b60405180910390f35b34801561023857600080fd5b506102416106b9565b60405161024e9190612585565b60405180910390f35b34801561026357600080fd5b5061026c6106c1565b6040516102799190612585565b60405180910390f35b34801561028e57600080fd5b506102976106c7565b6040516102a49190612585565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf91906125d1565b6106cd565b6040516102ec9c9b9a999897969594939291906126e3565b60405180910390f35b34801561030157600080fd5b5061030a6107b6565b6040516103179190612585565b60405180910390f35b34801561032c57600080fd5b50610347600480360381019061034291906125d1565b6107bc565b005b34801561035557600080fd5b5061035e6107dd565b60405161036b9190612585565b60405180910390f35b34801561038057600080fd5b506103896107e3565b005b34801561039757600080fd5b506103a06107f7565b6040516103ad9190612585565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d891906127ca565b6107fd565b005b3480156103eb57600080fd5b50610406600480360381019061040191906125d1565b6108e7565b005b34801561041457600080fd5b5061042f600480360381019061042a91906125d1565b6108f9565b005b34801561043d57600080fd5b50610446610958565b604051610453919061282b565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e919061287c565b610981565b005b34801561049157600080fd5b506104ac60048036038101906104a791906125d1565b610aca565b005b3480156104ba57600080fd5b506104d560048036038101906104d091906125d1565b610adc565b005b3480156104e357600080fd5b506104ec610aee565b6040516104f99190612585565b60405180910390f35b34801561050e57600080fd5b50610529600480360381019061052491906125d1565b610af4565b005b34801561053757600080fd5b50610552600480360381019061054d91906128fb565b610b06565b005b61056e60048036038101906105699190612967565b610c05565b005b34801561057c57600080fd5b50610585610fbd565b6040516105929190612585565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd91906125d1565b610fc3565b005b3480156105d057600080fd5b506105d9611026565b6040516105e69190612585565b60405180910390f35b3480156105fb57600080fd5b5061060461102c565b6040516106119190612585565b60405180910390f35b610634600480360381019061062f91906125d1565b611032565b005b34801561064257600080fd5b5061065d60048036038101906106589190612a35565b6112c7565b005b34801561066b57600080fd5b5061067461134b565b6040516106819190612585565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac91906125d1565b611351565b005b60025481565b600047905090565b600b5481565b600c5481565b600d60205280600052604060002060009150905080600001604051806040016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff1681525050908060020160009054906101000a900460ff16908060020160019054906101000a900464ffffffffff16908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160149054906101000a900460ff169080600501549080600601549080600701549080600801549080600901549080600a0160009054906101000a900460ff1690508c565b60055481565b6107c46113b0565b633b9aca00816107d49190612a62565b60068190555050565b60045481565b6107eb6113b0565b6107f5600061142e565b565b60035481565b6108056113b0565b6000826040516020016108189190612add565b6040516020818303038152906040528051906020012060001c90506000600d6000838152602001908152602001600020905060fa8364ffffffffff1661085e9190612520565b4311156108a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089790612b7b565b60405180910390fd5b6108aa60486114f2565b6000806108b8846044611939565b8092508193505050818564ffffffffff1640146108d457600080fd5b6108df838783611bcd565b505050505050565b6108ef6113b0565b80600b8190555050565b6109016113b0565b6a0422ca8b0a00a425000000811061094e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094590612c0d565b60405180910390fd5b8060078190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6109896113b0565b60008360405160200161099c9190612add565b6040516020818303038152906040528051906020012060001c90506000600d60008381526020019081526020016000209050600081600301549050600073ffffffffffffffffffffffffffffffffffffffff168260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290612c79565b60405180910390fd5b80431015610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa590612ce5565b60405180910390fd5b838260070181905550610ac2828787611bcd565b505050505050565b610ad26113b0565b80600a8190555050565b610ae46113b0565b8060048190555050565b60085481565b610afc6113b0565b8060058190555050565b610b0e6113b0565b47811115610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890612d77565b60405180910390fd5b60095447610b5f9190612d97565b811115610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890612e3d565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610be7573d6000803e3d6000fd5b508060036000828254610bfa9190612520565b925050819055505050565b610c0d611e8f565b6000600d60008681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90612ecf565b60405180910390fd5b6000349050610ccc818a8a8a8a8a8a8a611edf565b60008060288a11610d3457603f7e010410410410410410410410410410410410410410410410410410410410417920000000001000000000080000000004000000000200000000018d610d1f9190612a62565b16610d2a9190612f1e565b91508a9050610d87565b60008b118015610d445750898b11155b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90612fc1565b60405180910390fd5b8a91505b6000610d95848c858b6121da565b905060085484610da59190612520565b811115610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde9061302d565b60405180910390fd5b4781600954610df69190612520565b1115610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e906130bf565b60405180910390fd5b8060096000828254610e499190612520565b925050819055508385600001600001819055508a8560000160010160006101000a81548160ff021916908360ff160217905550828560020160006101000a81548160ff021916908360ff160217905550818560020160016101000a81548164ffffffffff021916908364ffffffffff160217905550438560030181905550338560040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008560040160146101000a81548160ff021916908315150217905550600085600501819055506000856006018190555060008560070181905550600085600801819055508885600901819055508785600a0160006101000a81548160ff021916908315150217905550610fa78560040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858d86868e8e6122d0565b5050505050610fb4612333565b50505050505050565b60075481565b610fcb6113b0565b60018110158015610fdd575060648111155b61101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390613151565b60405180910390fd5b80600c8190555050565b600a5481565b60095481565b61103a611e8f565b6000600d60008381526020019081526020016000209050600081600001600001549050600082600a0160009054906101000a900460ff169050600082116110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad906131bd565b60405180910390fd5b600015158360040160149054906101000a900460ff1615151461110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590613229565b60405180910390fd5b61a8c083600301546111209190612520565b4311611161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611158906132bb565b60405180910390fd5b600061119a838560000160010160009054906101000a900460ff1660ff168660020160009054906101000a900460ff1660ff16856121da565b905080600960008282546111ae9190612d97565b9250508190555060018460040160146101000a81548160ff0219169083151502179055508284600601819055508360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611245573d6000803e3d6000fd5b508360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f95a7aa5c378b3f64e4945d7b72f659200d9fa121b2fabc0a521125f46267ab22846040516112b09190612585565b60405180910390a2505050506112c4612333565b50565b6112cf6113b0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561133f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113369061334d565b60405180910390fd5b6113488161142e565b50565b60065481565b6113596113b0565b6a295be96e6406697200000081106113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d906133b9565b60405180910390fd5b8060088190555050565b6113b861233c565b73ffffffffffffffffffffffffffffffffffffffff166113d6610958565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613425565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000813560001a905060f781101561153f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611536906134b7565b60405180910390fd5b60f68161154c9190612d97565b826115579190612520565b91506000823560001a9050607f811161157e576001836115779190612520565b92506115ea565b60808110158015611590575060b78111155b6115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690613523565b60405180910390fd5b607f816115dc9190612d97565b836115e79190612520565b92505b6000833560001a905060b98114611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906135db565b60405180910390fd5b6003846116439190612520565b93506000843560001a905060f98114611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116889061366d565b60405180910390fd5b60038561169e9190612520565b94506000853560001a9050600181146116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e3906136d9565b60405180910390fd5b6001866116f99190612520565b95506000863560001a9050607f8111611720576001876117199190612520565b965061178c565b60808110158015611732575060b78111155b611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613745565b60405180910390fd5b607f8161177e9190612d97565b876117899190612520565b96505b6000873560001a905060b981146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf906137d7565b60405180910390fd5b610103886117e69190612520565b97506000883560001a905060f88114611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613869565b60405180910390fd5b6002896118419190612520565b98506000893560001a905060f8811461188f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611886906138fb565b60405180910390fd5b60028a61189c9190612520565b995060008a3560001a9050609481146118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190613967565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff600b8d03351690503073ffffffffffffffffffffffffffffffffffffffff16811461192b57600080fd5b505050505050505050505050565b600080600060405190506000806000805b61ffff601e890335169250600083141561196357611a39565b61ffff601c8903351691508260208361197c9190612520565b11156119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b4906139d3565b60405180910390fd5b6004886119ca9190612520565b975081880135905060008114611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90613a3f565b60405180910390fd5b82888637888286015282852098508293508288611a329190612520565b975061194a565b8860001b955060008486611a4d9190612520565b9050600061ffff601c8b0335169050600061ffff601a8c0335169050818782611a769190612520565b1115611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae906139d3565b60405180910390fd5b60068b611ac49190612520565b9a50818b8437611ae08184611ad99190612520565b8989612344565b8183209b50818b611af19190612520565b9a5061ffff601e8c033516955061ffff601c8c033516945085602086611b179190612520565b1115611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f906139d3565b60405180910390fd5b60048b611b659190612520565b9a50848b0135935060008414611bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba790613a3f565b60405180910390fd5b858b89378b85890152858820995050505050505050509250929050565b60008360000160000154905060008111611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906131bd565b60405180910390fd5b600015158460040160149054906101000a900460ff16151514611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b90613aab565b60405180910390fd5b60008460000160010160009054906101000a900460ff1660ff16905060008560020160009054906101000a900460ff1660ff16905060008660040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600087600a0160009054906101000a900460ff16905060008787604051602001611cfd929190613aec565b6040516020818303038152906040528051906020012090506000858260001c611d269190612f1e565b90506000611d36888888876121da565b9050600060288811611d7d5760008c60020160019054906101000a900464ffffffffff1664ffffffffff16846002611d6e9190613c4b565b1614611d78578190505b611da2565b8415611d945786831115611d8f578190505b611da1565b86831015611da0578190505b5b5b8160096000828254611db49190612d97565b9250508190555060018c60040160146101000a81548160ff021916908315150217905550808c600601819055508360001c8c60080181905550828c6005018190555060008c600701541480611e1057508b600601548c60070154115b15611e1f57808c600701819055505b60008c600701541115611e78578573ffffffffffffffffffffffffffffffffffffffff166108fc8d600701549081150290604051600060405180830381858888f19350505050158015611e76573d6000803e3d6000fd5b505b611e818c6123c3565b505050505050505050505050565b60026001541415611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc90613ce2565b60405180910390fd5b6002600181905550565b600186118015611ef0575060648611155b611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2690613d4e565b60405180910390fd5b6006548810158015611f4357506007548811155b611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990613de0565b60405180910390fd5b600087118015611f9e575060286002611f9b9190613c4b565b87105b611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd490613e4c565b60405180910390fd5b84431115612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790613eb8565b60405180910390fd5b6000878787878760405160200161203b959493929190613f20565b604051602081830303815290604052805190602001209050600181601b8585604051600081526020016040526040516120779493929190613fd3565b6020604051602081039080840390855afa158015612099573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff166120c1610958565b73ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e90614064565b60405180910390fd5b60288711156121cf57831561217c57600a5488101580156121385750868811155b612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e9061411c565b60405180910390fd5b6121ce565b60008811801561218e5750600b548811155b6121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c4906141d4565b60405180910390fd5b5b5b505050505050505050565b60008260001080156121ec5750838311155b61222b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222290614240565b60405180910390fd5b60006064612238876124c3565b600c546122459190612520565b876122509190612a62565b61225a9190614260565b9050600084905060648614801561226e5750835b15612283578460646122809190612d97565b90505b808683896122919190612d97565b61229b9190612a62565b6122a59190614260565b92506000600854886122b79190612520565b9050808411156122c5578093505b505050949350505050565b8460ff168773ffffffffffffffffffffffffffffffffffffffff167fe49dc342a2664c9376180e6cd7e3e53ba5d52541c470911b4b8f8a2fcb1b2c618887878787604051612322959493929190614291565b60405180910390a350505050505050565b60018081905550565b600033905090565b5b60208110612383578151835260208361235e9190612520565b925060208261236d9190612520565b915060208161237c9190612d97565b9050612345565b600060018260206123949190612d97565b6101006123a19190613c4b565b6123ab9190612d97565b90508019835116818551168181178652505050505050565b60008160000160000154905060008260050154905060008360060154905060008460070154905060008560000160010160009054906101000a900460ff1660ff16905060008660020160009054906101000a900460ff1660ff16905060008760040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508260ff168173ffffffffffffffffffffffffffffffffffffffff167f6e66a5f78adb6dee2af6a518dc7a979c4ed4794fa1056b8bf6ac19280e81d19489858c60020160019054906101000a900464ffffffffff168b8b8b6040516124b1969594939291906142e4565b60405180910390a35050505050505050565b6000600554600454836124d69190614260565b6124e09190612a62565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061252b826124e7565b9150612536836124e7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561256b5761256a6124f1565b5b828201905092915050565b61257f816124e7565b82525050565b600060208201905061259a6000830184612576565b92915050565b600080fd5b6125ae816124e7565b81146125b957600080fd5b50565b6000813590506125cb816125a5565b92915050565b6000602082840312156125e7576125e66125a0565b5b60006125f5848285016125bc565b91505092915050565b612607816124e7565b82525050565b600060ff82169050919050565b6126238161260d565b82525050565b60408201600082015161263f60008501826125fe565b506020820151612652602085018261261a565b50505050565b6126618161260d565b82525050565b600064ffffffffff82169050919050565b61268181612667565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126b282612687565b9050919050565b6126c2816126a7565b82525050565b60008115159050919050565b6126dd816126c8565b82525050565b60006101a0820190506126f9600083018f612629565b612706604083018e612658565b612713606083018d612678565b612720608083018c612576565b61272d60a083018b6126b9565b61273a60c083018a6126d4565b61274760e0830189612576565b612755610100830188612576565b612763610120830187612576565b612771610140830186612576565b61277f610160830185612576565b61278d6101808301846126d4565b9d9c50505050505050505050505050565b6127a781612667565b81146127b257600080fd5b50565b6000813590506127c48161279e565b92915050565b600080604083850312156127e1576127e06125a0565b5b60006127ef858286016125bc565b9250506020612800858286016127b5565b9150509250929050565b600061281582612687565b9050919050565b6128258161280a565b82525050565b6000602082019050612840600083018461281c565b92915050565b6000819050919050565b61285981612846565b811461286457600080fd5b50565b60008135905061287681612850565b92915050565b600080600060608486031215612895576128946125a0565b5b60006128a3868287016125bc565b93505060206128b486828701612867565b92505060406128c5868287016125bc565b9150509250925092565b6128d8816126a7565b81146128e357600080fd5b50565b6000813590506128f5816128cf565b92915050565b60008060408385031215612912576129116125a0565b5b6000612920858286016128e6565b9250506020612931858286016125bc565b9150509250929050565b612944816126c8565b811461294f57600080fd5b50565b6000813590506129618161293b565b92915050565b600080600080600080600060e0888a031215612986576129856125a0565b5b60006129948a828b016125bc565b97505060206129a58a828b016125bc565b96505060406129b68a828b016125bc565b95505060606129c78a828b016125bc565b94505060806129d88a828b01612952565b93505060a06129e98a828b01612867565b92505060c06129fa8a828b01612867565b91505092959891949750929550565b612a128161280a565b8114612a1d57600080fd5b50565b600081359050612a2f81612a09565b92915050565b600060208284031215612a4b57612a4a6125a0565b5b6000612a5984828501612a20565b91505092915050565b6000612a6d826124e7565b9150612a78836124e7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ab157612ab06124f1565b5b828202905092915050565b6000819050919050565b612ad7612ad2826124e7565b612abc565b82525050565b6000612ae98284612ac6565b60208201915081905092915050565b600082825260208201905092915050565b7f426c6f636b686173682063616e2774206265207175657269656420627920455660008201527f4d2e000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b65602283612af8565b9150612b7082612b09565b604082019050919050565b60006020820190508181036000830152612b9481612b58565b9050919050565b7f6d6178426574416d6f756e74206d75737420626520612073616e65206e756d6260008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000612bf7602283612af8565b9150612c0282612b9b565b604082019050919050565b60006020820190508181036000830152612c2681612bea565b9050919050565b7f4265742073686f756c6420626520696e20612027626574272073746174652e00600082015250565b6000612c63601f83612af8565b9150612c6e82612c2d565b602082019050919050565b60006020820190508181036000830152612c9281612c56565b9050919050565b7f736574746c65426574206265666f726520706c61636542657400000000000000600082015250565b6000612ccf601983612af8565b9150612cda82612c99565b602082019050919050565b60006020820190508181036000830152612cfe81612cc2565b9050919050565b7f5769746864726177616c20616d6f756e74206c6172676572207468616e20626160008201527f6c616e63652e0000000000000000000000000000000000000000000000000000602082015250565b6000612d61602683612af8565b9150612d6c82612d05565b604082019050919050565b60006020820190508181036000830152612d9081612d54565b9050919050565b6000612da2826124e7565b9150612dad836124e7565b925082821015612dc057612dbf6124f1565b5b828203905092915050565b7f5769746864726177616c20616d6f756e74206c6172676572207468616e20626160008201527f6c616e6365206d696e7573206c6f636b6564496e426574730000000000000000602082015250565b6000612e27603883612af8565b9150612e3282612dcb565b604082019050919050565b60006020820190508181036000830152612e5681612e1a565b9050919050565b7f4265742073686f756c6420626520696e20612027636c65616e2720737461746560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000612eb9602183612af8565b9150612ec482612e5d565b604082019050919050565b60006020820190508181036000830152612ee881612eac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f29826124e7565b9150612f34836124e7565b925082612f4457612f43612eef565b5b828206905092915050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676560008201527f72207468616e206d6f64756c6f2e000000000000000000000000000000000000602082015250565b6000612fab602e83612af8565b9150612fb682612f4f565b604082019050919050565b60006020820190508181036000830152612fda81612f9e565b9050919050565b7f6d617850726f666974206c696d69742076696f6c6174696f6e2e000000000000600082015250565b6000613017601a83612af8565b915061302282612fe1565b602082019050919050565b600060208201905081810360008301526130468161300a565b9050919050565b7f556e61626c6520746f20616363657074206265742064756520746f20696e737560008201527f6666696369656e742066756e6473000000000000000000000000000000000000602082015250565b60006130a9602e83612af8565b91506130b48261304d565b604082019050919050565b600060208201905081810360008301526130d88161309c565b9050919050565b7f686f7573654564676550657263656e74206d75737420626520612073616e652060008201527f6e756d6265720000000000000000000000000000000000000000000000000000602082015250565b600061313b602683612af8565b9150613146826130df565b604082019050919050565b6000602082019050818103600083015261316a8161312e565b9050919050565b7f42657420646f6573206e6f742065786973742e00000000000000000000000000600082015250565b60006131a7601383612af8565b91506131b282613171565b602082019050919050565b600060208201905081810360008301526131d68161319a565b9050919050565b7f42657420697320736574746c656420616c72656164792e000000000000000000600082015250565b6000613213601783612af8565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b9050919050565b7f5761697420616674657220706c6163696e6720626574206265666f726520726560008201527f7175657374696e6720726566756e642e00000000000000000000000000000000602082015250565b60006132a5603083612af8565b91506132b082613249565b604082019050919050565b600060208201905081810360008301526132d481613298565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613337602683612af8565b9150613342826132db565b604082019050919050565b600060208201905081810360008301526133668161332a565b9050919050565b7f6d617850726f666974206d75737420626520612073616e65206e756d62657200600082015250565b60006133a3601f83612af8565b91506133ae8261336d565b602082019050919050565b600060208201905081810360008301526133d281613396565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061340f602083612af8565b915061341a826133d9565b602082019050919050565b6000602082019050818103600083015261343e81613402565b9050919050565b7f52656365697074206c656166206c6f6e676572207468616e203535206279746560008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b60006134a1602283612af8565b91506134ac82613445565b604082019050919050565b600060208201905081810360008301526134d081613494565b9050919050565b7f5061746820697320616e20524c5020737472696e672e00000000000000000000600082015250565b600061350d601683612af8565b9150613518826134d7565b602082019050919050565b6000602082019050818103600083015261353c81613500565b9050919050565b7f5265636569707420737472696e6720697320616c77617973206174206c65617360008201527f7420323536206279746573206c6f6e672c20627574206c657373207468616e2060208201527f36346b2e00000000000000000000000000000000000000000000000000000000604082015250565b60006135c5604483612af8565b91506135d082613543565b606082019050919050565b600060208201905081810360008301526135f4816135b8565b9050919050565b7f5265636569707420697320616c77617973206174206c6561737420323536206260008201527f79746573206c6f6e672c20627574206c657373207468616e2036346b2e000000602082015250565b6000613657603d83612af8565b9150613662826135fb565b604082019050919050565b600060208201905081810360008301526136868161364a565b9050919050565b7f5374617475732073686f756c6420626520737563636573732e00000000000000600082015250565b60006136c3601983612af8565b91506136ce8261368d565b602082019050919050565b600060208201905081810360008301526136f2816136b6565b9050919050565b7f43756d756c61746976652067617320697320616e20524c5020737472696e672e600082015250565b600061372f602083612af8565b915061373a826136f9565b602082019050919050565b6000602082019050818103600083015261375e81613722565b9050919050565b7f426c6f6f6d2066696c74657220697320616c776179732032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b60006137c1602683612af8565b91506137cc82613765565b604082019050919050565b600060208201905081810360008301526137f0816137b4565b9050919050565b7f4c6f6773206c697374206973206c657373207468616e2032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b6000613853602683612af8565b915061385e826137f7565b604082019050919050565b6000602082019050818103600083015261388281613846565b9050919050565b7f4c6f6720656e747279206973206c657373207468616e2032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b60006138e5602683612af8565b91506138f082613889565b604082019050919050565b60006020820190508181036000830152613914816138d8565b9050919050565b7f41646472657373206973203230206279746573206c6f6e672e00000000000000600082015250565b6000613951601983612af8565b915061395c8261391b565b602082019050919050565b6000602082019050818103600083015261398081613944565b9050919050565b7f536869667420626f756e647320636865636b2e00000000000000000000000000600082015250565b60006139bd601383612af8565b91506139c882613987565b602082019050919050565b600060208201905081810360008301526139ec816139b0565b9050919050565b7f4e6f6e2d656d707479206861736820736c6f742e000000000000000000000000600082015250565b6000613a29601483612af8565b9150613a34826139f3565b602082019050919050565b60006020820190508181036000830152613a5881613a1c565b9050919050565b7f42657420697320736574746c656420616c726561647900000000000000000000600082015250565b6000613a95601683612af8565b9150613aa082613a5f565b602082019050919050565b60006020820190508181036000830152613ac481613a88565b9050919050565b6000819050919050565b613ae6613ae182612846565b613acb565b82525050565b6000613af88285612ac6565b602082019150613b088284613ad5565b6020820191508190509392505050565b60008160011c9050919050565b6000808291508390505b6001851115613b6f57808604811115613b4b57613b4a6124f1565b5b6001851615613b5a5780820291505b8081029050613b6885613b18565b9450613b2f565b94509492505050565b600082613b885760019050613c44565b81613b965760009050613c44565b8160018114613bac5760028114613bb657613be5565b6001915050613c44565b60ff841115613bc857613bc76124f1565b5b8360020a915084821115613bdf57613bde6124f1565b5b50613c44565b5060208310610133831016604e8410600b8410161715613c1a5782820a905083811115613c1557613c146124f1565b5b613c44565b613c278484846001613b25565b92509050818404811115613c3e57613c3d6124f1565b5b81810290505b9392505050565b6000613c56826124e7565b9150613c61836124e7565b9250613c8e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613b78565b905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613ccc601f83612af8565b9150613cd782613c96565b602082019050919050565b60006020820190508181036000830152613cfb81613cbf565b9050919050565b7f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000600082015250565b6000613d38601e83612af8565b9150613d4382613d02565b602082019050919050565b60006020820190508181036000830152613d6781613d2b565b9050919050565b7f42657420616d6f756e742073686f756c642062652077697468696e2072616e6760008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dca602283612af8565b9150613dd582613d6e565b604082019050919050565b60006020820190508181036000830152613df981613dbd565b9050919050565b7f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000600082015250565b6000613e36601c83612af8565b9150613e4182613e00565b602082019050919050565b60006020820190508181036000830152613e6581613e29565b9050919050565b7f436f6d6d69742068617320657870697265642e00000000000000000000000000600082015250565b6000613ea2601383612af8565b9150613ead82613e6c565b602082019050919050565b60006020820190508181036000830152613ed181613e95565b9050919050565b60008160f81b9050919050565b6000613ef082613ed8565b9050919050565b6000613f0282613ee5565b9050919050565b613f1a613f15826126c8565b613ef7565b82525050565b6000613f2c8288612ac6565b602082019150613f3c8287612ac6565b602082019150613f4c8286612ac6565b602082019150613f5c8285612ac6565b602082019150613f6c8284613f09565b6001820191508190509695505050505050565b613f8881612846565b82525050565b6000819050919050565b6000819050919050565b6000613fbd613fb8613fb384613f8e565b613f98565b61260d565b9050919050565b613fcd81613fa2565b82525050565b6000608082019050613fe86000830187613f7f565b613ff56020830186613fc4565b6140026040830185613f7f565b61400f6060830184613f7f565b95945050505050565b7f4543445341207369676e6174757265206973206e6f742076616c69642e000000600082015250565b600061404e601d83612af8565b915061405982614018565b602082019050919050565b6000602082019050818103600083015261407d81614041565b9050919050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206d7573742060008201527f6c6172676572207468616e206d696e696d756d206c617267657220636f6d706160208201527f7269736f6e2076616c75652e0000000000000000000000000000000000000000604082015250565b6000614106604c83612af8565b915061411182614084565b606082019050919050565b60006020820190508181036000830152614135816140f9565b9050919050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206d7573742060008201527f736d616c6c6572207468616e206d6178696d756d20736d616c6c657220636f6d60208201527f70617269736f6e2076616c75652e000000000000000000000000000000000000604082015250565b60006141be604e83612af8565b91506141c98261413c565b606082019050919050565b600060208201905081810360008301526141ed816141b1565b9050919050565b7f57696e2070726f626162696c697479206f7574206f662072616e67652e000000600082015250565b600061422a601d83612af8565b9150614235826141f4565b602082019050919050565b600060208201905081810360008301526142598161421d565b9050919050565b600061426b826124e7565b9150614276836124e7565b92508261428657614285612eef565b5b828204905092915050565b600060a0820190506142a66000830188612576565b6142b36020830187612658565b6142c06040830186612678565b6142cd6060830185612576565b6142da60808301846126d4565b9695505050505050565b600060c0820190506142f96000830189612576565b6143066020830188612658565b6143136040830187612678565b6143206060830186612576565b61432d6080830185612576565b61433a60a0830184612576565b97965050505050505056fea2646970667358221220209146505a33f37184ebe6312ec5cd3770a8875735c5c0e052f5aee7126a475764736f6c634300080c0033
Deployed Bytecode Sourcemap
6614:27408:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11757:9;11736:17;;:30;;;;;;;:::i;:::-;;;;;;;;6614:27408;;11675:9;11654:17;;:30;;;;;;;:::i;:::-;;;;;;;;6614:27408;8728:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11807:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9806:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11016:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11128:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;9228:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12629:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9169:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5722:103;;;;;;;;;;;;;:::i;:::-;;8764:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19468:1001;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12107:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12785:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5074:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18316:732;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11958:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13600:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9470:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13384:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13874:433;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14634:2371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9360:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12251:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9722:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9644:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24197:1017;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5980:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9316:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13071:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8728:29;;;;:::o;11807:98::-;11852:4;11876:21;11869:28;;11807:98;:::o;9806:30::-;;;;:::o;11016:32::-;;;;:::o;11128:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9228:41::-;;;;:::o;12629:120::-;4960:13;:11;:13::i;:::-;12735:6:::1;12719:13;:22;;;;:::i;:::-;12704:12;:37;;;;12629:120:::0;:::o;9169:52::-;;;;:::o;5722:103::-;4960:13;:11;:13::i;:::-;5787:30:::1;5814:1;5787:18;:30::i;:::-;5722:103::o:0;8764:32::-;;;;:::o;19468:1001::-;4960:13;:11;:13::i;:::-;19659:11:::1;19705:6;19688:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;19678:35;;;;;;19673:41;;19659:55;;19727:15;19745:4;:12;19750:6;19745:12;;;;;;;;;;;19727:30;;8047:3;19862:20;:44;;;;;;:::i;:::-;19846:12;:60;;19837:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;19995:38;20017:15;19995:21;:38::i;:::-;20143:21;20175:17:::0;20232:38:::1;20250:6;20258:11;20232:17;:38::i;:::-;20203:67;;;;;;;;20325:13;20300:20;20290:31;;;:48;20281:58;;;::::0;::::1;;20422:39;20438:3;20443:6;20451:9;20422:15;:39::i;:::-;19564:905;;;;19468:1001:::0;;:::o;12107:97::-;4960:13;:11;:13::i;:::-;12191:5:::1;12175:13;:21;;;;12107:97:::0;:::o;12785:199::-;4960:13;:11;:13::i;:::-;12885::::1;12869;:29;12860:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;12963:13;12948:12;:28;;;;12785:199:::0;:::o;5074:87::-;5120:7;5147:6;;;;;;;;;;;5140:13;;5074:87;:::o;18316:732::-;4960:13;:11;:13::i;:::-;18424:11:::1;18470:6;18453:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;18443:35;;;;;;18438:41;;18424:55;;18492:15;18510:4;:12;18515:6;18510:12;;;;;;;;;;;18492:30;;18533:21;18557:3;:20;;;18533:44;;18622:1;18599:25;;:3;:11;;;;;;;;;;;;:25;;;;18590:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;18785:16;18769:12;:32;;18760:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;18898:14;18877:3;:18;;:35;;;;18995:45;19011:3;19016:6;19024:15;18995;:45::i;:::-;18413:635;;;18316:732:::0;;;:::o;11958:95::-;4960:13;:11;:13::i;:::-;12040:5:::1;12025:12;:20;;;;11958:95:::0;:::o;13600:171::-;4960:13;:11;:13::i;:::-;13735:28:::1;13705:27;:58;;;;13600:171:::0;:::o;9470:36::-;;;;:::o;13384:163::-;4960:13;:11;:13::i;:::-;13513:26:::1;13485:25;:54;;;;13384:163:::0;:::o;13874:433::-;4960:13;:11;:13::i;:::-;14004:21:::1;13986:14;:39;;13977:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;14130:12;;14106:21;:36;;;;:::i;:::-;14088:14;:54;;14079:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;14214:11;:20;;:36;14235:14;14214:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;14285:14;14261:20;;:38;;;;;;;:::i;:::-;;;;;;;;13874:433:::0;;:::o;14634:2371::-;2345:21;:19;:21::i;:::-;14794:15:::1;14812:4;:12;14817:6;14812:12;;;;;;;;;;;14794:30;;14867:1;14844:25;;:3;:11;;;;;;;;;;;;:25;;;14835:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;14920:11;14934:9;14920:23;;14956:83;14974:6;14982:7;14991:6;14999:15;15016:6;15024:8;15034:1;15037;14956:17;:83::i;:::-;15052:13;15076:9:::0;7544:2:::1;15102:6;:25;15098:718;;8563:4;8460:66;8359;15457:7;:21;;;;:::i;:::-;15456:37;15455:55;;;;:::i;:::-;15444:66;;15532:7;15525:14;;15098:718;;;15698:1;15688:7;:11;:32;;;;;15714:6;15703:7;:17;;15688:32;15679:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;15797:7;15786:18;;15098:718;15856:22;15881:52;15898:6;15906;15914:8;15924;15881:16;:52::i;:::-;15856:77;;16071:9;;16062:6;:18;;;;:::i;:::-;16041:17;:39;;16032:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;16241:21;16220:17;16205:12;;:32;;;;:::i;:::-;:57;;16196:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;16373:17;16357:12;;:33;;;;;;;:::i;:::-;;;;;;;;16441:6;16425:3;:8;;:15;;:22;;;;16480:6;16458:3;:8;;:15;;;:29;;;;;;;;;;;;;;;;;;16517:8;16498:3;:12;;;:28;;;;;;;;;;;;;;;;;;16553:4;16537:3;:8;;;:21;;;;;;;;;;;;;;;;;;16590:12;16569:3;:20;;:33;;;;16633:10;16613:3;:11;;;:31;;;;;;;;;;;;;;;;;;16669:5;16655:3;:13;;;:19;;;;;;;;;;;;;;;;;;16697:1;16685:3;:11;;:13;;;;16723:1;16709:3;:13;;:15;;;;16754:1;16735:3;:18;;:20;;;;16783:1;16766:3;:16;;:18;;;;16806:6;16795:3;:10;;:17;;;;16836:8;16823:3;:12;;;:21;;;;;;;;;;;;;;;;;;16894:103;16913:3;:11;;;;;;;;;;;;16926:6;16940;16955:8;16973:4;16980:6;16988:8;16894:18;:103::i;:::-;14781:2224;;;;;2389:20:::0;:18;:20::i;:::-;14634:2371;;;;;;;:::o;9360:38::-;;;;:::o;12251:241::-;4960:13;:11;:13::i;:::-;12365:1:::1;12344:17;:22;;:50;;;;;12391:3;12370:17;:24;;12344:50;12334:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;12467:17;12448:16;:36;;;;12251:241:::0;:::o;9722:29::-;;;;:::o;9644:24::-;;;;:::o;24197:1017::-;2345:21;:19;:21::i;:::-;24280:15:::1;24298:4;:12;24303:6;24298:12;;;;;;;;;;;24280:30;;24321:11;24335:3;:8;;:15;;;24321:29;;24361:13;24377:3;:12;;;;;;;;;;;;24361:28;;24449:1;24440:6;:10;24431:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;24536:5;24519:22;;:3;:13;;;;;;;;;;;;:22;;;24510:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;24659:5;24636:3;:20;;;:28;;;;:::i;:::-;24621:12;:43;24612:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;24730:22;24755:65;24772:6;24780:3;:8;;:15;;;;;;;;;;;;24755:65;;24797:3;:12;;;;;;;;;;;;24755:65;;24811:8;24755:16;:65::i;:::-;24730:90;;24932:17;24916:12;;:33;;;;;;;:::i;:::-;;;;;;;;25009:4;24993:3;:13;;;:20;;;;;;;;;;;;;;;;;;25040:6;25024:3;:13;;:22;;;;25088:3;:11;;;;;;;;;;;;:20;;:28;25109:6;25088:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;25186:3;:11;;;;;;;;;;;;25174:32;;;25199:6;25174:32;;;;;;:::i;:::-;;;;;;;;24259:955;;;;2389:20:::0;:18;:20::i;:::-;24197:1017;:::o;5980:201::-;4960:13;:11;:13::i;:::-;6089:1:::1;6069:22;;:8;:22;;;;6061:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6145:28;6164:8;6145:18;:28::i;:::-;5980:201:::0;:::o;9316:37::-;;;;:::o;13071:182::-;4960:13;:11;:13::i;:::-;13162:14:::1;13149:10;:27;13140:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;13235:10;13223:9;:22;;;;13071:182:::0;:::o;5239:132::-;5314:12;:10;:12::i;:::-;5303:23;;:7;:5;:7::i;:::-;:23;;;5295:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5239:132::o;6341:191::-;6415:16;6434:6;;;;;;;;;;;6415:25;;6460:8;6451:6;;:17;;;;;;;;;;;;;;;;;;6515:8;6484:40;;6505:8;6484:40;;;;;;;;;;;;6404:128;6341:191;:::o;29522:2640::-;29590:19;29661:6;29648:20;29645:1;29640:29;29622:47;;29710:4;29692:14;:22;;29683:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;29791:4;29774:14;:21;;;;:::i;:::-;29764:31;;;;;:::i;:::-;;;29808:19;29879:6;29866:20;29863:1;29858:29;29840:47;;29923:4;29905:14;:22;29901:231;;29954:1;29944:11;;;;;:::i;:::-;;;29901:231;;;30017:4;29999:14;:22;;:48;;;;;30043:4;30025:14;:22;;29999:48;29990:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;30116:4;30099:14;:21;;;;:::i;:::-;30089:31;;;;;:::i;:::-;;;29901:231;30144:28;30233:6;30220:20;30217:1;30212:29;30185:56;;30289:4;30262:23;:31;30253:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;30387:1;30377:11;;;;;:::i;:::-;;;30401:22;30478:6;30465:20;30462:1;30457:29;30436:50;;30528:4;30507:17;:25;30498:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;30619:1;30609:11;;;;;:::i;:::-;;;30633:15;30696:6;30683:20;30680:1;30675:29;30661:43;;30739:3;30725:10;:17;30716:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;30793:1;30783:11;;;;;:::i;:::-;;;30807:21;30882:6;30869:20;30866:1;30861:29;30841:49;;30926:4;30906:16;:24;30902:249;;30957:1;30947:11;;;;;:::i;:::-;;;30902:249;;;31022:4;31002:16;:24;;:52;;;;;31050:4;31030:16;:24;;31002:52;30993:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;31135:4;31116:16;:23;;;;:::i;:::-;31106:33;;;;;:::i;:::-;;;30902:249;31163:20;31236:6;31223:20;31220:1;31215:29;31196:48;;31284:4;31265:15;:23;31256:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;31352:7;31342:17;;;;;:::i;:::-;;;31372:23;31451:6;31438:20;31435:1;31430:29;31408:51;;31502:4;31480:18;:26;31471:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;31570:1;31560:11;;;;;:::i;:::-;;;31584:23;31663:6;31650:20;31647:1;31642:29;31620:51;;31714:4;31692:18;:26;31683:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;31782:1;31772:11;;;;;:::i;:::-;;;31796:22;31873:6;31860:20;31857:1;31852:29;31831:50;;31923:4;31902:17;:25;31893:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31970:15;32047:42;32041:2;32033:6;32029:15;32016:29;32012:78;31998:92;;32146:4;32125:28;;32111:10;:42;32102:52;;;;;;29579:2583;;;;;;;;;;;29522:2640;:::o;26248:3054::-;26325:17;26344;26464:16;26515:4;26509:11;26494:26;;26534:22;26558:15;26575:10;26587:13;26916:857;27021:6;27015:2;27007:6;27003:15;26990:29;26986:42;26972:56;;27062:1;27048:10;:15;27044:129;;;27152:5;;27044:129;27244:6;27238:2;27230:6;27226:15;27213:29;27209:42;27200:51;;27290:10;27284:2;27276:5;:10;;;;:::i;:::-;:24;;27267:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27351:1;27341:11;;;;;:::i;:::-;;;27415:5;27407:6;27403:18;27390:32;27378:44;;27459:1;27447:8;:13;27438:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;27564:10;27556:6;27543:11;27530:45;27625:8;27617:5;27604:11;27600:23;27593:41;27687:10;27674:11;27664:34;27652:46;;27737:10;27716:31;;26934:10;26924:20;;;;;:::i;:::-;;;26916:857;;;27857:8;27849:17;;27837:29;;27938:16;27971:17;27957:11;:31;;;;:::i;:::-;27938:50;;27999:17;28080:6;28074:2;28066:6;28062:15;28049:29;28045:42;28029:58;;28099:16;28179:6;28173:2;28165:6;28161:15;28148:29;28144:42;28129:57;;28242:12;28221:17;28207:11;:31;;;;:::i;:::-;:47;;28198:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;28301:1;28291:11;;;;;:::i;:::-;;;28358:12;28350:6;28337:11;28324:47;28383:65;28404:11;28390;:25;;;;:::i;:::-;28417:11;28430:17;28383:6;:65::i;:::-;28507:12;28494:11;28484:36;28472:48;;28544:12;28534:22;;;;;:::i;:::-;;;28719:6;28713:2;28705:6;28701:15;28688:29;28684:42;28670:56;;28784:6;28778:2;28770:6;28766:15;28753:29;28749:42;28740:51;;28835:10;28829:2;28821:5;:10;;;;:::i;:::-;:24;;28812:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28892:1;28882:11;;;;;:::i;:::-;;;28952:5;28944:6;28940:18;28927:32;28915:44;;28992:1;28980:8;:13;28971:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;29089:10;29081:6;29068:11;29055:45;29146:8;29138:5;29125:11;29121:23;29114:41;29273:10;29260:11;29250:34;29237:47;;29040:255;;;;;;;;26248:3054;;;;;:::o;20551:2771::-;20720:11;20734:3;:8;;:15;;;20720:29;;20817:1;20808:6;:10;20799:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;20903:5;20886:22;;:3;:13;;;;;;;;;;;;:22;;;20878:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21054:11;21068:3;:8;;:15;;;;;;;;;;;;21054:29;;;;21094:13;21110:3;:12;;;;;;;;;;;;21094:28;;;;21133:23;21159:3;:11;;;;;;;;;;;;21133:37;;21181:13;21197:3;:12;;;;;;;;;;;;21181:28;;21583:15;21628:6;21636:16;21611:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21601:53;;;;;;21583:71;;21744:12;21775:6;21764:7;21759:13;;:22;;;;:::i;:::-;21744:37;;21842:22;21867:52;21884:6;21892;21900:8;21910;21867:16;:52::i;:::-;21842:77;;21973:14;7544:2;22044:6;:25;22040:649;;22197:1;22185:3;:8;;;;;;;;;;;;22168:25;;22174:7;22169:1;:12;;;;:::i;:::-;22168:25;:30;22164:100;;22231:17;22219:29;;22164:100;22040:649;;;22377:8;22373:291;;;22419:8;22409:7;:18;22405:96;;;22464:17;22452:29;;22405:96;22373:291;;;22567:8;22557:7;:18;22553:96;;;22612:17;22600:29;;22553:96;22373:291;22040:649;22800:17;22784:12;;:33;;;;;;;:::i;:::-;;;;;;;;22877:4;22861:3;:13;;;:20;;;;;;;;;;;;;;;;;;22908:9;22892:3;:13;;:25;;;;22952:7;22947:13;;22928:3;:16;;:32;;;;22985:7;22971:3;:11;;:21;;;;23031:1;23009:3;:18;;;:23;:61;;;;23057:3;:13;;;23036:3;:18;;;:34;23009:61;23005:133;;;23117:9;23096:3;:18;;:30;;;;23005:133;23215:1;23194:3;:18;;;:22;23190:91;;;23233:7;:16;;:36;23250:3;:18;;;23233:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23190:91;23293:21;23310:3;23293:16;:21::i;:::-;20640:2682;;;;;;;;;20551:2771;;;:::o;2425:293::-;1827:1;2559:7;;:19;;2551:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1827:1;2692:7;:18;;;;2425:293::o;32720:1299::-;32934:1;32925:6;:10;:34;;;;;6893:3;32939:6;:20;;32925:34;32916:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;33024:12;;33014:6;:22;;:48;;;;;33050:12;;33040:6;:22;;33014:48;33005:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;33131:1;33121:7;:11;:37;;;;;7544:2;8220:1;:20;;;;:::i;:::-;33136:7;:22;33121:37;33112:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;33325:15;33309:12;:31;;33300:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33375:21;33426:7;33435:6;33443:15;33460:6;33468:8;33409:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33399:79;;;;;;33375:103;;33509:34;33519:13;33534:2;33538:1;33541;33509:34;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33498:45;;:7;:5;:7::i;:::-;:45;;;33489:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;7544:2;33594:6;:24;33590:422;;;33639:8;33635:366;;;33687:12;;33676:7;:23;;:44;;;;;33714:6;33703:7;:17;;33676:44;33667:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;33635:366;;;33873:1;33863:7;:11;:39;;;;;33889:13;;33878:7;:24;;33863:39;33854:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;33635:366;33590:422;32872:1147;32720:1299;;;;;;;;:::o;17081:660::-;17185:14;17225:8;17221:1;:12;:34;;;;;17249:6;17237:8;:18;;17221:34;17212:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;17300:14;17370:3;17346:20;17359:6;17346:12;:20::i;:::-;17327:16;;:39;;;;:::i;:::-;17317:6;:50;;;;:::i;:::-;:56;;;;:::i;:::-;17300:73;;17384:17;17404:8;17384:28;;6893:3;17427:6;:20;:32;;;;;17451:8;17427:32;17423:101;;;17504:8;6893:3;17491:21;;;;:::i;:::-;17476:36;;17423:101;17578:12;17569:6;17556:9;17547:6;:18;;;;:::i;:::-;17546:29;;;;:::i;:::-;:44;;;;:::i;:::-;17534:56;;17603:17;17632:9;;17623:6;:18;;;;:::i;:::-;17603:38;;17669:12;17657:9;:24;17654:80;;;17710:12;17698:24;;17654:80;17201:540;;;17081:660;;;;;;:::o;14315:293::-;14543:6;14510:90;;14520:7;14510:90;;;14529:6;14558:8;14576:4;14583:6;14591:8;14510:90;;;;;;;;;;:::i;:::-;;;;;;;;14315:293;;;;;;;:::o;2726:213::-;1783:1;2909:7;:22;;;;2726:213::o;3625:98::-;3678:7;3705:10;3698:17;;3625:98;:::o;32191:497::-;32293:127;32306:2;32299:3;:9;32293:127;;32366:3;32360:10;32354:4;32347:24;32395:2;32387:10;;;;;:::i;:::-;;;32406:2;32399:9;;;;;:::i;:::-;;;32317:2;32310:9;;;;;:::i;:::-;;;32293:127;;;32460:9;32492:1;32485:3;32480:2;:8;;;;:::i;:::-;32472:3;:17;;;;:::i;:::-;:21;;;;:::i;:::-;32460:33;;32563:4;32559:9;32553:3;32547:10;32543:26;32616:4;32609;32603:11;32599:22;32661:7;32651:8;32648:21;32642:4;32635:35;32513:168;;;32191:497;;;:::o;23330:598::-;23397:11;23411:3;:8;;:15;;;23397:29;;23437:12;23452:3;:11;;;23437:26;;23474:14;23491:3;:13;;;23474:30;;23515:19;23537:3;:18;;;23515:40;;23635:11;23649:3;:8;;:15;;;;;;;;;;;;23635:29;;;;23675:13;23691:3;:12;;;;;;;;;;;;23675:28;;;;23714:23;23740:3;:11;;;;;;;;;;;;23714:37;;23849:6;23815:105;;23826:7;23815:105;;;23835:6;23864:8;23875:3;:8;;;;;;;;;;;;23885:7;23894:9;23905:14;23815:105;;;;;;;;;;;:::i;:::-;;;;;;;;23386:542;;;;;;;23330:598;:::o;17773:168::-;17830:14;17908:25;;17878:27;;17869:6;:36;;;;:::i;:::-;:64;;;;:::i;:::-;17857:76;;17773:168;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:180::-;138:77;135:1;128:88;235:4;232:1;225:15;259:4;256:1;249:15;276:305;316:3;335:20;353:1;335:20;:::i;:::-;330:25;;369:20;387:1;369:20;:::i;:::-;364:25;;523:1;455:66;451:74;448:1;445:81;442:107;;;529:18;;:::i;:::-;442:107;573:1;570;566:9;559:16;;276:305;;;;:::o;587:118::-;674:24;692:5;674:24;:::i;:::-;669:3;662:37;587:118;;:::o;711:222::-;804:4;842:2;831:9;827:18;819:26;;855:71;923:1;912:9;908:17;899:6;855:71;:::i;:::-;711:222;;;;:::o;1020:117::-;1129:1;1126;1119:12;1266:122;1339:24;1357:5;1339:24;:::i;:::-;1332:5;1329:35;1319:63;;1378:1;1375;1368:12;1319:63;1266:122;:::o;1394:139::-;1440:5;1478:6;1465:20;1456:29;;1494:33;1521:5;1494:33;:::i;:::-;1394:139;;;;:::o;1539:329::-;1598:6;1647:2;1635:9;1626:7;1622:23;1618:32;1615:119;;;1653:79;;:::i;:::-;1615:119;1773:1;1798:53;1843:7;1834:6;1823:9;1819:22;1798:53;:::i;:::-;1788:63;;1744:117;1539:329;;;;:::o;1874:108::-;1951:24;1969:5;1951:24;:::i;:::-;1946:3;1939:37;1874:108;;:::o;1988:86::-;2023:7;2063:4;2056:5;2052:16;2041:27;;1988:86;;;:::o;2080:102::-;2153:22;2169:5;2153:22;:::i;:::-;2148:3;2141:35;2080:102;;:::o;2244:505::-;2389:4;2384:3;2380:14;2478:4;2471:5;2467:16;2461:23;2497:63;2554:4;2549:3;2545:14;2531:12;2497:63;:::i;:::-;2404:166;2654:4;2647:5;2643:16;2637:23;2673:59;2726:4;2721:3;2717:14;2703:12;2673:59;:::i;:::-;2580:162;2358:391;2244:505;;:::o;2755:112::-;2838:22;2854:5;2838:22;:::i;:::-;2833:3;2826:35;2755:112;;:::o;2873:95::-;2909:7;2949:12;2942:5;2938:24;2927:35;;2873:95;;;:::o;2974:115::-;3059:23;3076:5;3059:23;:::i;:::-;3054:3;3047:36;2974:115;;:::o;3095:126::-;3132:7;3172:42;3165:5;3161:54;3150:65;;3095:126;;;:::o;3227:104::-;3272:7;3301:24;3319:5;3301:24;:::i;:::-;3290:35;;3227:104;;;:::o;3337:142::-;3440:32;3466:5;3440:32;:::i;:::-;3435:3;3428:45;3337:142;;:::o;3485:90::-;3519:7;3562:5;3555:13;3548:21;3537:32;;3485:90;;;:::o;3581:109::-;3662:21;3677:5;3662:21;:::i;:::-;3657:3;3650:34;3581:109;;:::o;3696:1538::-;4145:4;4183:3;4172:9;4168:19;4160:27;;4197:119;4313:1;4302:9;4298:17;4289:6;4197:119;:::i;:::-;4326:68;4390:2;4379:9;4375:18;4366:6;4326:68;:::i;:::-;4404:70;4470:2;4459:9;4455:18;4446:6;4404:70;:::i;:::-;4484:73;4552:3;4541:9;4537:19;4528:6;4484:73;:::i;:::-;4567:89;4651:3;4640:9;4636:19;4627:6;4567:89;:::i;:::-;4666:67;4728:3;4717:9;4713:19;4704:6;4666:67;:::i;:::-;4743:73;4811:3;4800:9;4796:19;4787:6;4743:73;:::i;:::-;4826;4894:3;4883:9;4879:19;4870:6;4826:73;:::i;:::-;4909;4977:3;4966:9;4962:19;4953:6;4909:73;:::i;:::-;4992;5060:3;5049:9;5045:19;5036:6;4992:73;:::i;:::-;5075:74;5144:3;5133:9;5129:19;5119:7;5075:74;:::i;:::-;5159:68;5222:3;5211:9;5207:19;5197:7;5159:68;:::i;:::-;3696:1538;;;;;;;;;;;;;;;:::o;5240:120::-;5312:23;5329:5;5312:23;:::i;:::-;5305:5;5302:34;5292:62;;5350:1;5347;5340:12;5292:62;5240:120;:::o;5366:137::-;5411:5;5449:6;5436:20;5427:29;;5465:32;5491:5;5465:32;:::i;:::-;5366:137;;;;:::o;5509:472::-;5576:6;5584;5633:2;5621:9;5612:7;5608:23;5604:32;5601:119;;;5639:79;;:::i;:::-;5601:119;5759:1;5784:53;5829:7;5820:6;5809:9;5805:22;5784:53;:::i;:::-;5774:63;;5730:117;5886:2;5912:52;5956:7;5947:6;5936:9;5932:22;5912:52;:::i;:::-;5902:62;;5857:117;5509:472;;;;;:::o;5987:96::-;6024:7;6053:24;6071:5;6053:24;:::i;:::-;6042:35;;5987:96;;;:::o;6089:118::-;6176:24;6194:5;6176:24;:::i;:::-;6171:3;6164:37;6089:118;;:::o;6213:222::-;6306:4;6344:2;6333:9;6329:18;6321:26;;6357:71;6425:1;6414:9;6410:17;6401:6;6357:71;:::i;:::-;6213:222;;;;:::o;6441:77::-;6478:7;6507:5;6496:16;;6441:77;;;:::o;6524:122::-;6597:24;6615:5;6597:24;:::i;:::-;6590:5;6587:35;6577:63;;6636:1;6633;6626:12;6577:63;6524:122;:::o;6652:139::-;6698:5;6736:6;6723:20;6714:29;;6752:33;6779:5;6752:33;:::i;:::-;6652:139;;;;:::o;6797:619::-;6874:6;6882;6890;6939:2;6927:9;6918:7;6914:23;6910:32;6907:119;;;6945:79;;:::i;:::-;6907:119;7065:1;7090:53;7135:7;7126:6;7115:9;7111:22;7090:53;:::i;:::-;7080:63;;7036:117;7192:2;7218:53;7263:7;7254:6;7243:9;7239:22;7218:53;:::i;:::-;7208:63;;7163:118;7320:2;7346:53;7391:7;7382:6;7371:9;7367:22;7346:53;:::i;:::-;7336:63;;7291:118;6797:619;;;;;:::o;7422:138::-;7503:32;7529:5;7503:32;:::i;:::-;7496:5;7493:43;7483:71;;7550:1;7547;7540:12;7483:71;7422:138;:::o;7566:155::-;7620:5;7658:6;7645:20;7636:29;;7674:41;7709:5;7674:41;:::i;:::-;7566:155;;;;:::o;7727:490::-;7803:6;7811;7860:2;7848:9;7839:7;7835:23;7831:32;7828:119;;;7866:79;;:::i;:::-;7828:119;7986:1;8011:61;8064:7;8055:6;8044:9;8040:22;8011:61;:::i;:::-;8001:71;;7957:125;8121:2;8147:53;8192:7;8183:6;8172:9;8168:22;8147:53;:::i;:::-;8137:63;;8092:118;7727:490;;;;;:::o;8223:116::-;8293:21;8308:5;8293:21;:::i;:::-;8286:5;8283:32;8273:60;;8329:1;8326;8319:12;8273:60;8223:116;:::o;8345:133::-;8388:5;8426:6;8413:20;8404:29;;8442:30;8466:5;8442:30;:::i;:::-;8345:133;;;;:::o;8484:1197::-;8594:6;8602;8610;8618;8626;8634;8642;8691:3;8679:9;8670:7;8666:23;8662:33;8659:120;;;8698:79;;:::i;:::-;8659:120;8818:1;8843:53;8888:7;8879:6;8868:9;8864:22;8843:53;:::i;:::-;8833:63;;8789:117;8945:2;8971:53;9016:7;9007:6;8996:9;8992:22;8971:53;:::i;:::-;8961:63;;8916:118;9073:2;9099:53;9144:7;9135:6;9124:9;9120:22;9099:53;:::i;:::-;9089:63;;9044:118;9201:2;9227:53;9272:7;9263:6;9252:9;9248:22;9227:53;:::i;:::-;9217:63;;9172:118;9329:3;9356:50;9398:7;9389:6;9378:9;9374:22;9356:50;:::i;:::-;9346:60;;9300:116;9455:3;9482:53;9527:7;9518:6;9507:9;9503:22;9482:53;:::i;:::-;9472:63;;9426:119;9584:3;9611:53;9656:7;9647:6;9636:9;9632:22;9611:53;:::i;:::-;9601:63;;9555:119;8484:1197;;;;;;;;;;:::o;9687:122::-;9760:24;9778:5;9760:24;:::i;:::-;9753:5;9750:35;9740:63;;9799:1;9796;9789:12;9740:63;9687:122;:::o;9815:139::-;9861:5;9899:6;9886:20;9877:29;;9915:33;9942:5;9915:33;:::i;:::-;9815:139;;;;:::o;9960:329::-;10019:6;10068:2;10056:9;10047:7;10043:23;10039:32;10036:119;;;10074:79;;:::i;:::-;10036:119;10194:1;10219:53;10264:7;10255:6;10244:9;10240:22;10219:53;:::i;:::-;10209:63;;10165:117;9960:329;;;;:::o;10295:348::-;10335:7;10358:20;10376:1;10358:20;:::i;:::-;10353:25;;10392:20;10410:1;10392:20;:::i;:::-;10387:25;;10580:1;10512:66;10508:74;10505:1;10502:81;10497:1;10490:9;10483:17;10479:105;10476:131;;;10587:18;;:::i;:::-;10476:131;10635:1;10632;10628:9;10617:20;;10295:348;;;;:::o;10649:79::-;10688:7;10717:5;10706:16;;10649:79;;;:::o;10734:157::-;10839:45;10859:24;10877:5;10859:24;:::i;:::-;10839:45;:::i;:::-;10834:3;10827:58;10734:157;;:::o;10897:256::-;11009:3;11024:75;11095:3;11086:6;11024:75;:::i;:::-;11124:2;11119:3;11115:12;11108:19;;11144:3;11137:10;;10897:256;;;;:::o;11159:169::-;11243:11;11277:6;11272:3;11265:19;11317:4;11312:3;11308:14;11293:29;;11159:169;;;;:::o;11334:221::-;11474:34;11470:1;11462:6;11458:14;11451:58;11543:4;11538:2;11530:6;11526:15;11519:29;11334:221;:::o;11561:366::-;11703:3;11724:67;11788:2;11783:3;11724:67;:::i;:::-;11717:74;;11800:93;11889:3;11800:93;:::i;:::-;11918:2;11913:3;11909:12;11902:19;;11561:366;;;:::o;11933:419::-;12099:4;12137:2;12126:9;12122:18;12114:26;;12186:9;12180:4;12176:20;12172:1;12161:9;12157:17;12150:47;12214:131;12340:4;12214:131;:::i;:::-;12206:139;;11933:419;;;:::o;12358:221::-;12498:34;12494:1;12486:6;12482:14;12475:58;12567:4;12562:2;12554:6;12550:15;12543:29;12358:221;:::o;12585:366::-;12727:3;12748:67;12812:2;12807:3;12748:67;:::i;:::-;12741:74;;12824:93;12913:3;12824:93;:::i;:::-;12942:2;12937:3;12933:12;12926:19;;12585:366;;;:::o;12957:419::-;13123:4;13161:2;13150:9;13146:18;13138:26;;13210:9;13204:4;13200:20;13196:1;13185:9;13181:17;13174:47;13238:131;13364:4;13238:131;:::i;:::-;13230:139;;12957:419;;;:::o;13382:181::-;13522:33;13518:1;13510:6;13506:14;13499:57;13382:181;:::o;13569:366::-;13711:3;13732:67;13796:2;13791:3;13732:67;:::i;:::-;13725:74;;13808:93;13897:3;13808:93;:::i;:::-;13926:2;13921:3;13917:12;13910:19;;13569:366;;;:::o;13941:419::-;14107:4;14145:2;14134:9;14130:18;14122:26;;14194:9;14188:4;14184:20;14180:1;14169:9;14165:17;14158:47;14222:131;14348:4;14222:131;:::i;:::-;14214:139;;13941:419;;;:::o;14366:175::-;14506:27;14502:1;14494:6;14490:14;14483:51;14366:175;:::o;14547:366::-;14689:3;14710:67;14774:2;14769:3;14710:67;:::i;:::-;14703:74;;14786:93;14875:3;14786:93;:::i;:::-;14904:2;14899:3;14895:12;14888:19;;14547:366;;;:::o;14919:419::-;15085:4;15123:2;15112:9;15108:18;15100:26;;15172:9;15166:4;15162:20;15158:1;15147:9;15143:17;15136:47;15200:131;15326:4;15200:131;:::i;:::-;15192:139;;14919:419;;;:::o;15344:225::-;15484:34;15480:1;15472:6;15468:14;15461:58;15553:8;15548:2;15540:6;15536:15;15529:33;15344:225;:::o;15575:366::-;15717:3;15738:67;15802:2;15797:3;15738:67;:::i;:::-;15731:74;;15814:93;15903:3;15814:93;:::i;:::-;15932:2;15927:3;15923:12;15916:19;;15575:366;;;:::o;15947:419::-;16113:4;16151:2;16140:9;16136:18;16128:26;;16200:9;16194:4;16190:20;16186:1;16175:9;16171:17;16164:47;16228:131;16354:4;16228:131;:::i;:::-;16220:139;;15947:419;;;:::o;16372:191::-;16412:4;16432:20;16450:1;16432:20;:::i;:::-;16427:25;;16466:20;16484:1;16466:20;:::i;:::-;16461:25;;16505:1;16502;16499:8;16496:34;;;16510:18;;:::i;:::-;16496:34;16555:1;16552;16548:9;16540:17;;16372:191;;;;:::o;16569:243::-;16709:34;16705:1;16697:6;16693:14;16686:58;16778:26;16773:2;16765:6;16761:15;16754:51;16569:243;:::o;16818:366::-;16960:3;16981:67;17045:2;17040:3;16981:67;:::i;:::-;16974:74;;17057:93;17146:3;17057:93;:::i;:::-;17175:2;17170:3;17166:12;17159:19;;16818:366;;;:::o;17190:419::-;17356:4;17394:2;17383:9;17379:18;17371:26;;17443:9;17437:4;17433:20;17429:1;17418:9;17414:17;17407:47;17471:131;17597:4;17471:131;:::i;:::-;17463:139;;17190:419;;;:::o;17615:220::-;17755:34;17751:1;17743:6;17739:14;17732:58;17824:3;17819:2;17811:6;17807:15;17800:28;17615:220;:::o;17841:366::-;17983:3;18004:67;18068:2;18063:3;18004:67;:::i;:::-;17997:74;;18080:93;18169:3;18080:93;:::i;:::-;18198:2;18193:3;18189:12;18182:19;;17841:366;;;:::o;18213:419::-;18379:4;18417:2;18406:9;18402:18;18394:26;;18466:9;18460:4;18456:20;18452:1;18441:9;18437:17;18430:47;18494:131;18620:4;18494:131;:::i;:::-;18486:139;;18213:419;;;:::o;18638:180::-;18686:77;18683:1;18676:88;18783:4;18780:1;18773:15;18807:4;18804:1;18797:15;18824:176;18856:1;18873:20;18891:1;18873:20;:::i;:::-;18868:25;;18907:20;18925:1;18907:20;:::i;:::-;18902:25;;18946:1;18936:35;;18951:18;;:::i;:::-;18936:35;18992:1;18989;18985:9;18980:14;;18824:176;;;;:::o;19006:233::-;19146:34;19142:1;19134:6;19130:14;19123:58;19215:16;19210:2;19202:6;19198:15;19191:41;19006:233;:::o;19245:366::-;19387:3;19408:67;19472:2;19467:3;19408:67;:::i;:::-;19401:74;;19484:93;19573:3;19484:93;:::i;:::-;19602:2;19597:3;19593:12;19586:19;;19245:366;;;:::o;19617:419::-;19783:4;19821:2;19810:9;19806:18;19798:26;;19870:9;19864:4;19860:20;19856:1;19845:9;19841:17;19834:47;19898:131;20024:4;19898:131;:::i;:::-;19890:139;;19617:419;;;:::o;20042:176::-;20182:28;20178:1;20170:6;20166:14;20159:52;20042:176;:::o;20224:366::-;20366:3;20387:67;20451:2;20446:3;20387:67;:::i;:::-;20380:74;;20463:93;20552:3;20463:93;:::i;:::-;20581:2;20576:3;20572:12;20565:19;;20224:366;;;:::o;20596:419::-;20762:4;20800:2;20789:9;20785:18;20777:26;;20849:9;20843:4;20839:20;20835:1;20824:9;20820:17;20813:47;20877:131;21003:4;20877:131;:::i;:::-;20869:139;;20596:419;;;:::o;21021:233::-;21161:34;21157:1;21149:6;21145:14;21138:58;21230:16;21225:2;21217:6;21213:15;21206:41;21021:233;:::o;21260:366::-;21402:3;21423:67;21487:2;21482:3;21423:67;:::i;:::-;21416:74;;21499:93;21588:3;21499:93;:::i;:::-;21617:2;21612:3;21608:12;21601:19;;21260:366;;;:::o;21632:419::-;21798:4;21836:2;21825:9;21821:18;21813:26;;21885:9;21879:4;21875:20;21871:1;21860:9;21856:17;21849:47;21913:131;22039:4;21913:131;:::i;:::-;21905:139;;21632:419;;;:::o;22057:225::-;22197:34;22193:1;22185:6;22181:14;22174:58;22266:8;22261:2;22253:6;22249:15;22242:33;22057:225;:::o;22288:366::-;22430:3;22451:67;22515:2;22510:3;22451:67;:::i;:::-;22444:74;;22527:93;22616:3;22527:93;:::i;:::-;22645:2;22640:3;22636:12;22629:19;;22288:366;;;:::o;22660:419::-;22826:4;22864:2;22853:9;22849:18;22841:26;;22913:9;22907:4;22903:20;22899:1;22888:9;22884:17;22877:47;22941:131;23067:4;22941:131;:::i;:::-;22933:139;;22660:419;;;:::o;23085:169::-;23225:21;23221:1;23213:6;23209:14;23202:45;23085:169;:::o;23260:366::-;23402:3;23423:67;23487:2;23482:3;23423:67;:::i;:::-;23416:74;;23499:93;23588:3;23499:93;:::i;:::-;23617:2;23612:3;23608:12;23601:19;;23260:366;;;:::o;23632:419::-;23798:4;23836:2;23825:9;23821:18;23813:26;;23885:9;23879:4;23875:20;23871:1;23860:9;23856:17;23849:47;23913:131;24039:4;23913:131;:::i;:::-;23905:139;;23632:419;;;:::o;24057:173::-;24197:25;24193:1;24185:6;24181:14;24174:49;24057:173;:::o;24236:366::-;24378:3;24399:67;24463:2;24458:3;24399:67;:::i;:::-;24392:74;;24475:93;24564:3;24475:93;:::i;:::-;24593:2;24588:3;24584:12;24577:19;;24236:366;;;:::o;24608:419::-;24774:4;24812:2;24801:9;24797:18;24789:26;;24861:9;24855:4;24851:20;24847:1;24836:9;24832:17;24825:47;24889:131;25015:4;24889:131;:::i;:::-;24881:139;;24608:419;;;:::o;25033:235::-;25173:34;25169:1;25161:6;25157:14;25150:58;25242:18;25237:2;25229:6;25225:15;25218:43;25033:235;:::o;25274:366::-;25416:3;25437:67;25501:2;25496:3;25437:67;:::i;:::-;25430:74;;25513:93;25602:3;25513:93;:::i;:::-;25631:2;25626:3;25622:12;25615:19;;25274:366;;;:::o;25646:419::-;25812:4;25850:2;25839:9;25835:18;25827:26;;25899:9;25893:4;25889:20;25885:1;25874:9;25870:17;25863:47;25927:131;26053:4;25927:131;:::i;:::-;25919:139;;25646:419;;;:::o;26071:225::-;26211:34;26207:1;26199:6;26195:14;26188:58;26280:8;26275:2;26267:6;26263:15;26256:33;26071:225;:::o;26302:366::-;26444:3;26465:67;26529:2;26524:3;26465:67;:::i;:::-;26458:74;;26541:93;26630:3;26541:93;:::i;:::-;26659:2;26654:3;26650:12;26643:19;;26302:366;;;:::o;26674:419::-;26840:4;26878:2;26867:9;26863:18;26855:26;;26927:9;26921:4;26917:20;26913:1;26902:9;26898:17;26891:47;26955:131;27081:4;26955:131;:::i;:::-;26947:139;;26674:419;;;:::o;27099:181::-;27239:33;27235:1;27227:6;27223:14;27216:57;27099:181;:::o;27286:366::-;27428:3;27449:67;27513:2;27508:3;27449:67;:::i;:::-;27442:74;;27525:93;27614:3;27525:93;:::i;:::-;27643:2;27638:3;27634:12;27627:19;;27286:366;;;:::o;27658:419::-;27824:4;27862:2;27851:9;27847:18;27839:26;;27911:9;27905:4;27901:20;27897:1;27886:9;27882:17;27875:47;27939:131;28065:4;27939:131;:::i;:::-;27931:139;;27658:419;;;:::o;28083:182::-;28223:34;28219:1;28211:6;28207:14;28200:58;28083:182;:::o;28271:366::-;28413:3;28434:67;28498:2;28493:3;28434:67;:::i;:::-;28427:74;;28510:93;28599:3;28510:93;:::i;:::-;28628:2;28623:3;28619:12;28612:19;;28271:366;;;:::o;28643:419::-;28809:4;28847:2;28836:9;28832:18;28824:26;;28896:9;28890:4;28886:20;28882:1;28871:9;28867:17;28860:47;28924:131;29050:4;28924:131;:::i;:::-;28916:139;;28643:419;;;:::o;29068:221::-;29208:34;29204:1;29196:6;29192:14;29185:58;29277:4;29272:2;29264:6;29260:15;29253:29;29068:221;:::o;29295:366::-;29437:3;29458:67;29522:2;29517:3;29458:67;:::i;:::-;29451:74;;29534:93;29623:3;29534:93;:::i;:::-;29652:2;29647:3;29643:12;29636:19;;29295:366;;;:::o;29667:419::-;29833:4;29871:2;29860:9;29856:18;29848:26;;29920:9;29914:4;29910:20;29906:1;29895:9;29891:17;29884:47;29948:131;30074:4;29948:131;:::i;:::-;29940:139;;29667:419;;;:::o;30092:172::-;30232:24;30228:1;30220:6;30216:14;30209:48;30092:172;:::o;30270:366::-;30412:3;30433:67;30497:2;30492:3;30433:67;:::i;:::-;30426:74;;30509:93;30598:3;30509:93;:::i;:::-;30627:2;30622:3;30618:12;30611:19;;30270:366;;;:::o;30642:419::-;30808:4;30846:2;30835:9;30831:18;30823:26;;30895:9;30889:4;30885:20;30881:1;30870:9;30866:17;30859:47;30923:131;31049:4;30923:131;:::i;:::-;30915:139;;30642:419;;;:::o;31067:292::-;31207:34;31203:1;31195:6;31191:14;31184:58;31276:34;31271:2;31263:6;31259:15;31252:59;31345:6;31340:2;31332:6;31328:15;31321:31;31067:292;:::o;31365:366::-;31507:3;31528:67;31592:2;31587:3;31528:67;:::i;:::-;31521:74;;31604:93;31693:3;31604:93;:::i;:::-;31722:2;31717:3;31713:12;31706:19;;31365:366;;;:::o;31737:419::-;31903:4;31941:2;31930:9;31926:18;31918:26;;31990:9;31984:4;31980:20;31976:1;31965:9;31961:17;31954:47;32018:131;32144:4;32018:131;:::i;:::-;32010:139;;31737:419;;;:::o;32162:248::-;32302:34;32298:1;32290:6;32286:14;32279:58;32371:31;32366:2;32358:6;32354:15;32347:56;32162:248;:::o;32416:366::-;32558:3;32579:67;32643:2;32638:3;32579:67;:::i;:::-;32572:74;;32655:93;32744:3;32655:93;:::i;:::-;32773:2;32768:3;32764:12;32757:19;;32416:366;;;:::o;32788:419::-;32954:4;32992:2;32981:9;32977:18;32969:26;;33041:9;33035:4;33031:20;33027:1;33016:9;33012:17;33005:47;33069:131;33195:4;33069:131;:::i;:::-;33061:139;;32788:419;;;:::o;33213:175::-;33353:27;33349:1;33341:6;33337:14;33330:51;33213:175;:::o;33394:366::-;33536:3;33557:67;33621:2;33616:3;33557:67;:::i;:::-;33550:74;;33633:93;33722:3;33633:93;:::i;:::-;33751:2;33746:3;33742:12;33735:19;;33394:366;;;:::o;33766:419::-;33932:4;33970:2;33959:9;33955:18;33947:26;;34019:9;34013:4;34009:20;34005:1;33994:9;33990:17;33983:47;34047:131;34173:4;34047:131;:::i;:::-;34039:139;;33766:419;;;:::o;34191:182::-;34331:34;34327:1;34319:6;34315:14;34308:58;34191:182;:::o;34379:366::-;34521:3;34542:67;34606:2;34601:3;34542:67;:::i;:::-;34535:74;;34618:93;34707:3;34618:93;:::i;:::-;34736:2;34731:3;34727:12;34720:19;;34379:366;;;:::o;34751:419::-;34917:4;34955:2;34944:9;34940:18;34932:26;;35004:9;34998:4;34994:20;34990:1;34979:9;34975:17;34968:47;35032:131;35158:4;35032:131;:::i;:::-;35024:139;;34751:419;;;:::o;35176:225::-;35316:34;35312:1;35304:6;35300:14;35293:58;35385:8;35380:2;35372:6;35368:15;35361:33;35176:225;:::o;35407:366::-;35549:3;35570:67;35634:2;35629:3;35570:67;:::i;:::-;35563:74;;35646:93;35735:3;35646:93;:::i;:::-;35764:2;35759:3;35755:12;35748:19;;35407:366;;;:::o;35779:419::-;35945:4;35983:2;35972:9;35968:18;35960:26;;36032:9;36026:4;36022:20;36018:1;36007:9;36003:17;35996:47;36060:131;36186:4;36060:131;:::i;:::-;36052:139;;35779:419;;;:::o;36204:225::-;36344:34;36340:1;36332:6;36328:14;36321:58;36413:8;36408:2;36400:6;36396:15;36389:33;36204:225;:::o;36435:366::-;36577:3;36598:67;36662:2;36657:3;36598:67;:::i;:::-;36591:74;;36674:93;36763:3;36674:93;:::i;:::-;36792:2;36787:3;36783:12;36776:19;;36435:366;;;:::o;36807:419::-;36973:4;37011:2;37000:9;36996:18;36988:26;;37060:9;37054:4;37050:20;37046:1;37035:9;37031:17;37024:47;37088:131;37214:4;37088:131;:::i;:::-;37080:139;;36807:419;;;:::o;37232:225::-;37372:34;37368:1;37360:6;37356:14;37349:58;37441:8;37436:2;37428:6;37424:15;37417:33;37232:225;:::o;37463:366::-;37605:3;37626:67;37690:2;37685:3;37626:67;:::i;:::-;37619:74;;37702:93;37791:3;37702:93;:::i;:::-;37820:2;37815:3;37811:12;37804:19;;37463:366;;;:::o;37835:419::-;38001:4;38039:2;38028:9;38024:18;38016:26;;38088:9;38082:4;38078:20;38074:1;38063:9;38059:17;38052:47;38116:131;38242:4;38116:131;:::i;:::-;38108:139;;37835:419;;;:::o;38260:175::-;38400:27;38396:1;38388:6;38384:14;38377:51;38260:175;:::o;38441:366::-;38583:3;38604:67;38668:2;38663:3;38604:67;:::i;:::-;38597:74;;38680:93;38769:3;38680:93;:::i;:::-;38798:2;38793:3;38789:12;38782:19;;38441:366;;;:::o;38813:419::-;38979:4;39017:2;39006:9;39002:18;38994:26;;39066:9;39060:4;39056:20;39052:1;39041:9;39037:17;39030:47;39094:131;39220:4;39094:131;:::i;:::-;39086:139;;38813:419;;;:::o;39238:169::-;39378:21;39374:1;39366:6;39362:14;39355:45;39238:169;:::o;39413:366::-;39555:3;39576:67;39640:2;39635:3;39576:67;:::i;:::-;39569:74;;39652:93;39741:3;39652:93;:::i;:::-;39770:2;39765:3;39761:12;39754:19;;39413:366;;;:::o;39785:419::-;39951:4;39989:2;39978:9;39974:18;39966:26;;40038:9;40032:4;40028:20;40024:1;40013:9;40009:17;40002:47;40066:131;40192:4;40066:131;:::i;:::-;40058:139;;39785:419;;;:::o;40210:170::-;40350:22;40346:1;40338:6;40334:14;40327:46;40210:170;:::o;40386:366::-;40528:3;40549:67;40613:2;40608:3;40549:67;:::i;:::-;40542:74;;40625:93;40714:3;40625:93;:::i;:::-;40743:2;40738:3;40734:12;40727:19;;40386:366;;;:::o;40758:419::-;40924:4;40962:2;40951:9;40947:18;40939:26;;41011:9;41005:4;41001:20;40997:1;40986:9;40982:17;40975:47;41039:131;41165:4;41039:131;:::i;:::-;41031:139;;40758:419;;;:::o;41183:172::-;41323:24;41319:1;41311:6;41307:14;41300:48;41183:172;:::o;41361:366::-;41503:3;41524:67;41588:2;41583:3;41524:67;:::i;:::-;41517:74;;41600:93;41689:3;41600:93;:::i;:::-;41718:2;41713:3;41709:12;41702:19;;41361:366;;;:::o;41733:419::-;41899:4;41937:2;41926:9;41922:18;41914:26;;41986:9;41980:4;41976:20;41972:1;41961:9;41957:17;41950:47;42014:131;42140:4;42014:131;:::i;:::-;42006:139;;41733:419;;;:::o;42158:79::-;42197:7;42226:5;42215:16;;42158:79;;;:::o;42243:157::-;42348:45;42368:24;42386:5;42368:24;:::i;:::-;42348:45;:::i;:::-;42343:3;42336:58;42243:157;;:::o;42406:397::-;42546:3;42561:75;42632:3;42623:6;42561:75;:::i;:::-;42661:2;42656:3;42652:12;42645:19;;42674:75;42745:3;42736:6;42674:75;:::i;:::-;42774:2;42769:3;42765:12;42758:19;;42794:3;42787:10;;42406:397;;;;;:::o;42809:102::-;42851:8;42898:5;42895:1;42891:13;42870:34;;42809:102;;;:::o;42917:848::-;42978:5;42985:4;43009:6;43000:15;;43033:5;43024:14;;43047:712;43068:1;43058:8;43055:15;43047:712;;;43163:4;43158:3;43154:14;43148:4;43145:24;43142:50;;;43172:18;;:::i;:::-;43142:50;43222:1;43212:8;43208:16;43205:451;;;43637:4;43630:5;43626:16;43617:25;;43205:451;43687:4;43681;43677:15;43669:23;;43717:32;43740:8;43717:32;:::i;:::-;43705:44;;43047:712;;;42917:848;;;;;;;:::o;43771:1073::-;43825:5;44016:8;44006:40;;44037:1;44028:10;;44039:5;;44006:40;44065:4;44055:36;;44082:1;44073:10;;44084:5;;44055:36;44151:4;44199:1;44194:27;;;;44235:1;44230:191;;;;44144:277;;44194:27;44212:1;44203:10;;44214:5;;;44230:191;44275:3;44265:8;44262:17;44259:43;;;44282:18;;:::i;:::-;44259:43;44331:8;44328:1;44324:16;44315:25;;44366:3;44359:5;44356:14;44353:40;;;44373:18;;:::i;:::-;44353:40;44406:5;;;44144:277;;44530:2;44520:8;44517:16;44511:3;44505:4;44502:13;44498:36;44480:2;44470:8;44467:16;44462:2;44456:4;44453:12;44449:35;44433:111;44430:246;;;44586:8;44580:4;44576:19;44567:28;;44621:3;44614:5;44611:14;44608:40;;;44628:18;;:::i;:::-;44608:40;44661:5;;44430:246;44701:42;44739:3;44729:8;44723:4;44720:1;44701:42;:::i;:::-;44686:57;;;;44775:4;44770:3;44766:14;44759:5;44756:25;44753:51;;;44784:18;;:::i;:::-;44753:51;44833:4;44826:5;44822:16;44813:25;;43771:1073;;;;;;:::o;44850:285::-;44910:5;44934:23;44952:4;44934:23;:::i;:::-;44926:31;;44978:27;44996:8;44978:27;:::i;:::-;44966:39;;45024:104;45061:66;45051:8;45045:4;45024:104;:::i;:::-;45015:113;;44850:285;;;;:::o;45141:181::-;45281:33;45277:1;45269:6;45265:14;45258:57;45141:181;:::o;45328:366::-;45470:3;45491:67;45555:2;45550:3;45491:67;:::i;:::-;45484:74;;45567:93;45656:3;45567:93;:::i;:::-;45685:2;45680:3;45676:12;45669:19;;45328:366;;;:::o;45700:419::-;45866:4;45904:2;45893:9;45889:18;45881:26;;45953:9;45947:4;45943:20;45939:1;45928:9;45924:17;45917:47;45981:131;46107:4;45981:131;:::i;:::-;45973:139;;45700:419;;;:::o;46125:180::-;46265:32;46261:1;46253:6;46249:14;46242:56;46125:180;:::o;46311:366::-;46453:3;46474:67;46538:2;46533:3;46474:67;:::i;:::-;46467:74;;46550:93;46639:3;46550:93;:::i;:::-;46668:2;46663:3;46659:12;46652:19;;46311:366;;;:::o;46683:419::-;46849:4;46887:2;46876:9;46872:18;46864:26;;46936:9;46930:4;46926:20;46922:1;46911:9;46907:17;46900:47;46964:131;47090:4;46964:131;:::i;:::-;46956:139;;46683:419;;;:::o;47108:221::-;47248:34;47244:1;47236:6;47232:14;47225:58;47317:4;47312:2;47304:6;47300:15;47293:29;47108:221;:::o;47335:366::-;47477:3;47498:67;47562:2;47557:3;47498:67;:::i;:::-;47491:74;;47574:93;47663:3;47574:93;:::i;:::-;47692:2;47687:3;47683:12;47676:19;;47335:366;;;:::o;47707:419::-;47873:4;47911:2;47900:9;47896:18;47888:26;;47960:9;47954:4;47950:20;47946:1;47935:9;47931:17;47924:47;47988:131;48114:4;47988:131;:::i;:::-;47980:139;;47707:419;;;:::o;48132:178::-;48272:30;48268:1;48260:6;48256:14;48249:54;48132:178;:::o;48316:366::-;48458:3;48479:67;48543:2;48538:3;48479:67;:::i;:::-;48472:74;;48555:93;48644:3;48555:93;:::i;:::-;48673:2;48668:3;48664:12;48657:19;;48316:366;;;:::o;48688:419::-;48854:4;48892:2;48881:9;48877:18;48869:26;;48941:9;48935:4;48931:20;48927:1;48916:9;48912:17;48905:47;48969:131;49095:4;48969:131;:::i;:::-;48961:139;;48688:419;;;:::o;49113:169::-;49253:21;49249:1;49241:6;49237:14;49230:45;49113:169;:::o;49288:366::-;49430:3;49451:67;49515:2;49510:3;49451:67;:::i;:::-;49444:74;;49527:93;49616:3;49527:93;:::i;:::-;49645:2;49640:3;49636:12;49629:19;;49288:366;;;:::o;49660:419::-;49826:4;49864:2;49853:9;49849:18;49841:26;;49913:9;49907:4;49903:20;49899:1;49888:9;49884:17;49877:47;49941:131;50067:4;49941:131;:::i;:::-;49933:139;;49660:419;;;:::o;50085:96::-;50119:8;50168:5;50163:3;50159:15;50138:36;;50085:96;;;:::o;50187:93::-;50224:7;50253:21;50268:5;50253:21;:::i;:::-;50242:32;;50187:93;;;:::o;50286:95::-;50322:7;50351:24;50369:5;50351:24;:::i;:::-;50340:35;;50286:95;;;:::o;50387:145::-;50486:39;50503:21;50518:5;50503:21;:::i;:::-;50486:39;:::i;:::-;50481:3;50474:52;50387:145;;:::o;50538:807::-;50756:3;50771:75;50842:3;50833:6;50771:75;:::i;:::-;50871:2;50866:3;50862:12;50855:19;;50884:75;50955:3;50946:6;50884:75;:::i;:::-;50984:2;50979:3;50975:12;50968:19;;50997:75;51068:3;51059:6;50997:75;:::i;:::-;51097:2;51092:3;51088:12;51081:19;;51110:75;51181:3;51172:6;51110:75;:::i;:::-;51210:2;51205:3;51201:12;51194:19;;51223:69;51288:3;51279:6;51223:69;:::i;:::-;51317:1;51312:3;51308:11;51301:18;;51336:3;51329:10;;50538:807;;;;;;;;:::o;51351:118::-;51438:24;51456:5;51438:24;:::i;:::-;51433:3;51426:37;51351:118;;:::o;51475:86::-;51521:7;51550:5;51539:16;;51475:86;;;:::o;51567:60::-;51595:3;51616:5;51609:12;;51567:60;;;:::o;51633:156::-;51690:9;51723:60;51739:43;51748:33;51775:5;51748:33;:::i;:::-;51739:43;:::i;:::-;51723:60;:::i;:::-;51710:73;;51633:156;;;:::o;51795:145::-;51889:44;51927:5;51889:44;:::i;:::-;51884:3;51877:57;51795:145;;:::o;51946:567::-;52130:4;52168:3;52157:9;52153:19;52145:27;;52182:71;52250:1;52239:9;52235:17;52226:6;52182:71;:::i;:::-;52263:79;52338:2;52327:9;52323:18;52314:6;52263:79;:::i;:::-;52352:72;52420:2;52409:9;52405:18;52396:6;52352:72;:::i;:::-;52434;52502:2;52491:9;52487:18;52478:6;52434:72;:::i;:::-;51946:567;;;;;;;:::o;52519:179::-;52659:31;52655:1;52647:6;52643:14;52636:55;52519:179;:::o;52704:366::-;52846:3;52867:67;52931:2;52926:3;52867:67;:::i;:::-;52860:74;;52943:93;53032:3;52943:93;:::i;:::-;53061:2;53056:3;53052:12;53045:19;;52704:366;;;:::o;53076:419::-;53242:4;53280:2;53269:9;53265:18;53257:26;;53329:9;53323:4;53319:20;53315:1;53304:9;53300:17;53293:47;53357:131;53483:4;53357:131;:::i;:::-;53349:139;;53076:419;;;:::o;53501:300::-;53641:34;53637:1;53629:6;53625:14;53618:58;53710:34;53705:2;53697:6;53693:15;53686:59;53779:14;53774:2;53766:6;53762:15;53755:39;53501:300;:::o;53807:366::-;53949:3;53970:67;54034:2;54029:3;53970:67;:::i;:::-;53963:74;;54046:93;54135:3;54046:93;:::i;:::-;54164:2;54159:3;54155:12;54148:19;;53807:366;;;:::o;54179:419::-;54345:4;54383:2;54372:9;54368:18;54360:26;;54432:9;54426:4;54422:20;54418:1;54407:9;54403:17;54396:47;54460:131;54586:4;54460:131;:::i;:::-;54452:139;;54179:419;;;:::o;54604:302::-;54744:34;54740:1;54732:6;54728:14;54721:58;54813:34;54808:2;54800:6;54796:15;54789:59;54882:16;54877:2;54869:6;54865:15;54858:41;54604:302;:::o;54912:366::-;55054:3;55075:67;55139:2;55134:3;55075:67;:::i;:::-;55068:74;;55151:93;55240:3;55151:93;:::i;:::-;55269:2;55264:3;55260:12;55253:19;;54912:366;;;:::o;55284:419::-;55450:4;55488:2;55477:9;55473:18;55465:26;;55537:9;55531:4;55527:20;55523:1;55512:9;55508:17;55501:47;55565:131;55691:4;55565:131;:::i;:::-;55557:139;;55284:419;;;:::o;55709:179::-;55849:31;55845:1;55837:6;55833:14;55826:55;55709:179;:::o;55894:366::-;56036:3;56057:67;56121:2;56116:3;56057:67;:::i;:::-;56050:74;;56133:93;56222:3;56133:93;:::i;:::-;56251:2;56246:3;56242:12;56235:19;;55894:366;;;:::o;56266:419::-;56432:4;56470:2;56459:9;56455:18;56447:26;;56519:9;56513:4;56509:20;56505:1;56494:9;56490:17;56483:47;56547:131;56673:4;56547:131;:::i;:::-;56539:139;;56266:419;;;:::o;56691:185::-;56731:1;56748:20;56766:1;56748:20;:::i;:::-;56743:25;;56782:20;56800:1;56782:20;:::i;:::-;56777:25;;56821:1;56811:35;;56826:18;;:::i;:::-;56811:35;56868:1;56865;56861:9;56856:14;;56691:185;;;;:::o;56882:640::-;57075:4;57113:3;57102:9;57098:19;57090:27;;57127:71;57195:1;57184:9;57180:17;57171:6;57127:71;:::i;:::-;57208:68;57272:2;57261:9;57257:18;57248:6;57208:68;:::i;:::-;57286:70;57352:2;57341:9;57337:18;57328:6;57286:70;:::i;:::-;57366:72;57434:2;57423:9;57419:18;57410:6;57366:72;:::i;:::-;57448:67;57510:3;57499:9;57495:19;57486:6;57448:67;:::i;:::-;56882:640;;;;;;;;:::o;57528:763::-;57755:4;57793:3;57782:9;57778:19;57770:27;;57807:71;57875:1;57864:9;57860:17;57851:6;57807:71;:::i;:::-;57888:68;57952:2;57941:9;57937:18;57928:6;57888:68;:::i;:::-;57966:70;58032:2;58021:9;58017:18;58008:6;57966:70;:::i;:::-;58046:72;58114:2;58103:9;58099:18;58090:6;58046:72;:::i;:::-;58128:73;58196:3;58185:9;58181:19;58172:6;58128:73;:::i;:::-;58211;58279:3;58268:9;58264:19;58255:6;58211:73;:::i;:::-;57528:763;;;;;;;;;:::o
Swarm Source
ipfs://209146505a33f37184ebe6312ec5cd3770a8875735c5c0e052f5aee7126a4757
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.