Contract
0x83d3f4769a19f1b43337888b0290f5473cf508b2
2
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
RealitioERC20
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at moonbeam.moonscan.io on 2022-02-03 */ pragma solidity >0.4.24; /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } pragma solidity >0.4.24; /** * @title ReailtioSafeMath256 * @dev Math operations with safety checks that throw on error */ library RealitioSafeMath256 { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } pragma solidity >0.4.24; /** * @title RealitioSafeMath32 * @dev Math operations with safety checks that throw on error * @dev Copy of SafeMath but for uint32 instead of uint256 * @dev Deleted functions we don't use */ library RealitioSafeMath32 { function add(uint32 a, uint32 b) internal pure returns (uint32) { uint32 c = a + b; assert(c >= a); return c; } } pragma solidity >0.4.18; contract BalanceHolder { IERC20 public token; mapping(address => uint256) public balanceOf; event LogWithdraw( address indexed user, uint256 amount ); function withdraw() public { uint256 bal = balanceOf[msg.sender]; balanceOf[msg.sender] = 0; require(token.transfer(msg.sender, bal)); emit LogWithdraw(msg.sender, bal); } } pragma solidity >0.4.24; contract RealitioERC20 is BalanceHolder { using RealitioSafeMath256 for uint256; using RealitioSafeMath32 for uint32; address constant NULL_ADDRESS = address(0); // History hash when no history is created, or history has been cleared bytes32 constant NULL_HASH = bytes32(0); // An unitinalized finalize_ts for a question will indicate an unanswered question. uint32 constant UNANSWERED = 0; // An unanswered reveal_ts for a commitment will indicate that it does not exist. uint256 constant COMMITMENT_NON_EXISTENT = 0; // Commit->reveal timeout is 1/8 of the question timeout (rounded down). uint32 constant COMMITMENT_TIMEOUT_RATIO = 8; event LogSetQuestionFee( address arbitrator, uint256 amount ); event LogNewTemplate( uint256 indexed template_id, address indexed user, string question_text ); event LogNewQuestion( bytes32 indexed question_id, address indexed user, uint256 template_id, string question, bytes32 indexed content_hash, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 nonce, uint256 created ); event LogFundAnswerBounty( bytes32 indexed question_id, uint256 bounty_added, uint256 bounty, address indexed user ); event LogNewAnswer( bytes32 answer, bytes32 indexed question_id, bytes32 history_hash, address indexed user, uint256 bond, uint256 ts, bool is_commitment ); event LogAnswerReveal( bytes32 indexed question_id, address indexed user, bytes32 indexed answer_hash, bytes32 answer, uint256 nonce, uint256 bond ); event LogNotifyOfArbitrationRequest( bytes32 indexed question_id, address indexed user ); event LogFinalize( bytes32 indexed question_id, bytes32 indexed answer ); event LogClaim( bytes32 indexed question_id, address indexed user, uint256 amount ); struct Question { bytes32 content_hash; address arbitrator; uint32 opening_ts; uint32 timeout; uint32 finalize_ts; bool is_pending_arbitration; uint256 bounty; bytes32 best_answer; bytes32 history_hash; uint256 bond; } // Stored in a mapping indexed by commitment_id, a hash of commitment hash, question, bond. struct Commitment { uint32 reveal_ts; bool is_revealed; bytes32 revealed_answer; } // Only used when claiming more bonds than fits into a transaction // Stored in a mapping indexed by question_id. struct Claim { address payee; uint256 last_bond; uint256 queued_funds; } uint256 nextTemplateID = 0; mapping(uint256 => uint256) public templates; mapping(uint256 => bytes32) public template_hashes; mapping(bytes32 => Question) public questions; mapping(bytes32 => Claim) public question_claims; mapping(bytes32 => Commitment) public commitments; mapping(address => uint256) public arbitrator_question_fees; modifier onlyArbitrator(bytes32 question_id) { require(msg.sender == questions[question_id].arbitrator, "msg.sender must be arbitrator"); _; } modifier stateAny() { _; } modifier stateNotCreated(bytes32 question_id) { require(questions[question_id].timeout == 0, "question must not exist"); _; } modifier stateOpen(bytes32 question_id) { require(questions[question_id].timeout > 0, "question must exist"); require(!questions[question_id].is_pending_arbitration, "question must not be pending arbitration"); uint32 finalize_ts = questions[question_id].finalize_ts; require(finalize_ts == UNANSWERED || finalize_ts > uint32(now), "finalization deadline must not have passed"); uint32 opening_ts = questions[question_id].opening_ts; require(opening_ts == 0 || opening_ts <= uint32(now), "opening date must have passed"); _; } modifier statePendingArbitration(bytes32 question_id) { require(questions[question_id].is_pending_arbitration, "question must be pending arbitration"); _; } modifier stateOpenOrPendingArbitration(bytes32 question_id) { require(questions[question_id].timeout > 0, "question must exist"); uint32 finalize_ts = questions[question_id].finalize_ts; require(finalize_ts == UNANSWERED || finalize_ts > uint32(now), "finalization dealine must not have passed"); uint32 opening_ts = questions[question_id].opening_ts; require(opening_ts == 0 || opening_ts <= uint32(now), "opening date must have passed"); _; } modifier stateFinalized(bytes32 question_id) { require(isFinalized(question_id), "question must be finalized"); _; } modifier bondMustDouble(bytes32 question_id, uint256 tokens) { require(tokens > 0, "bond must be positive"); require(tokens >= (questions[question_id].bond.mul(2)), "bond must be double at least previous bond"); _; } modifier previousBondMustNotBeatMaxPrevious(bytes32 question_id, uint256 max_previous) { if (max_previous > 0) { require(questions[question_id].bond <= max_previous, "bond must exceed max_previous"); } _; } function setToken(IERC20 _token) public { require(token == IERC20(0x0), "Token can only be initialized once"); token = _token; } /// @notice Constructor, sets up some initial templates /// @dev Creates some generalized templates for different question types used in the DApp. constructor() public { createTemplate('{"title": "%s", "type": "bool", "category": "%s", "lang": "%s"}'); createTemplate('{"title": "%s", "type": "uint", "decimals": 18, "category": "%s", "lang": "%s"}'); createTemplate('{"title": "%s", "type": "single-select", "outcomes": [%s], "category": "%s", "lang": "%s"}'); createTemplate('{"title": "%s", "type": "multiple-select", "outcomes": [%s], "category": "%s", "lang": "%s"}'); createTemplate('{"title": "%s", "type": "datetime", "category": "%s", "lang": "%s"}'); } /// @notice Function for arbitrator to set an optional per-question fee. /// @dev The per-question fee, charged when a question is asked, is intended as an anti-spam measure. /// @param fee The fee to be charged by the arbitrator when a question is asked function setQuestionFee(uint256 fee) stateAny() external { arbitrator_question_fees[msg.sender] = fee; emit LogSetQuestionFee(msg.sender, fee); } /// @notice Create a reusable template, which should be a JSON document. /// Placeholders should use gettext() syntax, eg %s. /// @dev Template data is only stored in the event logs, but its block number is kept in contract storage. /// @param content The template content /// @return The ID of the newly-created template, which is created sequentially. function createTemplate(string memory content) stateAny() public returns (uint256) { uint256 id = nextTemplateID; templates[id] = block.number; template_hashes[id] = keccak256(abi.encodePacked(content)); emit LogNewTemplate(id, msg.sender, content); nextTemplateID = id.add(1); return id; } /// @notice Create a new reusable template and use it to ask a question /// @dev Template data is only stored in the event logs, but its block number is kept in contract storage. /// @param content The template content /// @param question A string containing the parameters that will be passed into the template to make the question /// @param arbitrator The arbitration contract that will have the final word on the answer if there is a dispute /// @param timeout How long the contract should wait after the answer is changed before finalizing on that answer /// @param opening_ts If set, the earliest time it should be possible to answer the question. /// @param nonce A user-specified nonce used in the question ID. Change it to repeat a question. /// @return The ID of the newly-created template, which is created sequentially. function createTemplateAndAskQuestion( string memory content, string memory question, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 nonce ) // stateNotCreated is enforced by the internal _askQuestion public returns (bytes32) { uint256 template_id = createTemplate(content); return askQuestion(template_id, question, arbitrator, timeout, opening_ts, nonce); } /// @notice Ask a new question without a bounty and return the ID /// @dev Template data is only stored in the event logs, but its block number is kept in contract storage. /// @dev Calling without the token param will only work if there is no arbitrator-set question fee. /// @dev This has the same function signature as askQuestion() in the non-ERC20 version, which is optionally payable. /// @param template_id The ID number of the template the question will use /// @param question A string containing the parameters that will be passed into the template to make the question /// @param arbitrator The arbitration contract that will have the final word on the answer if there is a dispute /// @param timeout How long the contract should wait after the answer is changed before finalizing on that answer /// @param opening_ts If set, the earliest time it should be possible to answer the question. /// @param nonce A user-specified nonce used in the question ID. Change it to repeat a question. /// @return The ID of the newly-created question, created deterministically. function askQuestion(uint256 template_id, string memory question, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 nonce) // stateNotCreated is enforced by the internal _askQuestion public returns (bytes32) { require(templates[template_id] > 0, "template must exist"); bytes32 content_hash = keccak256(abi.encodePacked(template_id, opening_ts, question)); bytes32 question_id = keccak256(abi.encodePacked(content_hash, arbitrator, timeout, msg.sender, nonce)); _askQuestion(question_id, content_hash, arbitrator, timeout, opening_ts, 0); emit LogNewQuestion(question_id, msg.sender, template_id, question, content_hash, arbitrator, timeout, opening_ts, nonce, now); return question_id; } /// @notice Ask a new question with a bounty and return the ID /// @dev Template data is only stored in the event logs, but its block number is kept in contract storage. /// @param template_id The ID number of the template the question will use /// @param question A string containing the parameters that will be passed into the template to make the question /// @param arbitrator The arbitration contract that will have the final word on the answer if there is a dispute /// @param timeout How long the contract should wait after the answer is changed before finalizing on that answer /// @param opening_ts If set, the earliest time it should be possible to answer the question. /// @param nonce A user-specified nonce used in the question ID. Change it to repeat a question. /// @param tokens The combined initial question bounty and question fee /// @return The ID of the newly-created question, created deterministically. function askQuestionERC20(uint256 template_id, string memory question, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 nonce, uint256 tokens) // stateNotCreated is enforced by the internal _askQuestion public returns (bytes32) { _deductTokensOrRevert(tokens); require(templates[template_id] > 0, "template must exist"); bytes32 content_hash = keccak256(abi.encodePacked(template_id, opening_ts, question)); bytes32 question_id = keccak256(abi.encodePacked(content_hash, arbitrator, timeout, msg.sender, nonce)); _askQuestion(question_id, content_hash, arbitrator, timeout, opening_ts, tokens); emit LogNewQuestion(question_id, msg.sender, template_id, question, content_hash, arbitrator, timeout, opening_ts, nonce, now); return question_id; } function _deductTokensOrRevert(uint256 tokens) internal { if (tokens == 0) { return; } uint256 bal = balanceOf[msg.sender]; // Deduct any tokens you have in your internal balance first if (bal > 0) { if (bal >= tokens) { balanceOf[msg.sender] = bal.sub(tokens); return; } else { tokens = tokens.sub(bal); balanceOf[msg.sender] = 0; } } // Now we need to charge the rest from require(token.transferFrom(msg.sender, address(this), tokens), "Transfer of tokens failed, insufficient approved balance?"); return; } function _askQuestion(bytes32 question_id, bytes32 content_hash, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 tokens) stateNotCreated(question_id) internal { uint256 bounty = tokens; // A timeout of 0 makes no sense, and we will use this to check existence require(timeout > 0, "timeout must be positive"); require(timeout < 365 days, "timeout must be less than 365 days"); require(arbitrator != NULL_ADDRESS, "arbitrator must be set"); // The arbitrator can set a fee for asking a question. // This is intended as an anti-spam defence. // The fee is waived if the arbitrator is asking the question. // This allows them to set an impossibly high fee and make users proxy the question through them. // This would allow more sophisticated pricing, question whitelisting etc. if (msg.sender != arbitrator) { uint256 question_fee = arbitrator_question_fees[arbitrator]; require(bounty >= question_fee, "Tokens provided must cover question fee"); bounty = bounty.sub(question_fee); balanceOf[arbitrator] = balanceOf[arbitrator].add(question_fee); } questions[question_id].content_hash = content_hash; questions[question_id].arbitrator = arbitrator; questions[question_id].opening_ts = opening_ts; questions[question_id].timeout = timeout; questions[question_id].bounty = bounty; } /// @notice Add funds to the bounty for a question /// @dev Add bounty funds after the initial question creation. Can be done any time until the question is finalized. /// @param question_id The ID of the question you wish to fund /// @param tokens The number of tokens to fund function fundAnswerBountyERC20(bytes32 question_id, uint256 tokens) stateOpen(question_id) external { _deductTokensOrRevert(tokens); questions[question_id].bounty = questions[question_id].bounty.add(tokens); emit LogFundAnswerBounty(question_id, tokens, questions[question_id].bounty, msg.sender); } /// @notice Submit an answer for a question. /// @dev Adds the answer to the history and updates the current "best" answer. /// May be subject to front-running attacks; Substitute submitAnswerCommitment()->submitAnswerReveal() to prevent them. /// @param question_id The ID of the question /// @param answer The answer, encoded into bytes32 /// @param max_previous If specified, reverts if a bond higher than this was submitted after you sent your transaction. /// @param tokens The amount of tokens to submit function submitAnswerERC20(bytes32 question_id, bytes32 answer, uint256 max_previous, uint256 tokens) stateOpen(question_id) bondMustDouble(question_id, tokens) previousBondMustNotBeatMaxPrevious(question_id, max_previous) external { _deductTokensOrRevert(tokens); _addAnswerToHistory(question_id, answer, msg.sender, tokens, false); _updateCurrentAnswer(question_id, answer, questions[question_id].timeout); } // @notice Verify and store a commitment, including an appropriate timeout // @param question_id The ID of the question to store // @param commitment The ID of the commitment function _storeCommitment(bytes32 question_id, bytes32 commitment_id) internal { require(commitments[commitment_id].reveal_ts == COMMITMENT_NON_EXISTENT, "commitment must not already exist"); uint32 commitment_timeout = questions[question_id].timeout / COMMITMENT_TIMEOUT_RATIO; commitments[commitment_id].reveal_ts = uint32(now).add(commitment_timeout); } /// @notice Submit the hash of an answer, laying your claim to that answer if you reveal it in a subsequent transaction. /// @dev Creates a hash, commitment_id, uniquely identifying this answer, to this question, with this bond. /// The commitment_id is stored in the answer history where the answer would normally go. /// Does not update the current best answer - this is left to the later submitAnswerReveal() transaction. /// @param question_id The ID of the question /// @param answer_hash The hash of your answer, plus a nonce that you will later reveal /// @param max_previous If specified, reverts if a bond higher than this was submitted after you sent your transaction. /// @param _answerer If specified, the address to be given as the question answerer. Defaults to the sender. /// @param tokens Number of tokens sent /// @dev Specifying the answerer is useful if you want to delegate the commit-and-reveal to a third-party. function submitAnswerCommitmentERC20(bytes32 question_id, bytes32 answer_hash, uint256 max_previous, address _answerer, uint256 tokens) stateOpen(question_id) bondMustDouble(question_id, tokens) previousBondMustNotBeatMaxPrevious(question_id, max_previous) external { _deductTokensOrRevert(tokens); bytes32 commitment_id = keccak256(abi.encodePacked(question_id, answer_hash, tokens)); address answerer = (_answerer == NULL_ADDRESS) ? msg.sender : _answerer; _storeCommitment(question_id, commitment_id); _addAnswerToHistory(question_id, commitment_id, answerer, tokens, true); } /// @notice Submit the answer whose hash you sent in a previous submitAnswerCommitment() transaction /// @dev Checks the parameters supplied recreate an existing commitment, and stores the revealed answer /// Updates the current answer unless someone has since supplied a new answer with a higher bond /// msg.sender is intentionally not restricted to the user who originally sent the commitment; /// For example, the user may want to provide the answer+nonce to a third-party service and let them send the tx /// NB If we are pending arbitration, it will be up to the arbitrator to wait and see any outstanding reveal is sent /// @param question_id The ID of the question /// @param answer The answer, encoded as bytes32 /// @param nonce The nonce that, combined with the answer, recreates the answer_hash you gave in submitAnswerCommitment() /// @param bond The bond that you paid in your submitAnswerCommitment() transaction function submitAnswerReveal(bytes32 question_id, bytes32 answer, uint256 nonce, uint256 bond) stateOpenOrPendingArbitration(question_id) external { bytes32 answer_hash = keccak256(abi.encodePacked(answer, nonce)); bytes32 commitment_id = keccak256(abi.encodePacked(question_id, answer_hash, bond)); require(!commitments[commitment_id].is_revealed, "commitment must not have been revealed yet"); require(commitments[commitment_id].reveal_ts > uint32(now), "reveal deadline must not have passed"); commitments[commitment_id].revealed_answer = answer; commitments[commitment_id].is_revealed = true; if (bond == questions[question_id].bond) { _updateCurrentAnswer(question_id, answer, questions[question_id].timeout); } emit LogAnswerReveal(question_id, msg.sender, answer_hash, answer, nonce, bond); } function _addAnswerToHistory(bytes32 question_id, bytes32 answer_or_commitment_id, address answerer, uint256 bond, bool is_commitment) internal { bytes32 new_history_hash = keccak256(abi.encodePacked(questions[question_id].history_hash, answer_or_commitment_id, bond, answerer, is_commitment)); // Update the current bond level, if there's a bond (ie anything except arbitration) if (bond > 0) { questions[question_id].bond = bond; } questions[question_id].history_hash = new_history_hash; emit LogNewAnswer(answer_or_commitment_id, question_id, new_history_hash, answerer, bond, now, is_commitment); } function _updateCurrentAnswer(bytes32 question_id, bytes32 answer, uint32 timeout_secs) internal { questions[question_id].best_answer = answer; questions[question_id].finalize_ts = uint32(now).add(timeout_secs); } /// @notice Notify the contract that the arbitrator has been paid for a question, freezing it pending their decision. /// @dev The arbitrator contract is trusted to only call this if they've been paid, and tell us who paid them. /// @param question_id The ID of the question /// @param requester The account that requested arbitration /// @param max_previous If specified, reverts if a bond higher than this was submitted after you sent your transaction. function notifyOfArbitrationRequest(bytes32 question_id, address requester, uint256 max_previous) onlyArbitrator(question_id) stateOpen(question_id) previousBondMustNotBeatMaxPrevious(question_id, max_previous) external { require(questions[question_id].bond > 0, "Question must already have an answer when arbitration is requested"); questions[question_id].is_pending_arbitration = true; emit LogNotifyOfArbitrationRequest(question_id, requester); } /// @notice Submit the answer for a question, for use by the arbitrator. /// @dev Doesn't require (or allow) a bond. /// If the current final answer is correct, the account should be whoever submitted it. /// If the current final answer is wrong, the account should be whoever paid for arbitration. /// However, the answerer stipulations are not enforced by the contract. /// @param question_id The ID of the question /// @param answer The answer, encoded into bytes32 /// @param answerer The account credited with this answer for the purpose of bond claims function submitAnswerByArbitrator(bytes32 question_id, bytes32 answer, address answerer) onlyArbitrator(question_id) statePendingArbitration(question_id) external { require(answerer != NULL_ADDRESS, "answerer must be provided"); emit LogFinalize(question_id, answer); questions[question_id].is_pending_arbitration = false; _addAnswerToHistory(question_id, answer, answerer, 0, false); _updateCurrentAnswer(question_id, answer, 0); } /// @notice Report whether the answer to the specified question is finalized /// @param question_id The ID of the question /// @return Return true if finalized function isFinalized(bytes32 question_id) view public returns (bool) { uint32 finalize_ts = questions[question_id].finalize_ts; return ( !questions[question_id].is_pending_arbitration && (finalize_ts > UNANSWERED) && (finalize_ts <= uint32(now)) ); } /// @notice (Deprecated) Return the final answer to the specified question, or revert if there isn't one /// @param question_id The ID of the question /// @return The answer formatted as a bytes32 function getFinalAnswer(bytes32 question_id) stateFinalized(question_id) external view returns (bytes32) { return questions[question_id].best_answer; } /// @notice Return the final answer to the specified question, or revert if there isn't one /// @param question_id The ID of the question /// @return The answer formatted as a bytes32 function resultFor(bytes32 question_id) stateFinalized(question_id) external view returns (bytes32) { return questions[question_id].best_answer; } /// @notice Return the final answer to the specified question, provided it matches the specified criteria. /// @dev Reverts if the question is not finalized, or if it does not match the specified criteria. /// @param question_id The ID of the question /// @param content_hash The hash of the question content (template ID + opening time + question parameter string) /// @param arbitrator The arbitrator chosen for the question (regardless of whether they are asked to arbitrate) /// @param min_timeout The timeout set in the initial question settings must be this high or higher /// @param min_bond The bond sent with the final answer must be this high or higher /// @return The answer formatted as a bytes32 function getFinalAnswerIfMatches( bytes32 question_id, bytes32 content_hash, address arbitrator, uint32 min_timeout, uint256 min_bond ) stateFinalized(question_id) external view returns (bytes32) { require(content_hash == questions[question_id].content_hash, "content hash must match"); require(arbitrator == questions[question_id].arbitrator, "arbitrator must match"); require(min_timeout <= questions[question_id].timeout, "timeout must be long enough"); require(min_bond <= questions[question_id].bond, "bond must be high enough"); return questions[question_id].best_answer; } /// @notice Assigns the winnings (bounty and bonds) to everyone who gave the accepted answer /// Caller must provide the answer history, in reverse order /// @dev Works up the chain and assign bonds to the person who gave the right answer /// If someone gave the winning answer earlier, they must get paid from the higher bond /// That means we can't pay out the bond added at n until we have looked at n-1 /// The first answer is authenticated by checking against the stored history_hash. /// One of the inputs to history_hash is the history_hash before it, so we use that to authenticate the next entry, etc /// Once we get to a null hash we'll know we're done and there are no more answers. /// Usually you would call the whole thing in a single transaction, but if not then the data is persisted to pick up later. /// @param question_id The ID of the question /// @param history_hashes Second-last-to-first, the hash of each history entry. (Final one should be empty). /// @param addrs Last-to-first, the address of each answerer or commitment sender /// @param bonds Last-to-first, the bond supplied with each answer or commitment /// @param answers Last-to-first, each answer supplied, or commitment ID if the answer was supplied with commit->reveal function claimWinnings( bytes32 question_id, bytes32[] memory history_hashes, address[] memory addrs, uint256[] memory bonds, bytes32[] memory answers ) stateFinalized(question_id) public { require(history_hashes.length > 0, "at least one history hash entry must be provided"); // These are only set if we split our claim over multiple transactions. address payee = question_claims[question_id].payee; uint256 last_bond = question_claims[question_id].last_bond; uint256 queued_funds = question_claims[question_id].queued_funds; // Starts as the hash of the final answer submitted. It'll be cleared when we're done. // If we're splitting the claim over multiple transactions, it'll be the hash where we left off last time bytes32 last_history_hash = questions[question_id].history_hash; bytes32 best_answer = questions[question_id].best_answer; uint256 i; for (i = 0; i < history_hashes.length; i++) { // Check input against the history hash, and see which of 2 possible values of is_commitment fits. bool is_commitment = _verifyHistoryInputOrRevert(last_history_hash, history_hashes[i], answers[i], bonds[i], addrs[i]); queued_funds = queued_funds.add(last_bond); (queued_funds, payee) = _processHistoryItem( question_id, best_answer, queued_funds, payee, addrs[i], bonds[i], answers[i], is_commitment); // Line the bond up for next time, when it will be added to somebody's queued_funds last_bond = bonds[i]; last_history_hash = history_hashes[i]; } if (last_history_hash != NULL_HASH) { // We haven't yet got to the null hash (1st answer), ie the caller didn't supply the full answer chain. // Persist the details so we can pick up later where we left off later. // If we know who to pay we can go ahead and pay them out, only keeping back last_bond // (We always know who to pay unless all we saw were unrevealed commits) if (payee != NULL_ADDRESS) { _payPayee(question_id, payee, queued_funds); queued_funds = 0; } question_claims[question_id].payee = payee; question_claims[question_id].last_bond = last_bond; question_claims[question_id].queued_funds = queued_funds; } else { // There is nothing left below us so the payee can keep what remains _payPayee(question_id, payee, queued_funds.add(last_bond)); delete question_claims[question_id]; } questions[question_id].history_hash = last_history_hash; } function _payPayee(bytes32 question_id, address payee, uint256 value) internal { balanceOf[payee] = balanceOf[payee].add(value); emit LogClaim(question_id, payee, value); } function _verifyHistoryInputOrRevert( bytes32 last_history_hash, bytes32 history_hash, bytes32 answer, uint256 bond, address addr ) internal pure returns (bool) { if (last_history_hash == keccak256(abi.encodePacked(history_hash, answer, bond, addr, true)) ) { return true; } if (last_history_hash == keccak256(abi.encodePacked(history_hash, answer, bond, addr, false)) ) { return false; } revert("History input provided did not match the expected hash"); } function _processHistoryItem( bytes32 question_id, bytes32 best_answer, uint256 queued_funds, address payee, address addr, uint256 bond, bytes32 answer, bool is_commitment ) internal returns (uint256, address) { // For commit-and-reveal, the answer history holds the commitment ID instead of the answer. // We look at the referenced commitment ID and switch in the actual answer. if (is_commitment) { bytes32 commitment_id = answer; // If it's a commit but it hasn't been revealed, it will always be considered wrong. if (!commitments[commitment_id].is_revealed) { delete commitments[commitment_id]; return (queued_funds, payee); } else { answer = commitments[commitment_id].revealed_answer; delete commitments[commitment_id]; } } if (answer == best_answer) { if (payee == NULL_ADDRESS) { // The entry is for the first payee we come to, ie the winner. // They get the question bounty. payee = addr; queued_funds = queued_funds.add(questions[question_id].bounty); questions[question_id].bounty = 0; } else if (addr != payee) { // Answerer has changed, ie we found someone lower down who needs to be paid // The lower answerer will take over receiving bonds from higher answerer. // They should also be paid the takeover fee, which is set at a rate equivalent to their bond. // (This is our arbitrary rule, to give consistent right-answerers a defence against high-rollers.) // There should be enough for the fee, but if not, take what we have. // There's an edge case involving weird arbitrator behaviour where we may be short. uint256 answer_takeover_fee = (queued_funds >= bond) ? bond : queued_funds; // Settle up with the old (higher-bonded) payee _payPayee(question_id, payee, queued_funds.sub(answer_takeover_fee)); // Now start queued_funds again for the new (lower-bonded) payee payee = addr; queued_funds = answer_takeover_fee; } } return (queued_funds, payee); } /// @notice Convenience function to assign bounties/bonds for multiple questions in one go, then withdraw all your funds. /// Caller must provide the answer history for each question, in reverse order /// @dev Can be called by anyone to assign bonds/bounties, but funds are only withdrawn for the user making the call. /// @param question_ids The IDs of the questions you want to claim for /// @param lengths The number of history entries you will supply for each question ID /// @param hist_hashes In a single list for all supplied questions, the hash of each history entry. /// @param addrs In a single list for all supplied questions, the address of each answerer or commitment sender /// @param bonds In a single list for all supplied questions, the bond supplied with each answer or commitment /// @param answers In a single list for all supplied questions, each answer supplied, or commitment ID function claimMultipleAndWithdrawBalance( bytes32[] memory question_ids, uint256[] memory lengths, bytes32[] memory hist_hashes, address[] memory addrs, uint256[] memory bonds, bytes32[] memory answers ) stateAny() // The finalization checks are done in the claimWinnings function public { uint256 qi; uint256 i; for (qi = 0; qi < question_ids.length; qi++) { bytes32 qid = question_ids[qi]; uint256 ln = lengths[qi]; bytes32[] memory hh = new bytes32[](ln); address[] memory ad = new address[](ln); uint256[] memory bo = new uint256[](ln); bytes32[] memory an = new bytes32[](ln); uint256 j; for (j = 0; j < ln; j++) { hh[j] = hist_hashes[i]; ad[j] = addrs[i]; bo[j] = bonds[i]; an[j] = answers[i]; i++; } claimWinnings(qid, hh, ad, bo, an); } withdraw(); } /// @notice Returns the questions's content hash, identifying the question content /// @param question_id The ID of the question function getContentHash(bytes32 question_id) public view returns(bytes32) { return questions[question_id].content_hash; } /// @notice Returns the arbitrator address for the question /// @param question_id The ID of the question function getArbitrator(bytes32 question_id) public view returns(address) { return questions[question_id].arbitrator; } /// @notice Returns the timestamp when the question can first be answered /// @param question_id The ID of the question function getOpeningTS(bytes32 question_id) public view returns(uint32) { return questions[question_id].opening_ts; } /// @notice Returns the timeout in seconds used after each answer /// @param question_id The ID of the question function getTimeout(bytes32 question_id) public view returns(uint32) { return questions[question_id].timeout; } /// @notice Returns the timestamp at which the question will be/was finalized /// @param question_id The ID of the question function getFinalizeTS(bytes32 question_id) public view returns(uint32) { return questions[question_id].finalize_ts; } /// @notice Returns whether the question is pending arbitration /// @param question_id The ID of the question function isPendingArbitration(bytes32 question_id) public view returns(bool) { return questions[question_id].is_pending_arbitration; } /// @notice Returns the current total unclaimed bounty /// @dev Set back to zero once the bounty has been claimed /// @param question_id The ID of the question function getBounty(bytes32 question_id) public view returns(uint256) { return questions[question_id].bounty; } /// @notice Returns the current best answer /// @param question_id The ID of the question function getBestAnswer(bytes32 question_id) public view returns(bytes32) { return questions[question_id].best_answer; } /// @notice Returns the history hash of the question /// @param question_id The ID of the question /// @dev Updated on each answer, then rewound as each is claimed function getHistoryHash(bytes32 question_id) public view returns(bytes32) { return questions[question_id].history_hash; } /// @notice Returns the highest bond posted so far for a question /// @param question_id The ID of the question function getBond(bytes32 question_id) public view returns(uint256) { return questions[question_id].bond; } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bytes32","name":"answer_hash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"answer","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"}],"name":"LogAnswerReveal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"answer","type":"bytes32"}],"name":"LogFinalize","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"bounty_added","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bounty","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"LogFundAnswerBounty","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"answer","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"history_hash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"},{"indexed":false,"internalType":"bool","name":"is_commitment","type":"bool"}],"name":"LogNewAnswer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"template_id","type":"uint256"},{"indexed":false,"internalType":"string","name":"question","type":"string"},{"indexed":true,"internalType":"bytes32","name":"content_hash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"arbitrator","type":"address"},{"indexed":false,"internalType":"uint32","name":"timeout","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"opening_ts","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"created","type":"uint256"}],"name":"LogNewQuestion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"template_id","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"string","name":"question_text","type":"string"}],"name":"LogNewTemplate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"LogNotifyOfArbitrationRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"arbitrator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogSetQuestionFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogWithdraw","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"arbitrator_question_fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"template_id","type":"uint256"},{"internalType":"string","name":"question","type":"string"},{"internalType":"address","name":"arbitrator","type":"address"},{"internalType":"uint32","name":"timeout","type":"uint32"},{"internalType":"uint32","name":"opening_ts","type":"uint32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"askQuestion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"template_id","type":"uint256"},{"internalType":"string","name":"question","type":"string"},{"internalType":"address","name":"arbitrator","type":"address"},{"internalType":"uint32","name":"timeout","type":"uint32"},{"internalType":"uint32","name":"opening_ts","type":"uint32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"askQuestionERC20","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"question_ids","type":"bytes32[]"},{"internalType":"uint256[]","name":"lengths","type":"uint256[]"},{"internalType":"bytes32[]","name":"hist_hashes","type":"bytes32[]"},{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256[]","name":"bonds","type":"uint256[]"},{"internalType":"bytes32[]","name":"answers","type":"bytes32[]"}],"name":"claimMultipleAndWithdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32[]","name":"history_hashes","type":"bytes32[]"},{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256[]","name":"bonds","type":"uint256[]"},{"internalType":"bytes32[]","name":"answers","type":"bytes32[]"}],"name":"claimWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"commitments","outputs":[{"internalType":"uint32","name":"reveal_ts","type":"uint32"},{"internalType":"bool","name":"is_revealed","type":"bool"},{"internalType":"bytes32","name":"revealed_answer","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"content","type":"string"}],"name":"createTemplate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"content","type":"string"},{"internalType":"string","name":"question","type":"string"},{"internalType":"address","name":"arbitrator","type":"address"},{"internalType":"uint32","name":"timeout","type":"uint32"},{"internalType":"uint32","name":"opening_ts","type":"uint32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"createTemplateAndAskQuestion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"fundAnswerBountyERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getArbitrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getBestAnswer","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getBounty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getContentHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getFinalAnswer","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"content_hash","type":"bytes32"},{"internalType":"address","name":"arbitrator","type":"address"},{"internalType":"uint32","name":"min_timeout","type":"uint32"},{"internalType":"uint256","name":"min_bond","type":"uint256"}],"name":"getFinalAnswerIfMatches","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getFinalizeTS","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getHistoryHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getOpeningTS","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getTimeout","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"isPendingArbitration","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"address","name":"requester","type":"address"},{"internalType":"uint256","name":"max_previous","type":"uint256"}],"name":"notifyOfArbitrationRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"question_claims","outputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"uint256","name":"last_bond","type":"uint256"},{"internalType":"uint256","name":"queued_funds","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"questions","outputs":[{"internalType":"bytes32","name":"content_hash","type":"bytes32"},{"internalType":"address","name":"arbitrator","type":"address"},{"internalType":"uint32","name":"opening_ts","type":"uint32"},{"internalType":"uint32","name":"timeout","type":"uint32"},{"internalType":"uint32","name":"finalize_ts","type":"uint32"},{"internalType":"bool","name":"is_pending_arbitration","type":"bool"},{"internalType":"uint256","name":"bounty","type":"uint256"},{"internalType":"bytes32","name":"best_answer","type":"bytes32"},{"internalType":"bytes32","name":"history_hash","type":"bytes32"},{"internalType":"uint256","name":"bond","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"resultFor","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setQuestionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer","type":"bytes32"},{"internalType":"address","name":"answerer","type":"address"}],"name":"submitAnswerByArbitrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer_hash","type":"bytes32"},{"internalType":"uint256","name":"max_previous","type":"uint256"},{"internalType":"address","name":"_answerer","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"submitAnswerCommitmentERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer","type":"bytes32"},{"internalType":"uint256","name":"max_previous","type":"uint256"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"submitAnswerERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"bond","type":"uint256"}],"name":"submitAnswerReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"template_hashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"templates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006002553480156200001657600080fd5b50620000446040518060600160405280603f81526020016200400f603f91396001600160e01b036200010316565b50620000726040518060800160405280604f8152602001620040eb604f91396001600160e01b036200010316565b50620000a06040518060800160405280605a815260200162004091605a91396001600160e01b036200010316565b50620000ce6040518060800160405280605c815260200162003fb3605c91396001600160e01b036200010316565b50620000fc6040518060800160405280604381526020016200404e604391396001600160e01b036200010316565b5062000285565b60025460008181526003602090815260408083204390555184519293928592918201918291908401908083835b60208310620001515780518252601f19909201916020918201910162000130565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206004600083815260200190815260200160002081905550336001600160a01b0316817fb87fb721c0a557bb8dff89a86796466931d82ba530a66a239263eb8735ade2e4856040518080602001828103825283818151815260200191508051906020019080838360005b838110156200020f578181015183820152602001620001f5565b50505050905090810190601f1680156200023d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3620002656001826200026e60201b620031c51790919060201c565b60025592915050565b6000828201838110156200027e57fe5b9392505050565b613d1e80620002956000396000f3fe608060405234801561001057600080fd5b50600436106101b75760003560e01c80631101a0fd146101bc578063128b7a47146103ec57806312a203c31461040f578063144fa6d7146104655780632417395c1461048b5780632518904c146104a857806326d6c97b146104e157806328828b1e146104fe5780632f998a6f146108295780633ccfd60b146108585780634dc266b4146108605780634df6ca2a1461088f5780634e60f883146108ac57806351577ea9146108c9578063590158a7146108e65780636fa427421461092b57806370a0823114610951578063762c38fd146109775780637f8d429e14610a4657806382ffa9f714610a77578063839df94514610a9457806383bf460914610ad65780638d552d4614610b7a578063924532fb14610b9757806395addb9014610bb45780639e63fa6a14610c355780639f1025c614610c6b578063a1130d0414610c88578063a462fb7b14610dd5578063ac7b2a5f14610df2578063acae8f4e14610e30578063bc52565214610e4d578063d09cc57e14610dd5578063d4876b9f14610e6a578063f6a94ecb14610f3f578063fc0c546a14610f71578063fe92049d14610f79575b600080fd5b6103ea600480360360a08110156101d257600080fd5b81359190810190604081016020820135600160201b8111156101f357600080fd5b82018360208201111561020557600080fd5b803590602001918460208302840111600160201b8311171561022657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561027557600080fd5b82018360208201111561028757600080fd5b803590602001918460208302840111600160201b831117156102a857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156102f757600080fd5b82018360208201111561030957600080fd5b803590602001918460208302840111600160201b8311171561032a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561037957600080fd5b82018360208201111561038b57600080fd5b803590602001918460208302840111600160201b831117156103ac57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610fab945050505050565b005b6103ea6004803603604081101561040257600080fd5b508035906020013561123a565b610453600480360360a081101561042557600080fd5b508035906020810135906001600160a01b036040820135169063ffffffff6060820135169060800135611459565b60408051918252519081900360200190f35b6103ea6004803603602081101561047b57600080fd5b50356001600160a01b031661165a565b610453600480360360208110156104a157600080fd5b50356116c4565b6104c5600480360360208110156104be57600080fd5b50356116d9565b604080516001600160a01b039092168252519081900360200190f35b610453600480360360208110156104f757600080fd5b50356116f7565b6103ea600480360360c081101561051457600080fd5b810190602081018135600160201b81111561052e57600080fd5b82018360208201111561054057600080fd5b803590602001918460208302840111600160201b8311171561056157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105b057600080fd5b8201836020820111156105c257600080fd5b803590602001918460208302840111600160201b831117156105e357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561063257600080fd5b82018360208201111561064457600080fd5b803590602001918460208302840111600160201b8311171561066557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156106b457600080fd5b8201836020820111156106c657600080fd5b803590602001918460208302840111600160201b831117156106e757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561073657600080fd5b82018360208201111561074857600080fd5b803590602001918460208302840111600160201b8311171561076957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156107b857600080fd5b8201836020820111156107ca57600080fd5b803590602001918460208302840111600160201b831117156107eb57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061170c945050505050565b6103ea6004803603608081101561083f57600080fd5b5080359060208101359060408101359060600135611911565b6103ea611c07565b6103ea6004803603608081101561087657600080fd5b5080359060208101359060408101359060600135611ce0565b6103ea600480360360208110156108a557600080fd5b5035611fe8565b610453600480360360208110156108c257600080fd5b5035612037565b610453600480360360208110156108df57600080fd5b5035612049565b610903600480360360208110156108fc57600080fd5b503561205b565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b6104536004803603602081101561094157600080fd5b50356001600160a01b0316612086565b6104536004803603602081101561096757600080fd5b50356001600160a01b0316612098565b610453600480360360c081101561098d57600080fd5b81359190810190604081016020820135600160201b8111156109ae57600080fd5b8201836020820111156109c057600080fd5b803590602001918460018302840111600160201b831117156109e157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b0383351693505063ffffffff602083013581169260408101359091169150606001356120aa565b610a6360048036036020811015610a5c57600080fd5b503561231d565b604080519115158252519081900360200190f35b61045360048036036020811015610a8d57600080fd5b5035612379565b610ab160048036036020811015610aaa57600080fd5b503561238f565b6040805163ffffffff9094168452911515602084015282820152519081900360600190f35b61045360048036036020811015610aec57600080fd5b810190602081018135600160201b811115610b0657600080fd5b820183602082011115610b1857600080fd5b803590602001918460018302840111600160201b83111715610b3957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506123bb945050505050565b61045360048036036020811015610b9057600080fd5b5035612517565b610a6360048036036020811015610bad57600080fd5b503561252c565b610bd160048036036020811015610bca57600080fd5b5035612544565b604080519a8b526001600160a01b0390991660208b015263ffffffff9788168a8a015295871660608a015293909516608088015290151560a087015260c086015260e085019290925261010084019190915261012083015251908190036101400190f35b610c5260048036036020811015610c4b57600080fd5b50356125b0565b6040805163ffffffff9092168252519081900360200190f35b610c5260048036036020811015610c8157600080fd5b50356125d2565b610453600480360360c0811015610c9e57600080fd5b810190602081018135600160201b811115610cb857600080fd5b820183602082011115610cca57600080fd5b803590602001918460018302840111600160201b83111715610ceb57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610d3d57600080fd5b820183602082011115610d4f57600080fd5b803590602001918460018302840111600160201b83111715610d7057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b0383351693505063ffffffff602083013581169260408101359091169150606001356125f4565b61045360048036036020811015610deb57600080fd5b503561261c565b6103ea600480360360a0811015610e0857600080fd5b508035906020810135906040810135906001600160a01b03606082013516906080013561267e565b610c5260048036036020811015610e4657600080fd5b50356129a1565b61045360048036036020811015610e6357600080fd5b50356129c3565b610453600480360360e0811015610e8057600080fd5b81359190810190604081016020820135600160201b811115610ea157600080fd5b820183602082011115610eb357600080fd5b803590602001918460018302840111600160201b83111715610ed457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b0383351693505063ffffffff602083013581169260408101359091169150606081013590608001356129d5565b6103ea60048036036060811015610f5557600080fd5b508035906001600160a01b036020820135169060400135612c53565b6104c5612f4e565b6103ea60048036036060811015610f8f57600080fd5b50803590602081013590604001356001600160a01b0316612f5d565b84610fb58161231d565b610ff4576040805162461bcd60e51b815260206004820152601a6024820152600080516020613cc9833981519152604482015290519081900360640190fd5b60008551116110345760405162461bcd60e51b8152600401808060200182810382526030815260200180613bf96030913960400191505060405180910390fd5b600086815260066020908152604080832080546001820154600290920154600594859052928520938401546004909401546001600160a01b03909116949193915b8a518110156111765760006110d9848d848151811061109057fe5b60200260200101518b85815181106110a457fe5b60200260200101518d86815181106110b857fe5b60200260200101518f87815181106110cc57fe5b60200260200101516130cd565b90506110eb858763ffffffff6131c516565b94506111368d84878a8f878151811061110057fe5b60200260200101518f888151811061111457fe5b60200260200101518f898151811061112857fe5b6020026020010151886131dd565b809850819650505089828151811061114a57fe5b602002602001015195508b828151811061116057fe5b6020908102919091010151935050600101611075565b82156111d4576001600160a01b0386161561119b576111968c8786613309565b600093505b60008c815260066020526040902080546001600160a01b0319166001600160a01b03881617815560018101869055600201849055611216565b6111ee8c876111e9878963ffffffff6131c516565b613309565b60008c815260066020526040812080546001600160a01b031916815560018101829055600201555b50506000998a52600560208190526040909a20909901989098555050505050505050565b6000828152600560205260409020600101548290600160c01b900463ffffffff1661129a576040805162461bcd60e51b81526020600482015260136024820152600080516020613a49833981519152604482015290519081900360640190fd5b60008181526005602052604090206002015460ff16156112eb5760405162461bcd60e51b8152600401808060200182810382526028815260200180613bd16028913960400191505060405180910390fd5b600081815260056020526040902060010154600160e01b900463ffffffff1680158061132257504263ffffffff168163ffffffff16115b61135d5760405162461bcd60e51b815260040180806020018281038252602a8152602001806139fb602a913960400191505060405180910390fd5b600082815260056020526040902060010154600160a01b900463ffffffff1680158061139557504263ffffffff168163ffffffff1611155b6113d4576040805162461bcd60e51b815260206004820152601d6024820152600080516020613c29833981519152604482015290519081900360640190fd5b6113dd8461338c565b6000858152600560205260409020600301546113ff908563ffffffff6131c516565b6000868152600560209081526040918290206003018390558151878152908101929092528051339288927f54d68405b79f2aa4fd4e8db7b67844ad254cf8f208aac476c2894134a9deab6692918290030190a35050505050565b6000856114658161231d565b6114a4576040805162461bcd60e51b815260206004820152601a6024820152600080516020613cc9833981519152604482015290519081900360640190fd5b6000878152600560205260409020548614611500576040805162461bcd60e51b81526020600482015260176024820152760c6dedce8cadce840d0c2e6d040daeae6e840dac2e8c6d604b1b604482015290519081900360640190fd5b6000878152600560205260409020600101546001600160a01b03868116911614611569576040805162461bcd60e51b81526020600482015260156024820152740c2e4c4d2e8e4c2e8dee440daeae6e840dac2e8c6d605b1b604482015290519081900360640190fd5b60008781526005602052604090206001015463ffffffff600160c01b909104811690851611156115de576040805162461bcd60e51b815260206004820152601b60248201527a0e8d2dacadeeae840daeae6e840c4ca40d8dedcce40cadcdeeaced602b1b604482015290519081900360640190fd5b60008781526005602052604090206006015483111561163f576040805162461bcd60e51b81526020600482015260186024820152770c4dedcc840daeae6e840c4ca40d0d2ced040cadcdeeaced60431b604482015290519081900360640190fd5b50505060009384525050600560205250604090206004015490565b6000546001600160a01b0316156116a25760405162461bcd60e51b8152600401808060200182810382526022815260200180613aff6022913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60009081526005602052604090206003015490565b6000908152600560205260409020600101546001600160a01b031690565b60009081526005602052604090206006015490565b6000805b87518210156118ff57600088838151811061172757fe5b60200260200101519050600088848151811061173f57fe5b60200260200101519050606081604051908082528060200260200182016040528015611775578160200160208202803883390190505b5090506060826040519080825280602002602001820160405280156117a4578160200160208202803883390190505b5090506060836040519080825280602002602001820160405280156117d3578160200160208202803883390190505b509050606084604051908082528060200260200182016040528015611802578160200160208202803883390190505b50905060005b858110156118df578c888151811061181c57fe5b602002602001015185828151811061183057fe5b6020026020010181815250508b888151811061184857fe5b602002602001015184828151811061185c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508a888151811061188857fe5b602002602001015183828151811061189c57fe5b6020026020010181815250508988815181106118b457fe5b60200260200101518282815181106118c857fe5b602090810291909101015260019788019701611808565b6118ec8786868686610fab565b5050600190960195506117109350505050565b611907611c07565b5050505050505050565b6000848152600560205260409020600101548490600160c01b900463ffffffff16611971576040805162461bcd60e51b81526020600482015260136024820152600080516020613a49833981519152604482015290519081900360640190fd5b60008181526005602052604090206002015460ff16156119c25760405162461bcd60e51b8152600401808060200182810382526028815260200180613bd16028913960400191505060405180910390fd5b600081815260056020526040902060010154600160e01b900463ffffffff168015806119f957504263ffffffff168163ffffffff16115b611a345760405162461bcd60e51b815260040180806020018281038252602a8152602001806139fb602a913960400191505060405180910390fd5b600082815260056020526040902060010154600160a01b900463ffffffff16801580611a6c57504263ffffffff168163ffffffff1611155b611aab576040805162461bcd60e51b815260206004820152601d6024820152600080516020613c29833981519152604482015290519081900360640190fd5b868460008111611afa576040805162461bcd60e51b8152602060048201526015602482015274626f6e64206d75737420626520706f73697469766560581b604482015290519081900360640190fd5b600082815260056020526040902060060154611b1d90600263ffffffff6134c316565b811015611b5b5760405162461bcd60e51b815260040180806020018281038252602a815260200180613a69602a913960400191505060405180910390fd5b88878015611bb757600082815260056020526040902060060154811015611bb7576040805162461bcd60e51b815260206004820152601d6024820152600080516020613b4a833981519152604482015290519081900360640190fd5b611bc08861338c565b611bce8b8b338b60006134e7565b60008b815260056020526040902060010154611bfa908c908c90600160c01b900463ffffffff166135db565b5050505050505050505050565b3360008181526001602090815260408083208054908490558354825163a9059cbb60e01b8152600481019690965260248601829052915190946001600160a01b039092169363a9059cbb93604480850194919392918390030190829087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b505050506040513d6020811015611c9c57600080fd5b5051611ca757600080fd5b60408051828152905133917f4ce7033d118120e254016dccf195288400b28fc8936425acd5f17ce2df3ab708919081900360200190a250565b6000848152600560205260409020600101548490600160c01b900463ffffffff16611d40576040805162461bcd60e51b81526020600482015260136024820152600080516020613a49833981519152604482015290519081900360640190fd5b600081815260056020526040902060010154600160e01b900463ffffffff16801580611d7757504263ffffffff168163ffffffff16115b611db25760405162461bcd60e51b8152600401808060200182810382526029815260200180613b216029913960400191505060405180910390fd5b600082815260056020526040902060010154600160a01b900463ffffffff16801580611dea57504263ffffffff168163ffffffff1611155b611e29576040805162461bcd60e51b815260206004820152601d6024820152600080516020613c29833981519152604482015290519081900360640190fd5b604080516020808201899052818301889052825180830384018152606083018452805190820120608083018b905260a0830181905260c08084018990528451808503909101815260e090930184528251928201929092206000818152600790925292902054909190600160201b900460ff1615611ed75760405162461bcd60e51b815260040180806020018281038252602a815260200180613a93602a913960400191505060405180910390fd5b60008181526007602052604090205463ffffffff428116911611611f2c5760405162461bcd60e51b8152600401808060200182810382526024815260200180613b6a6024913960400191505060405180910390fd5b6000818152600760209081526040808320600181018c9055805460ff60201b1916600160201b1790558b83526005909152902060060154861415611f9657600089815260056020526040902060010154611f96908a908a90600160c01b900463ffffffff166135db565b60408051898152602081018990528082018890529051839133918c917fa7b2d313bc7a062e30b2c3b811aa4c9faf09755a6b4ea3bf42deff920944332f919081900360600190a4505050505050505050565b336000818152600860209081526040918290208490558151928352820183905280517fdca703d022171824d3d639b33c1525fd2338120b4cfb89507c0b59596893acda9281900390910190a150565b60046020526000908152604090205481565b60009081526005602052604090205490565b6006602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b60086020526000908152604090205481565b60016020526000908152604090205481565b600086815260036020526040812054612100576040805162461bcd60e51b81526020600482015260136024820152721d195b5c1b185d19481b5d5cdd08195e1a5cdd606a1b604482015290519081900360640190fd5b6000878488604051602001808481526020018363ffffffff1663ffffffff1660e01b815260040182805190602001908083835b602083106121525780518252601f199092019160209182019101612133565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040528051906020012090506000818787338760405160200180868152602001856001600160a01b03166001600160a01b031660601b81526014018463ffffffff1663ffffffff1660e01b8152600401836001600160a01b03166001600160a01b031660601b8152601401828152602001955050505050506040516020818303038152906040528051906020012090506122248183898989600061363c565b81336001600160a01b0316826000805160206139a58339815191528c8c8c8c8c8c426040518088815260200180602001876001600160a01b03166001600160a01b031681526020018663ffffffff1663ffffffff1681526020018563ffffffff1663ffffffff168152602001848152602001838152602001828103825288818151815260200191508051906020019080838360005b838110156122d15781810151838201526020016122b9565b50505050905090810190601f1680156122fe5780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a498975050505050505050565b60008181526005602052604081206001810154600290910154600160e01b90910463ffffffff169060ff1615801561235a575063ffffffff811615155b801561237257504263ffffffff168163ffffffff1611155b9392505050565b6000908152600560208190526040909120015490565b6007602052600090815260409020805460019091015463ffffffff821691600160201b900460ff169083565b60025460008181526003602090815260408083204390555184519293928592918201918291908401908083835b602083106124075780518252601f1990920191602091820191016123e8565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206004600083815260200190815260200160002081905550336001600160a01b0316817fb87fb721c0a557bb8dff89a86796466931d82ba530a66a239263eb8735ade2e4856040518080602001828103825283818151815260200191508051906020019080838360005b838110156124c35781810151838201526020016124ab565b50505050905090810190601f1680156124f05780820380516001836020036101000a031916815260200191505b509250505060405180910390a361250e81600163ffffffff6131c516565b60025592915050565b60009081526005602052604090206004015490565b60009081526005602052604090206002015460ff1690565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460069095015493956001600160a01b0384169563ffffffff600160a01b8604811696600160c01b8704821696600160e01b90049091169460ff16939291908a565b600090815260056020526040902060010154600160a01b900463ffffffff1690565b600090815260056020526040902060010154600160c01b900463ffffffff1690565b600080612600886123bb565b90506126108188888888886120aa565b98975050505050505050565b6000816126288161231d565b612667576040805162461bcd60e51b815260206004820152601a6024820152600080516020613cc9833981519152604482015290519081900360640190fd5b505060009081526005602052604090206004015490565b6000858152600560205260409020600101548590600160c01b900463ffffffff166126de576040805162461bcd60e51b81526020600482015260136024820152600080516020613a49833981519152604482015290519081900360640190fd5b60008181526005602052604090206002015460ff161561272f5760405162461bcd60e51b8152600401808060200182810382526028815260200180613bd16028913960400191505060405180910390fd5b600081815260056020526040902060010154600160e01b900463ffffffff1680158061276657504263ffffffff168163ffffffff16115b6127a15760405162461bcd60e51b815260040180806020018281038252602a8152602001806139fb602a913960400191505060405180910390fd5b600082815260056020526040902060010154600160a01b900463ffffffff168015806127d957504263ffffffff168163ffffffff1611155b612818576040805162461bcd60e51b815260206004820152601d6024820152600080516020613c29833981519152604482015290519081900360640190fd5b878460008111612867576040805162461bcd60e51b8152602060048201526015602482015274626f6e64206d75737420626520706f73697469766560581b604482015290519081900360640190fd5b60008281526005602052604090206006015461288a90600263ffffffff6134c316565b8110156128c85760405162461bcd60e51b815260040180806020018281038252602a815260200180613a69602a913960400191505060405180910390fd5b8988801561292457600082815260056020526040902060060154811015612924576040805162461bcd60e51b815260206004820152601d6024820152600080516020613b4a833981519152604482015290519081900360640190fd5b61292d8861338c565b6040805160208082018f90528183018e905260608083018c9052835180840390910181526080909201909252805191012060006001600160a01b038b1615612975578a612977565b335b90506129838e836138c5565b6129918e83838d60016134e7565b5050505050505050505050505050565b600090815260056020526040902060010154600160e01b900463ffffffff1690565b60036020526000908152604090205481565b60006129e08261338c565b600088815260036020526040902054612a36576040805162461bcd60e51b81526020600482015260136024820152721d195b5c1b185d19481b5d5cdd08195e1a5cdd606a1b604482015290519081900360640190fd5b6000888589604051602001808481526020018363ffffffff1663ffffffff1660e01b815260040182805190602001908083835b60208310612a885780518252601f199092019160209182019101612a69565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040528051906020012090506000818888338860405160200180868152602001856001600160a01b03166001600160a01b031660601b81526014018463ffffffff1663ffffffff1660e01b8152600401836001600160a01b03166001600160a01b031660601b815260140182815260200195505050505050604051602081830303815290604052805190602001209050612b5981838a8a8a8961363c565b81336001600160a01b0316826000805160206139a58339815191528d8d8d8d8d8d426040518088815260200180602001876001600160a01b03166001600160a01b031681526020018663ffffffff1663ffffffff1681526020018563ffffffff1663ffffffff168152602001848152602001838152602001828103825288818151815260200191508051906020019080838360005b83811015612c06578181015183820152602001612bee565b50505050905090810190601f168015612c335780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a49998505050505050505050565b60008381526005602052604090206001015483906001600160a01b03163314612cb1576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ca9833981519152604482015290519081900360640190fd5b6000848152600560205260409020600101548490600160c01b900463ffffffff16612d11576040805162461bcd60e51b81526020600482015260136024820152600080516020613a49833981519152604482015290519081900360640190fd5b60008181526005602052604090206002015460ff1615612d625760405162461bcd60e51b8152600401808060200182810382526028815260200180613bd16028913960400191505060405180910390fd5b600081815260056020526040902060010154600160e01b900463ffffffff16801580612d9957504263ffffffff168163ffffffff16115b612dd45760405162461bcd60e51b815260040180806020018281038252602a8152602001806139fb602a913960400191505060405180910390fd5b600082815260056020526040902060010154600160a01b900463ffffffff16801580612e0c57504263ffffffff168163ffffffff1611155b612e4b576040805162461bcd60e51b815260206004820152601d6024820152600080516020613c29833981519152604482015290519081900360640190fd5b86858015612ea757600082815260056020526040902060060154811015612ea7576040805162461bcd60e51b815260206004820152601d6024820152600080516020613b4a833981519152604482015290519081900360640190fd5b600089815260056020526040902060060154612ef45760405162461bcd60e51b8152600401808060200182810382526042815260200180613abd6042913960600191505060405180910390fd5b600089815260056020526040808220600201805460ff19166001179055516001600160a01b038a16918b917f75d7939999bc902187c4aed400872883e445145f1983539166f783fa040b47629190a3505050505050505050565b6000546001600160a01b031681565b60008381526005602052604090206001015483906001600160a01b03163314612fbb576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ca9833981519152604482015290519081900360640190fd5b600084815260056020526040902060020154849060ff1661300d5760405162461bcd60e51b8152600401808060200182810382526024815260200180613a256024913960400191505060405180910390fd5b6001600160a01b038316613064576040805162461bcd60e51b8152602060048201526019602482015278185b9cddd95c995c881b5d5cdd081899481c1c9bdd9a591959603a1b604482015290519081900360640190fd5b604051849086907f18d760beffe3717270cd90d9d920ec1a48c194e9ad7bba23eb1c92d3eb974f9790600090a36000858152600560205260408120600201805460ff191690556130ba90869086908690806134e7565b6130c6858560006135db565b5050505050565b604080516020808201879052818301869052606080830186905284901b6001600160601b0319166080830152600160f81b6094830152825180830360750181526095909201909252805191012060009086141561312c575060016131bc565b604080516020808201889052818301879052606080830187905285901b6001600160601b0319166080830152600060948301528251808303607501815260959092019092528051910120861415613185575060006131bc565b60405162461bcd60e51b81526004018080602001828103825260368152602001806139c56036913960400191505060405180910390fd5b95945050505050565b6000828201838110156131d457fe5b90505b92915050565b6000808215613255576000848152600760205260409020548490600160201b900460ff1661322d576000908152600760205260408120805464ffffffffff191681556001015550869050856132fc565b6000908152600760205260408120600181018054825464ffffffffff19169092559190915593505b888414156132f6576001600160a01b0387166132ac5760008a815260056020526040902060030154959650869561329390899063ffffffff6131c516565b60008b81526005602052604081206003015597506132f6565b866001600160a01b0316866001600160a01b0316146132f6576000858910156132d557886132d7565b855b90506132ee8b896111e98c8563ffffffff61397a16565b869750809850505b50869050855b9850989650505050505050565b6001600160a01b038216600090815260016020526040902054613332908263ffffffff6131c516565b6001600160a01b0383166000818152600160209081526040918290209390935580518481529051919286927f9c121aff33b50c1a53fef034ebec5f83da2d5a5187048f9c76c397ba27c1a1a69281900390910190a3505050565b80613396576134c0565b3360009081526001602052604090205480156133fc578181106133d9576133c3818363ffffffff61397a16565b33600090815260016020526040902055506134c0565b6133e9828263ffffffff61397a16565b3360009081526001602052604081205591505b60008054604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561345757600080fd5b505af115801561346b573d6000803e3d6000fd5b505050506040513d602081101561348157600080fd5b50516134be5760405162461bcd60e51b8152600401808060200182810382526039815260200180613c706039913960400191505060405180910390fd5b505b50565b6000826134d2575060006131d7565b828202828482816134df57fe5b04146131d457fe5b60008581526005602081815260409283902090910154825180830191909152808301879052606080820186905286901b6001600160601b031916608082015283151560f81b6094820152825180820360750181526095909101909252815191012082156135635760008681526005602052604090206006018390555b6000868152600560208181526040928390209091018390558151878152908101839052808201859052426060820152831515608082015290516001600160a01b0386169188917fe47ca4ebbbc2990134d1168821f38c5e177f3d5ee564bffeadeaa351905e62219181900360a00190a3505050505050565b600083815260056020526040902060040182905561360363ffffffff42811690839061398c16565b600093845260056020526040909320600101805463ffffffff94909416600160e01b026001600160e01b03909416939093179092555050565b6000868152600560205260409020600101548690600160c01b900463ffffffff16156136a9576040805162461bcd60e51b81526020600482015260176024820152761c5d595cdd1a5bdb881b5d5cdd081b9bdd08195e1a5cdd604a1b604482015290519081900360640190fd5b8163ffffffff85166136fd576040805162461bcd60e51b815260206004820152601860248201527774696d656f7574206d75737420626520706f73697469766560401b604482015290519081900360640190fd5b6301e133808563ffffffff16106137455760405162461bcd60e51b8152600401808060200182810382526022815260200180613baf6022913960400191505060405180910390fd5b6001600160a01b038616613799576040805162461bcd60e51b8152602060048201526016602482015275185c989a5d1c985d1bdc881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b336001600160a01b03871614613858576001600160a01b038616600090815260086020526040902054808210156138015760405162461bcd60e51b8152600401808060200182810382526027815260200180613c496027913960400191505060405180910390fd5b613811828263ffffffff61397a16565b6001600160a01b03881660009081526001602052604090205490925061383d908263ffffffff6131c516565b6001600160a01b038816600090815260016020526040902055505b60009788526005602052604090972095865550506001840180546001600160a01b0319166001600160a01b03949094169390931763ffffffff60a01b1916600160a01b63ffffffff928316021763ffffffff60c01b1916600160c01b929091169190910217905560030155565b60008181526007602052604090205463ffffffff16156139165760405162461bcd60e51b8152600401808060200182810382526021815260200180613b8e6021913960400191505060405180910390fd5b600082815260056020526040812060010154600890600160c01b900463ffffffff1604905061394f63ffffffff42811690839061398c16565b600092835260076020526040909220805463ffffffff191663ffffffff909316929092179091555050565b60008282111561398657fe5b50900390565b600082820163ffffffff80851690821610156131d457fefefe2dac156a3890636ce13f65f4fdf41dcaee11526e4a5374531572d92194796c486973746f727920696e7075742070726f766964656420646964206e6f74206d6174636820746865206578706563746564206861736866696e616c697a6174696f6e20646561646c696e65206d757374206e6f742068617665207061737365647175657374696f6e206d7573742062652070656e64696e67206172626974726174696f6e7175657374696f6e206d75737420657869737400000000000000000000000000626f6e64206d75737420626520646f75626c65206174206c656173742070726576696f757320626f6e64636f6d6d69746d656e74206d757374206e6f742068617665206265656e2072657665616c6564207965745175657374696f6e206d75737420616c7265616479206861766520616e20616e73776572207768656e206172626974726174696f6e20697320726571756573746564546f6b656e2063616e206f6e6c7920626520696e697469616c697a6564206f6e636566696e616c697a6174696f6e206465616c696e65206d757374206e6f74206861766520706173736564626f6e64206d75737420657863656564206d61785f70726576696f757300000072657665616c20646561646c696e65206d757374206e6f74206861766520706173736564636f6d6d69746d656e74206d757374206e6f7420616c726561647920657869737474696d656f7574206d757374206265206c657373207468616e2033363520646179737175657374696f6e206d757374206e6f742062652070656e64696e67206172626974726174696f6e6174206c65617374206f6e6520686973746f7279206861736820656e747279206d7573742062652070726f76696465646f70656e696e672064617465206d757374206861766520706173736564000000546f6b656e732070726f7669646564206d75737420636f766572207175657374696f6e206665655472616e73666572206f6620746f6b656e73206661696c65642c20696e73756666696369656e7420617070726f7665642062616c616e63653f6d73672e73656e646572206d7573742062652061726269747261746f720000007175657374696f6e206d7573742062652066696e616c697a6564000000000000a264697066735822122026b7740cecc424a35bacb285fb08be99b1f417843f79c878db6d6282570d2d5a64736f6c634300060200337b227469746c65223a20222573222c202274797065223a20226d756c7469706c652d73656c656374222c20226f7574636f6d6573223a205b25735d2c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a2022626f6f6c222c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a20226461746574696d65222c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a202273696e676c652d73656c656374222c20226f7574636f6d6573223a205b25735d2c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a202275696e74222c2022646563696d616c73223a2031382c202263617465676f7279223a20222573222c20226c616e67223a20222573227d
Deployed ByteCode Sourcemap
2556:38972:0:-:0;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2556:38972:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30639:2837;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;30639:2837:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;30639:2837:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30639:2837:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30639:2837:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30639:2837:0;;;;;;;;-1:-1:-1;30639:2837:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;30639:2837:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30639:2837:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30639:2837:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30639:2837:0;;;;;;;;-1:-1:-1;30639:2837:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;30639:2837:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30639:2837:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30639:2837:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30639:2837:0;;;;;;;;-1:-1:-1;30639:2837:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;30639:2837:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30639:2837:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30639:2837:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30639:2837:0;;-1:-1:-1;30639:2837:0;;-1:-1:-1;;;;;30639:2837:0:i;:::-;;18035:345;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18035:345:0;;;;;;;:::i;28639:666::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;28639:666:0;;;;;;;;-1:-1:-1;;;;;28639:666:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8278:161;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8278:161:0;-1:-1:-1;;;;;8278:161:0;;:::i;40566:129::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40566:129:0;;:::i;39153:137::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39153:137:0;;:::i;:::-;;;;-1:-1:-1;;;;;39153:137:0;;;;;;;;;;;;;;41398:125;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41398:125:0;;:::i;37680:1062::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;37680:1062:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;37680:1062:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37680:1062:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37680:1062:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37680:1062:0;;;;;;;;-1:-1:-1;37680:1062:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;37680:1062:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37680:1062:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37680:1062:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37680:1062:0;;;;;;;;-1:-1:-1;37680:1062:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;37680:1062:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37680:1062:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37680:1062:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37680:1062:0;;;;;;;;-1:-1:-1;37680:1062:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;37680:1062:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37680:1062:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37680:1062:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37680:1062:0;;;;;;;;-1:-1:-1;37680:1062:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;37680:1062:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37680:1062:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37680:1062:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37680:1062:0;;;;;;;;-1:-1:-1;37680:1062:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;37680:1062:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37680:1062:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37680:1062:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37680:1062:0;;-1:-1:-1;37680:1062:0;;-1:-1:-1;;;;;37680:1062:0:i;18933:474::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;18933:474:0;;;;;;;;;;;;;;;;;:::i;2302:217::-;;;:::i;22653:923::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;22653:923:0;;;;;;;;;;;;;;;;;:::i;9452:182::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9452:182:0;;:::i;5651:50::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5651:50:0;;:::i;38889:140::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38889:140:0;;:::i;5760:48::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5760:48:0;;:::i;:::-;;;;-1:-1:-1;;;;;5760:48:0;;;;;;;;;;;;;;;;;;;;;;;;;5871:59;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5871:59:0;-1:-1:-1;;;;;5871:59:0;;:::i;2160:44::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2160:44:0;-1:-1:-1;;;;;2160:44:0;;:::i;12842:782::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;12842:782:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;12842:782:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12842:782:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;12842:782:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;12842:782:0;;-1:-1:-1;;;;;;;12842:782:0;;;;-1:-1:-1;;12842:782:0;;;;;;;;;;;;;;;;-1:-1:-1;12842:782:0;;;;:::i;26822:278::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26822:278:0;;:::i;:::-;;;;;;;;;;;;;;;;;;41128:140;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41128:140:0;;:::i;5815:49::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5815:49:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10021:363;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10021:363:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;10021:363:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10021:363:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;10021:363:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;10021:363:0;;-1:-1:-1;10021:363:0;;-1:-1:-1;;;;;10021:363:0:i;40803:138::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40803:138:0;;:::i;40230:153::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40230:153:0;;:::i;5708:45::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5708:45:0;;:::i;:::-;;;;;;;-1:-1:-1;;;;;5708:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39428:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39428:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;39693:130;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39693:130:0;;:::i;11269:435::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;11269:435:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;11269:435:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11269:435:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;11269:435:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;11269:435:0;;;;;;;;-1:-1:-1;11269:435:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;11269:435:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11269:435:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;11269:435:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;11269:435:0;;-1:-1:-1;;;;;;;11269:435:0;;;;-1:-1:-1;;11269:435:0;;;;;;;;;;;;;;;;-1:-1:-1;11269:435:0;;;;:::i;27320:179::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27320:179:0;;:::i;20998:669::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;20998:669:0;;;;;;;;;;;;;-1:-1:-1;;;;;20998:669:0;;;;;;;;;;:::i;39965:137::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39965:137:0;;:::i;5600:44::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5600:44:0;;:::i;14608:850::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;14608:850:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;14608:850:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14608:850:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14608:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;14608:850:0;;-1:-1:-1;;;;;;;14608:850:0;;;;-1:-1:-1;;14608:850:0;;;;;;;;;;;;;;;;-1:-1:-1;14608:850:0;;;;;;;;;:::i;25009:513::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25009:513:0;;;-1:-1:-1;;;;;25009:513:0;;;;;;;;;;:::i;2132:19::-;;;:::i;26128:511::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26128:511:0;;;;;;;;;;;-1:-1:-1;;;;;26128:511:0;;:::i;30639:2837::-;30839:11;7680:24;7692:11;7680;:24::i;:::-;7672:63;;;;;-1:-1:-1;;;7672:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7672:63:0;;;;;;;;;;;;;;;30909:1:::1;30885:14;:21;:25;30877:86;;;;-1:-1:-1::0;;;30877:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31057:13;31073:28:::0;;;:15:::1;:28;::::0;;;;;;;:34;;;31138:38;::::1;::::0;31210:41:::1;::::0;;::::1;::::0;31503:9:::1;:22:::0;;;;;;;:35;;::::1;::::0;31573:34:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;31073:34:0;;::::1;::::0;31138:38;;31503:35;31640:737:::1;31656:14;:21;31652:1;:25;31640:737;;;31813:18;31834:97;31862:17;31881:14;31896:1;31881:17;;;;;;;;;;;;;;31900:7;31908:1;31900:10;;;;;;;;;;;;;;31912:5;31918:1;31912:8;;;;;;;;;;;;;;31922:5;31928:1;31922:8;;;;;;;;;;;;;;31834:27;:97::i;:::-;31813:118:::0;-1:-1:-1;31963:27:0::1;:12:::0;31980:9;31963:27:::1;:16;:27;:::i;:::-;31948:42;;32029:148;32067:11;32080;32093:12;32107:5;32131;32137:1;32131:8;;;;;;;;;;;;;;32141:5;32147:1;32141:8;;;;;;;;;;;;;;32151:7;32159:1;32151:10;;;;;;;;;;;;;;32163:13;32029:19;:148::i;:::-;32005:172;;;;;;;;32303:5;32309:1;32303:8;;;;;;;;;;;;;;32291:20;;32346:14;32361:1;32346:17;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;31679:3:0::1;;31640:737;;;32393:30:::0;;32389:1010:::1;;-1:-1:-1::0;;;;;32834:21:0;::::1;::::0;32830:140:::1;;32876:43;32886:11;32899:5;32906:12;32876:9;:43::i;:::-;32953:1;32938:16;;32830:140;32986:28;::::0;;;:15:::1;:28;::::0;;;;:42;;-1:-1:-1;;;;;;32986:42:0::1;-1:-1:-1::0;;;;;32986:42:0;::::1;;::::0;;-1:-1:-1;33043:38:0;::::1;:50:::0;;;33108:41:::1;;:56:::0;;;32389:1010:::1;;;33279:58;33289:11:::0;33302:5;33309:27:::1;:12:::0;33326:9;33309:27:::1;:16;:27;:::i;:::-;33279:9;:58::i;:::-;33359:28;::::0;;;:15:::1;:28;::::0;;;;33352:35;;-1:-1:-1;;;;;;33352:35:0::1;::::0;;;;::::1;::::0;;;::::1;;::::0;32389:1010:::1;-1:-1:-1::0;;33411:22:0::1;::::0;;;:9:::1;:22;::::0;;;;;;;:35;;::::1;:55:::0;;;;-1:-1:-1;;;;;;;;30639:2837:0:o;18035:345::-;6408:1;6375:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;6375:30:0;;;;6367:66;;;;;-1:-1:-1;;;6367:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6367:66:0;;;;;;;;;;;;;;;6453:22;;;;:9;:22;;;;;:45;;;;;6452:46;6444:99;;;;-1:-1:-1;;;6444:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6554:18;6575:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;6575:34:0;;;;6628:25;;;:54;;;6678:3;6657:25;;:11;:25;;;6628:54;6620:109;;;;-1:-1:-1;;;6620:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6740:17;6760:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;6760:33:0;;;;6812:15;;;:44;;;6852:3;6831:25;;:10;:25;;;;6812:44;6804:86;;;;;-1:-1:-1;;;6804:86:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6804:86:0;;;;;;;;;;;;;;;18160:29:::1;18182:6;18160:21;:29::i;:::-;18232:22;::::0;;;:9:::1;:22;::::0;;;;:29:::1;;::::0;:41:::1;::::0;18266:6;18232:41:::1;:33;:41;:::i;:::-;18200:22;::::0;;;:9:::1;:22;::::0;;;;;;;;:29:::1;;:73:::0;;;18289:83;;;;;;;::::1;::::0;;;;;;18361:10:::1;::::0;18210:11;;18289:83:::1;::::0;;;;;;;::::1;18035:345:::0;;;;;:::o;28639:666::-;28863:7;28822:11;7680:24;7692:11;7680;:24::i;:::-;7672:63;;;;;-1:-1:-1;;;7672:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7672:63:0;;;;;;;;;;;;;;;28907:22:::1;::::0;;;:9:::1;:22;::::0;;;;:35;28891:51;::::1;28883:87;;;::::0;;-1:-1:-1;;;28883:87:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28883:87:0;;;;;;;;;;;;;::::1;;29003:22;::::0;;;:9:::1;:22;::::0;;;;:33:::1;;::::0;-1:-1:-1;;;;;28989:47:0;;::::1;29003:33:::0;::::1;28989:47;28981:81;;;::::0;;-1:-1:-1;;;28981:81:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28981:81:0;;;;;;;;;;;;;::::1;;29096:22;::::0;;;:9:::1;:22;::::0;;;;:30:::1;;::::0;::::1;-1:-1:-1::0;;;29096:30:0;;::::1;::::0;::::1;29081:45:::0;;::::1;;;29073:85;;;::::0;;-1:-1:-1;;;29073:85:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29073:85:0;;;;;;;;;;;;;::::1;;29189:22;::::0;;;:9:::1;:22;::::0;;;;:27:::1;;::::0;29177:39;::::1;;29169:76;;;::::0;;-1:-1:-1;;;29169:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29169:76:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;29263:22:0::1;::::0;;;-1:-1:-1;;29263:9:0::1;:22;::::0;-1:-1:-1;29263:22:0;;;:34:::1;;::::0;;28639:666::o;8278:161::-;8363:3;8347:5;-1:-1:-1;;;;;8347:5:0;:20;8339:67;;;;-1:-1:-1;;;8339:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8417:5;:14;;-1:-1:-1;;;;;;8417:14:0;-1:-1:-1;;;;;8417:14:0;;;;;;;;;;8278:161::o;40566:129::-;40631:7;40658:22;;;:9;:22;;;;;:29;;;;40566:129::o;39153:137::-;39222:7;39249:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;;;39249:33:0;;39153:137::o;41398:125::-;41461:7;41488:22;;;:9;:22;;;;;:27;;;;41398:125::o;37680:1062::-;38018:10:::1;::::0;38059:655:::1;38077:12;:19;38072:2;:24;38059:655;;;38119:11;38133:12;38146:2;38133:16;;;;;;;;;;;;;;38119:30;;38164:10;38177:7;38185:2;38177:11;;;;;;;;;;;;;;38164:24;;38203:19;38239:2;38225:17;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;::::0;-1:-1;38225:17:0::1;;38203:39;;38257:19;38293:2;38279:17;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;::::0;-1:-1;38279:17:0::1;;38257:39;;38311:19;38347:2;38333:17;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;::::0;-1:-1;38333:17:0::1;;38311:39;;38365:19;38401:2;38387:17;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;::::0;-1:-1;38387:17:0::1;-1:-1:-1::0;38365:39:0;-1:-1:-1;38419:9:0::1;38443:211;38459:2;38455:1;:6;38443:211;;;38495:11;38507:1;38495:14;;;;;;;;;;;;;;38487:2;38490:1;38487:5;;;;;;;;;;;;;:22;;;::::0;::::1;38536:5;38542:1;38536:8;;;;;;;;;;;;;;38528:2;38531:1;38528:5;;;;;;;;;;;;;:16;-1:-1:-1::0;;;;;38528:16:0::1;;;-1:-1:-1::0;;;;;38528:16:0::1;;;::::0;::::1;38571:5;38577:1;38571:8;;;;;;;;;;;;;;38563:2;38566:1;38563:5;;;;;;;;;;;;;:16;;;::::0;::::1;38606:7;38614:1;38606:10;;;;;;;;;;;;;;38598:2;38601:1;38598:5;;;;;;;;;::::0;;::::1;::::0;;;;;:18;38635:3:::1;::::0;;::::1;::::0;38463::::1;38443:211;;;38668:34;38682:3;38687:2;38691;38695;38699;38668:13;:34::i;:::-;-1:-1:-1::0;;38098:4:0::1;::::0;;::::1;::::0;-1:-1:-1;38059:655:0::1;::::0;-1:-1:-1;;;;38059:655:0::1;;38724:10;:8;:10::i;:::-;6143:1;;37680:1062:::0;;;;;;:::o;18933:474::-;6408:1;6375:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;6375:30:0;;;;6367:66;;;;;-1:-1:-1;;;6367:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6367:66:0;;;;;;;;;;;;;;;6453:22;;;;:9;:22;;;;;:45;;;;;6452:46;6444:99;;;;-1:-1:-1;;;6444:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6554:18;6575:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;6575:34:0;;;;6628:25;;;:54;;;6678:3;6657:25;;:11;:25;;;6628:54;6620:109;;;;-1:-1:-1;;;6620:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6740:17;6760:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;6760:33:0;;;;6812:15;;;:44;;;6852:3;6831:25;;:10;:25;;;;6812:44;6804:86;;;;;-1:-1:-1;;;6804:86:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6804:86:0;;;;;;;;;;;;;;;19091:11:::1;19104:6;7852:1;7843:6;:10;7835:44;;;::::0;;-1:-1:-1;;;7835:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;7835:44:0;;;;;;;;;;;;;::::1;;7909:22;::::0;;;:9:::1;:22;::::0;;;;:27:::1;;::::0;:34:::1;::::0;7941:1:::1;7909:34;:31;:34;:::i;:::-;7898:6;:46;;7890:101;;;;-1:-1:-1::0;;;7890:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19156:11:::0;19169:12;8121:16;;8117:134:::2;;8162:22;::::0;;;:9:::2;:22;::::0;;;;:27:::2;;::::0;:43;-1:-1:-1;8162:43:0::2;8154:85;;;::::0;;-1:-1:-1;;;8154:85:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;;;;;;;8154:85:0;;;;;;;;;;;;;::::2;;19208:29:::3;19230:6;19208:21;:29::i;:::-;19248:67;19268:11;19281:6;19289:10;19301:6;19309:5;19248:19;:67::i;:::-;19368:22;::::0;;;:9:::3;:22;::::0;;;;:30:::3;;::::0;19326:73:::3;::::0;19368:22;;19360:6;;-1:-1:-1;;;19368:30:0;::::3;;;19326:20;:73::i;:::-;8002:1:::2;;6901::::1;;18933:474:::0;;;;;;;:::o;2302:217::-;2369:10;2345:11;2359:21;;;:9;:21;;;;;;;;;;2391:25;;;;2435:5;;:31;;-1:-1:-1;;;2435:31:0;;;;;;;;;;;;;;;;;2359:21;;-1:-1:-1;;;;;2435:5:0;;;;:14;;:31;;;;;2359:21;;2435:31;;;;;;;;;:5;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;2435:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2435:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2435:31:0;2427:40;;;;;;2483:28;;;;;;;;2495:10;;2483:28;;;;;;;;;;2302:217;:::o;22653:923::-;7217:1;7184:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;7184:30:0;;;;7176:66;;;;;-1:-1:-1;;;7176:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7176:66:0;;;;;;;;;;;;;;;7253:18;7274:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;7274:34:0;;;;7327:25;;;:54;;;7377:3;7356:25;;:11;:25;;;7327:54;7319:108;;;;-1:-1:-1;;;7319:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7438:17;7458:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;7458:33:0;;;;7510:15;;;:44;;;7550:3;7529:25;;:10;:25;;;;7510:44;7502:86;;;;;-1:-1:-1;;;7502:86:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7502:86:0;;;;;;;;;;;;;;;22858:31:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;22858:31:0;;;;;22848:42;;;;::::1;::::0;22935:48;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;22935:48:0;;;;;;22925:59;;;;::::1;::::0;;;;-1:-1:-1;23006:26:0;;;:11:::1;:26:::0;;;;;;:38;22848:42;;22925:59;-1:-1:-1;;;23006:38:0;::::1;;;23005:39;22997:94;;;;-1:-1:-1::0;;;22997:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23110:26;::::0;;;:11:::1;:26;::::0;;;;:36;:50:::1;23156:3;23110:50:::0;::::1;:36:::0;::::1;:50;23102:99;;;;-1:-1:-1::0;;;23102:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23214:26;::::0;;;:11:::1;:26;::::0;;;;;;;:42:::1;::::0;::::1;:51:::0;;;23276:45;;-1:-1:-1;;;;23276:45:0::1;-1:-1:-1::0;;;23276:45:0::1;::::0;;23346:22;;;:9:::1;:22:::0;;;;;:27:::1;;::::0;23338:35;::::1;23334:141;;;23432:22;::::0;;;:9:::1;:22;::::0;;;;:30:::1;;::::0;23390:73:::1;::::0;23432:22;;23424:6;;-1:-1:-1;;;23432:30:0;::::1;;;23390:20;:73::i;:::-;23492:74;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;23533:11;;23521:10:::1;::::0;23508:11;;23492:74:::1;::::0;;;;;;;;::::1;7599:1;;22653:923:::0;;;;;;;:::o;9452:182::-;9559:10:::1;9534:36;::::0;;;:24:::1;:36;::::0;;;;;;;;:42;;;9592:34;;;;;;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;9452:182:::0;:::o;5651:50::-;;;;;;;;;;;;;:::o;38889:140::-;38959:7;38986:22;;;:9;:22;;;;;:35;;38889:140::o;5760:48::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5760:48:0;;;;;;:::o;5871:59::-;;;;;;;;;;;;;:::o;2160:44::-;;;;;;;;;;;;;:::o;12842:782::-;13068:7;13098:22;;;:9;:22;;;;;;13090:58;;;;;-1:-1:-1;;;13090:58:0;;;;;;;;;;;;-1:-1:-1;;;13090:58:0;;;;;;;;;;;;;;;13161:20;13211:11;13224:10;13236:8;13194:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;13194:51:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;13194:51:0;;;13184:62;;;;;;13161:85;;13257:19;13306:12;13320:10;13332:7;13341:10;13353:5;13289:70;;;;;;;;;;;-1:-1:-1;;;;;13289:70:0;-1:-1:-1;;;;;13289:70:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13289:70:0;-1:-1:-1;;;;;13289:70:0;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;13289:70:0;;;13279:81;;;;;;13257:103;;13373:75;13386:11;13399:12;13413:10;13425:7;13434:10;13446:1;13373:12;:75::i;:::-;13527:12;13492:10;-1:-1:-1;;;;;13464:121:0;13479:11;-1:-1:-1;;;;;;;;;;;13504:11:0;13517:8;13541:10;13553:7;13562:10;13574:5;13581:3;13464:121;;;;;;;;;;;;-1:-1:-1;;;;;13464:121:0;-1:-1:-1;;;;;13464:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13464:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13605:11;12842:782;-1:-1:-1;;;;;;;;12842:782:0:o;26822:278::-;26890:4;26928:22;;;:9;:22;;;;;:34;;;;26983:45;;;;;-1:-1:-1;;;26928:34:0;;;;;;26983:45;;26982:46;:76;;;;-1:-1:-1;27033:24:0;;;;;26982:76;:108;;;;;27085:3;27063:26;;:11;:26;;;;26982:108;26973:119;26822:278;-1:-1:-1;;;26822:278:0:o;41128:140::-;41198:7;41225:22;;;:9;:22;;;;;;;;:35;;;41128:140::o;5815:49::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5815:49:0;;;;;;:::o;10021:363::-;10142:14:::1;::::0;10109:7;10167:13;;;:9:::1;:13;::::0;;;;;;;10183:12:::1;10167:28:::0;;10238:25;;;10109:7;;10142:14;10255:7;;10238:25;;::::1;::::0;;;;;::::1;::::0;;;;36:153:-1::1;66:2;61:3;58:11;36:153;;176:10:::0;;164:23;;-1:-1;;139:12;;;;98:2:::1;89:12:::0;;::::1;::::0;114::::1;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10238:25:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10238:25:0;;;10228:36;;;;;;10206:15;:19;10222:2;10206:19;;;;;;;;;;;:58;;;;10299:10;-1:-1:-1::0;;;;;10280:39:0::1;10295:2;10280:39;10311:7;10280:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;10280:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10347:9;:2:::0;10354:1:::1;10347:9;:6;:9;:::i;:::-;10330:14;:26:::0;10374:2;10021:363;-1:-1:-1;;10021:363:0:o;40803:138::-;40872:7;40899:22;;;:9;:22;;;;;:34;;;;40803:138::o;40230:153::-;40306:4;40330:22;;;:9;:22;;;;;:45;;;;;;40230:153::o;5708:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5708:45:0;;;;-1:-1:-1;;;5708:45:0;;;;;-1:-1:-1;;;5708:45:0;;;;;-1:-1:-1;;;5708:45:0;;;;;;;;;;;;;:::o;39428:135::-;39496:6;39522:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;39522:33:0;;;;;39428:135::o;39693:130::-;39759:6;39785:22;;;:9;:22;;;;;:30;;;-1:-1:-1;;;39785:30:0;;;;;39693:130::o;11269:435::-;11539:7;11559:19;11581:23;11596:7;11581:14;:23::i;:::-;11559:45;;11622:74;11634:11;11647:8;11657:10;11669:7;11678:10;11690:5;11622:11;:74::i;:::-;11615:81;11269:435;-1:-1:-1;;;;;;;;11269:435:0:o;27320:179::-;27430:7;27389:11;7680:24;7692:11;7680;:24::i;:::-;7672:63;;;;;-1:-1:-1;;;7672:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7672:63:0;;;;;;;;;;;;;;;-1:-1:-1;;27457:22:0::1;::::0;;;:9:::1;:22;::::0;;;;:34:::1;;::::0;;27320:179::o;20998:669::-;6408:1;6375:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;6375:30:0;;;;6367:66;;;;;-1:-1:-1;;;6367:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6367:66:0;;;;;;;;;;;;;;;6453:22;;;;:9;:22;;;;;:45;;;;;6452:46;6444:99;;;;-1:-1:-1;;;6444:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6554:18;6575:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;6575:34:0;;;;6628:25;;;:54;;;6678:3;6657:25;;:11;:25;;;6628:54;6620:109;;;;-1:-1:-1;;;6620:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6740:17;6760:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;6760:33:0;;;;6812:15;;;:44;;;6852:3;6831:25;;:10;:25;;;;6812:44;6804:86;;;;;-1:-1:-1;;;6804:86:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6804:86:0;;;;;;;;;;;;;;;21190:11:::1;21203:6;7852:1;7843:6;:10;7835:44;;;::::0;;-1:-1:-1;;;7835:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;7835:44:0;;;;;;;;;;;;;::::1;;7909:22;::::0;;;:9:::1;:22;::::0;;;;:27:::1;;::::0;:34:::1;::::0;7941:1:::1;7909:34;:31;:34;:::i;:::-;7898:6;:46;;7890:101;;;;-1:-1:-1::0;;;7890:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21255:11:::0;21268:12;8121:16;;8117:134:::2;;8162:22;::::0;;;:9:::2;:22;::::0;;;;:27:::2;;::::0;:43;-1:-1:-1;8162:43:0::2;8154:85;;;::::0;;-1:-1:-1;;;8154:85:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;;;;;;;8154:85:0;;;;;;;;;;;;;::::2;;21309:29:::3;21331:6;21309:21;:29::i;:::-;21385:50;::::0;;::::3;::::0;;::::3;::::0;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21385:50:0;;;;;;;21375:61;;;::::3;::::0;21351:21:::3;-1:-1:-1::0;;;;;21467:25:0;::::3;::::0;21466:52:::3;;21509:9;21466:52;;;21496:10;21466:52;21447:71;;21531:44;21548:11;21561:13;21531:16;:44::i;:::-;21586:71;21606:11;21619:13;21634:8;21644:6;21652:4;21586:19;:71::i;:::-;8261:1;;8002::::2;;6901::::1;;20998:669:::0;;;;;;;;:::o;39965:137::-;40034:6;40060:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;40060:34:0;;;;;39965:137::o;5600:44::-;;;;;;;;;;;;;:::o;14608:850::-;14855:7;14877:29;14899:6;14877:21;:29::i;:::-;14952:1;14927:22;;;:9;:22;;;;;;14919:58;;;;;-1:-1:-1;;;14919:58:0;;;;;;;;;;;;-1:-1:-1;;;14919:58:0;;;;;;;;;;;;;;;14990:20;15040:11;15053:10;15065:8;15023:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15023:51:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15023:51:0;;;15013:62;;;;;;14990:85;;15086:19;15135:12;15149:10;15161:7;15170:10;15182:5;15118:70;;;;;;;;;;;-1:-1:-1;;;;;15118:70:0;-1:-1:-1;;;;;15118:70:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15118:70:0;-1:-1:-1;;;;;15118:70:0;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15118:70:0;;;15108:81;;;;;;15086:103;;15202:80;15215:11;15228:12;15242:10;15254:7;15263:10;15275:6;15202:12;:80::i;:::-;15361:12;15326:10;-1:-1:-1;;;;;15298:121:0;15313:11;-1:-1:-1;;;;;;;;;;;15338:11:0;15351:8;15375:10;15387:7;15396:10;15408:5;15415:3;15298:121;;;;;;;;;;;;-1:-1:-1;;;;;15298:121:0;-1:-1:-1;;;;;15298:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;15298:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15439:11;14608:850;-1:-1:-1;;;;;;;;;14608:850:0:o;25009:513::-;6017:22;;;;:9;:22;;;;;:33;;;:22;;-1:-1:-1;;;;;6017:33:0;6003:10;:47;5995:89;;;;;-1:-1:-1;;;5995:89:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5995:89:0;;;;;;;;;;;;;;;6408:1:::1;6375:22:::0;;;:9:::1;:22;::::0;;;;:30:::1;;::::0;:22;;-1:-1:-1;;;6375:30:0;::::1;;;6367:66;;;::::0;;-1:-1:-1;;;6367:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;6367:66:0;;;;;;;;;;;;;::::1;;6453:22;::::0;;;:9:::1;:22;::::0;;;;:45:::1;;::::0;::::1;;6452:46;6444:99;;;;-1:-1:-1::0;;;6444:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6554:18;6575:22:::0;;;:9:::1;:22;::::0;;;;:34:::1;;::::0;-1:-1:-1;;;6575:34:0;::::1;;;6628:25:::0;;;:54:::1;;;6678:3;6657:25;;:11;:25;;;6628:54;6620:109;;;;-1:-1:-1::0;;;6620:109:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6740:17;6760:22:::0;;;:9:::1;:22;::::0;;;;:33:::1;;::::0;-1:-1:-1;;;6760:33:0;::::1;;;6812:15:::0;;;:44:::1;;;6852:3;6831:25;;:10;:25;;;;6812:44;6804:86;;;::::0;;-1:-1:-1;;;6804:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;6804:86:0;;;;;;;;;;;;;::::1;;25220:11:::0;25233:12;8121:16;;8117:134:::2;;8162:22;::::0;;;:9:::2;:22;::::0;;;;:27:::2;;::::0;:43;-1:-1:-1;8162:43:0::2;8154:85;;;::::0;;-1:-1:-1;;;8154:85:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;;;;;;;8154:85:0;;;;;;;;;;;;;::::2;;25310:1:::3;25280:22:::0;;;:9:::3;:22;::::0;;;;:27:::3;;::::0;25272:110:::3;;;;-1:-1:-1::0;;;25272:110:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25393:22;::::0;;;:9:::3;:22;::::0;;;;;:45:::3;;:52:::0;;-1:-1:-1;;25393:52:0::3;25441:4;25393:52;::::0;;25461:53;-1:-1:-1;;;;;25461:53:0;::::3;::::0;25403:11;;25461:53:::3;::::0;25393:22;25461:53:::3;6901:1:::2;;6095::::1;;;25009:513:::0;;;;:::o;2132:19::-;;;-1:-1:-1;;;;;2132:19:0;;:::o;26128:511::-;6017:22;;;;:9;:22;;;;;:33;;;:22;;-1:-1:-1;;;;;6017:33:0;6003:10;:47;5995:89;;;;;-1:-1:-1;;;5995:89:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5995:89:0;;;;;;;;;;;;;;;6991:22:::1;::::0;;;:9:::1;:22;::::0;;;;:45:::1;;::::0;26287:11;;6991:45:::1;;6983:94;;;;-1:-1:-1::0;;;6983:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;26335:24:0;::::2;26327:62;;;::::0;;-1:-1:-1;;;26327:62:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;26327:62:0;;;;;;;;;;;;;::::2;;26405:32;::::0;26430:6;;26417:11;;26405:32:::2;::::0;;;::::2;26498:5;26450:22:::0;;;:9:::2;:22;::::0;;;;:45:::2;;:53:::0;;-1:-1:-1;;26450:53:0::2;::::0;;26514:60:::2;::::0;26460:11;;26547:6;;26555:8;;26498:5;26514:19:::2;:60::i;:::-;26585:44;26606:11;26619:6;26627:1;26585:20;:44::i;:::-;6095:1:::1;26128:511:::0;;;;:::o;33692:560::-;33927:56;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33927:56:0;;;;;-1:-1:-1;;;33927:56:0;;;;;;26:21:-1;;;22:32;;6:49;;33927:56:0;;;;;;;33917:67;;;;;-1:-1:-1;;33896:88:0;;33892:133;;;-1:-1:-1;34009:4:0;34002:11;;33892:133;34070:57;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34070:57:0;;;;;-1:-1:-1;34070:57:0;;;;;;26:21:-1;;;22:32;;6:49;;34070:57:0;;;;;;;34060:68;;;;;34039:89;;34035:135;;;-1:-1:-1;34153:5:0;34146:12;;34035:135;34180:64;;-1:-1:-1;;;34180:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33692:560;;;;;;;;:::o;1534:133::-;1592:7;1620:5;;;1639:6;;;;1632:14;;;;1660:1;-1:-1:-1;1534:133:0;;;;;:::o;34260:2465::-;34489:7;34498;34710:13;34706:492;;;34740:21;34888:26;;;:11;:26;;;;;:38;:26;;-1:-1:-1;;;34888:38:0;;;;34883:304;;34954:26;;;;:11;:26;;;;;34947:33;;-1:-1:-1;;34947:33:0;;;;;;-1:-1:-1;35007:12:0;;-1:-1:-1;35021:5:0;34999:28;;34883:304;35077:26;;;;:11;:26;;;;;:42;;;;;35138:33;;-1:-1:-1;;35138:33:0;;;;;;;;35077:42;-1:-1:-1;34706:492:0;35224:11;35214:6;:21;35210:1465;;;-1:-1:-1;;;;;35258:21:0;;35254:1408;;35495:22;;;;:9;:22;;;;;:29;;;35440:4;;-1:-1:-1;35440:4:0;;35478:47;;:12;;:47;:16;:47;:::i;:::-;35576:1;35544:22;;;:9;:22;;;;;:29;;:33;35463:62;-1:-1:-1;35254:1408:0;;;35613:5;-1:-1:-1;;;;;35605:13:0;:4;-1:-1:-1;;;;;35605:13:0;;35601:1061;;36248:27;36295:4;36279:12;:20;;36278:44;;36310:12;36278:44;;;36303:4;36278:44;36248:74;-1:-1:-1;36408:68:0;36418:11;36431:5;36438:37;:12;36248:74;36438:37;:16;:37;:::i;36408:68::-;36587:4;36579:12;;36625:19;36610:34;;35601:1061;;-1:-1:-1;36695:12:0;;-1:-1:-1;36709:5:0;34260:2465;;;;;;;;;;;;:::o;33484:200::-;-1:-1:-1;;;;;33598:16:0;;;;;;:9;:16;;;;;;:27;;33619:5;33598:27;:20;:27;:::i;:::-;-1:-1:-1;;;;;33579:16:0;;;;;;:9;:16;;;;;;;;;:46;;;;33641:35;;;;;;;33579:16;;33650:11;;33641:35;;;;;;;;;;33484:200;;;:::o;15466:728::-;15544:11;15540:50;;15572:7;;15540:50;15626:10;15602:11;15616:21;;;:9;:21;;;;;;15724:7;;15720:266;;15759:6;15752:3;:13;15748:227;;15810:15;:3;15818:6;15810:15;:7;:15;:::i;:::-;15796:10;15786:21;;;;:9;:21;;;;;:39;-1:-1:-1;15844:7:0;;15748:227;15900:15;:6;15911:3;15900:15;:10;:15;:::i;:::-;15944:10;15958:1;15934:21;;;:9;:21;;;;;:25;15891:24;-1:-1:-1;15748:227:0;16052:5;;;:53;;;-1:-1:-1;;;16052:53:0;;16071:10;16052:53;;;;16091:4;16052:53;;;;;;;;;;;;-1:-1:-1;;;;;16052:5:0;;;;:18;;:53;;;;;;;;;;;;;;;;;:5;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;16052:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16052:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16052:53:0;16044:123;;;;-1:-1:-1;;;16044:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16178:7;15466:728;;:::o;953:180::-;1011:7;1031:6;1027:37;;-1:-1:-1;1055:1:0;1048:8;;1027:37;1082:5;;;1086:1;1082;:5;:1;1101:5;;;;;:10;1094:18;;;23584:688;23749:24;23803:22;;;:9;:22;;;;;;;;;:35;;;;23786:109;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23786:109:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;23786:109:0;;;;;;;23776:120;;;;;24007:8;;24003:75;;24032:22;;;;:9;:22;;;;;:27;;:34;;;24003:75;24088:22;;;;:9;:22;;;;;;;;;:35;;;:54;;;24160:104;;;;;;;;;;;;;;;;;24245:3;24160:104;;;;;;;;;;;;;-1:-1:-1;;;;;24160:104:0;;;24098:11;;24160:104;;;;;;;;;23584:688;;;;;;:::o;24280:241::-;24393:22;;;;:9;:22;;;;;:34;;:43;;;24484:29;:15;24491:3;24484:15;;;24500:12;;24484:15;:29;:::i;:::-;24447:22;;;;:9;:22;;;;;;:34;;:66;;;;;;;-1:-1:-1;;;24447:66:0;-1:-1:-1;;;;;24447:66:0;;;;;;;;;;-1:-1:-1;;24280:241:0:o;16202:1527::-;6225:22;;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;6225:30:0;;;;:35;6217:71;;;;;-1:-1:-1;;;6217:71:0;;;;;;;;;;;;-1:-1:-1;;;6217:71:0;;;;;;;;;;;;;;;16420:6;16530:11:::1;::::0;::::1;16522:48;;;::::0;;-1:-1:-1;;;16522:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16522:48:0;;;;;;;;;;;;;::::1;;16599:8;16589:7;:18;;;16581:65;;;;-1:-1:-1::0;;;16581:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;16665:26:0;::::1;16657:61;;;::::0;;-1:-1:-1;;;16657:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16657:61:0;;;;;;;;;;;;;::::1;;17116:10;-1:-1:-1::0;;;;;17116:24:0;::::1;;17112:331;;-1:-1:-1::0;;;;;17180:36:0;::::1;17157:20;17180:36:::0;;;:24:::1;:36;::::0;;;;;17239:22;;::::1;;17231:74;;;;-1:-1:-1::0;;;17231:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17329:24;:6:::0;17340:12;17329:24:::1;:10;:24;:::i;:::-;-1:-1:-1::0;;;;;17392:21:0;::::1;;::::0;;;:9:::1;:21;::::0;;;;;17320:33;;-1:-1:-1;17392:39:0::1;::::0;17418:12;17392:39:::1;:25;:39;:::i;:::-;-1:-1:-1::0;;;;;17368:21:0;::::1;;::::0;;;:9:::1;:21;::::0;;;;:63;-1:-1:-1;17112:331:0::1;17455:22;::::0;;;:9:::1;:22;::::0;;;;;:50;;;-1:-1:-1;;17516:33:0::1;::::0;::::1;:46:::0;;-1:-1:-1;;;;;;17516:46:0::1;-1:-1:-1::0;;;;;17516:46:0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;17573:46:0::1;-1:-1:-1::0;;;17573:46:0::1;::::0;;::::1;;;-1:-1:-1::0;;;;17630:40:0::1;-1:-1:-1::0;;;17630:40:0;;;::::1;::::0;;;::::1;;::::0;;17681:29:::1;;:38:::0;16202:1527::o;19605:400::-;3127:1;19713:26;;;:11;:26;;;;;:36;;;:63;19705:109;;;;-1:-1:-1;;;19705:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19827:25;19855:22;;;:9;:22;;;;;:30;;;3258:1;;-1:-1:-1;;;19855:30:0;;:57;:30;:57;;-1:-1:-1;19962:35:0;:15;19969:3;19962:15;;;19855:57;;19962:15;:35;:::i;:::-;19923:26;;;;:11;:26;;;;;;:74;;-1:-1:-1;;19923:74:0;;;;;;;;;;;;-1:-1:-1;;19605:400:0:o;1415:113::-;1473:7;1501:1;1496;:6;;1489:14;;;;-1:-1:-1;1517:5:0;;;1415:113::o;1936:129::-;1992:6;2018:5;;;2037:6;;;;;;;;;2030:14;;
Swarm Source
ipfs://26b7740cecc424a35bacb285fb08be99b1f417843f79c878db6d6282570d2d5a
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.