Overview
ETH Balance
4.7304506 ETH
Eth Value
$16,166.57 (@ $3,417.55/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 621 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Multiple A... | 21222179 | 4 days ago | IN | 0 ETH | 0.00157814 | ||||
Claim Multiple A... | 21170263 | 11 days ago | IN | 0 ETH | 0.00179113 | ||||
Submit Answer | 21164760 | 12 days ago | IN | 0.1 ETH | 0.00205967 | ||||
Claim Multiple A... | 21163678 | 12 days ago | IN | 0 ETH | 0.00102003 | ||||
Submit Answer | 21128442 | 17 days ago | IN | 0.02 ETH | 0.00158831 | ||||
Submit Answer | 21128258 | 17 days ago | IN | 0.1 ETH | 0.00153198 | ||||
Claim Multiple A... | 20941697 | 43 days ago | IN | 0 ETH | 0.00119733 | ||||
Claim Multiple A... | 20941693 | 43 days ago | IN | 0 ETH | 0.00122325 | ||||
Submit Answer | 20919663 | 46 days ago | IN | 0.1 ETH | 0.00137409 | ||||
Submit Answer | 20919619 | 46 days ago | IN | 0.1 ETH | 0.00139423 | ||||
Submit Answer | 20916122 | 46 days ago | IN | 0.02 ETH | 0.00393393 | ||||
Claim Multiple A... | 20891618 | 50 days ago | IN | 0 ETH | 0.00035781 | ||||
Submit Answer | 20891602 | 50 days ago | IN | 0.001 ETH | 0.00057381 | ||||
Submit Answer | 20692014 | 78 days ago | IN | 0.01 ETH | 0.00316858 | ||||
Submit Answer | 20672918 | 80 days ago | IN | 0.01 ETH | 0.00021198 | ||||
Claim Multiple A... | 20513326 | 103 days ago | IN | 0 ETH | 0.00041781 | ||||
Claim Multiple A... | 20513326 | 103 days ago | IN | 0 ETH | 0.00063298 | ||||
Claim Multiple A... | 20477368 | 108 days ago | IN | 0 ETH | 0.00143636 | ||||
Submit Answer | 20453460 | 111 days ago | IN | 0.1 ETH | 0.00011966 | ||||
Claim Multiple A... | 20319545 | 130 days ago | IN | 0 ETH | 0.00066659 | ||||
Submit Answer | 20269851 | 137 days ago | IN | 0.1 ETH | 0.00169016 | ||||
Claim Multiple A... | 20163641 | 151 days ago | IN | 0 ETH | 0.00038101 | ||||
Submit Answer | 20119964 | 157 days ago | IN | 0.1 ETH | 0.00106133 | ||||
Submit Answer | 19854124 | 195 days ago | IN | 0.1 ETH | 0.00035625 | ||||
Create Template | 19728092 | 212 days ago | IN | 0 ETH | 0.00104637 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21222179 | 4 days ago | 0.1 ETH | ||||
21170263 | 11 days ago | 0.1 ETH | ||||
21163678 | 12 days ago | 0.02 ETH | ||||
20941697 | 43 days ago | 0.1 ETH | ||||
20941693 | 43 days ago | 0.1 ETH | ||||
20891618 | 50 days ago | 0.001 ETH | ||||
20513326 | 103 days ago | 0.1 ETH | ||||
20477368 | 108 days ago | 0.1 ETH | ||||
20319545 | 130 days ago | 0.1 ETH | ||||
20163641 | 151 days ago | 0.1 ETH | ||||
19640346 | 225 days ago | 0 ETH | ||||
19610221 | 229 days ago | 0.1 ETH | ||||
19519049 | 242 days ago | 0.1 ETH | ||||
19255779 | 279 days ago | 0.1 ETH | ||||
19206824 | 285 days ago | 0.1 ETH | ||||
19192090 | 287 days ago | 0.1 ETH | ||||
19168312 | 291 days ago | 0.5 ETH | ||||
19020108 | 312 days ago | 0.1 ETH | ||||
18899602 | 329 days ago | 0.1 ETH | ||||
18857799 | 334 days ago | 0.1 ETH | ||||
18713313 | 355 days ago | 0.1 ETH | ||||
18606042 | 370 days ago | 0.1 ETH | ||||
18595494 | 371 days ago | 0.1 ETH | ||||
18574694 | 374 days ago | 0.5 ETH | ||||
18538409 | 379 days ago | 0.1 ETH |
Loading...
Loading
Contract Name:
RealityETH_v3_0
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-10 */ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.6; contract BalanceHolder { mapping(address => uint256) public balanceOf; event LogWithdraw( address indexed user, uint256 amount ); function withdraw() public { uint256 bal = balanceOf[msg.sender]; balanceOf[msg.sender] = 0; payable(msg.sender).transfer(bal); emit LogWithdraw(msg.sender, bal); } } contract RealityETH_v3_0 is BalanceHolder { 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; // Proportion withheld when you claim an earlier bond. uint256 constant BOND_CLAIM_FEE_PROPORTION = 40; // One 40th ie 2.5% // Special value representing a question that was answered too soon. // bytes32(-2). By convention we use bytes32(-1) for "invalid", although the contract does not handle this. bytes32 constant UNRESOLVED_ANSWER = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe; 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 LogMinimumBond( bytes32 indexed question_id, uint256 min_bond ); 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 LogCancelArbitration( bytes32 indexed question_id ); event LogFinalize( bytes32 indexed question_id, bytes32 indexed answer ); event LogClaim( bytes32 indexed question_id, address indexed user, uint256 amount ); event LogReopenQuestion( bytes32 indexed question_id, bytes32 indexed reopened_question_id ); 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; uint256 min_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; mapping(bytes32 => bytes32) public reopened_questions; mapping(bytes32 => bool) public reopener_questions; 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(block.timestamp), "finalization deadline must not have passed"); uint32 opening_ts = questions[question_id].opening_ts; require(opening_ts == 0 || opening_ts <= uint32(block.timestamp), "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(block.timestamp), "finalization dealine must not have passed"); uint32 opening_ts = questions[question_id].opening_ts; require(opening_ts == 0 || opening_ts <= uint32(block.timestamp), "opening date must have passed"); _; } modifier stateFinalized(bytes32 question_id) { require(isFinalized(question_id), "question must be finalized"); _; } modifier bondMustDoubleAndMatchMinimum(bytes32 question_id) { require(msg.value > 0, "bond must be positive"); uint256 current_bond = questions[question_id].bond; if (current_bond == 0) { require(msg.value >= (questions[question_id].min_bond), "bond must exceed the minimum"); } else { require(msg.value >= (current_bond * 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"); } _; } /// @notice Constructor, sets up some initial templates /// @dev Creates some generalized templates for different question types used in the DApp. constructor() { 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 + 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 payable returns (bytes32) { uint256 template_id = createTemplate(content); return askQuestion(template_id, question, arbitrator, timeout, opening_ts, nonce); } /// @notice Ask a new question 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. /// @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 payable 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, uint256(0), address(this), msg.sender, nonce)); // We emit this event here because _askQuestion doesn't need to know the unhashed question. Other events are emitted by _askQuestion. emit LogNewQuestion(question_id, msg.sender, template_id, question, content_hash, arbitrator, timeout, opening_ts, nonce, block.timestamp); _askQuestion(question_id, content_hash, arbitrator, timeout, opening_ts, 0); return question_id; } /// @notice Ask a new question 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 min_bond The minimum bond that may be used for an answer. /// @return The ID of the newly-created question, created deterministically. function askQuestionWithMinBond(uint256 template_id, string memory question, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 nonce, uint256 min_bond) // stateNotCreated is enforced by the internal _askQuestion public payable 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, min_bond, address(this), msg.sender, nonce)); // We emit this event here because _askQuestion doesn't need to know the unhashed question. // Other events are emitted by _askQuestion. emit LogNewQuestion(question_id, msg.sender, template_id, question, content_hash, arbitrator, timeout, opening_ts, nonce, block.timestamp); _askQuestion(question_id, content_hash, arbitrator, timeout, opening_ts, min_bond); return question_id; } function _askQuestion(bytes32 question_id, bytes32 content_hash, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 min_bond) stateNotCreated(question_id) internal { // 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"); uint256 bounty = msg.value; // 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 (arbitrator != NULL_ADDRESS && msg.sender != arbitrator) { uint256 question_fee = arbitrator_question_fees[arbitrator]; require(bounty >= question_fee, "ETH provided must cover question fee"); bounty = bounty - question_fee; balanceOf[arbitrator] = balanceOf[arbitrator] + 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; if (bounty > 0) { questions[question_id].bounty = bounty; emit LogFundAnswerBounty(question_id, bounty, bounty, msg.sender); } if (min_bond > 0) { questions[question_id].min_bond = min_bond; emit LogMinimumBond(question_id, min_bond); } } /// @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 function fundAnswerBounty(bytes32 question_id) stateOpen(question_id) external payable { questions[question_id].bounty = questions[question_id].bounty + msg.value; emit LogFundAnswerBounty(question_id, msg.value, 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. function submitAnswer(bytes32 question_id, bytes32 answer, uint256 max_previous) stateOpen(question_id) bondMustDoubleAndMatchMinimum(question_id) previousBondMustNotBeatMaxPrevious(question_id, max_previous) external payable { _addAnswerToHistory(question_id, answer, msg.sender, msg.value, false); _updateCurrentAnswer(question_id, answer); } /// @notice Submit an answer for a question, crediting it to the specified account. /// @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 answerer The account to which the answer should be credited function submitAnswerFor(bytes32 question_id, bytes32 answer, uint256 max_previous, address answerer) stateOpen(question_id) bondMustDoubleAndMatchMinimum(question_id) previousBondMustNotBeatMaxPrevious(question_id, max_previous) external payable { require(answerer != NULL_ADDRESS, "answerer must be non-zero"); _addAnswerToHistory(question_id, answer, answerer, msg.value, false); _updateCurrentAnswer(question_id, answer); } // @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(block.timestamp) + 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. /// @dev Specifying the answerer is useful if you want to delegate the commit-and-reveal to a third-party. function submitAnswerCommitment(bytes32 question_id, bytes32 answer_hash, uint256 max_previous, address _answerer) stateOpen(question_id) bondMustDoubleAndMatchMinimum(question_id) previousBondMustNotBeatMaxPrevious(question_id, max_previous) external payable { bytes32 commitment_id = keccak256(abi.encodePacked(question_id, answer_hash, msg.value)); address answerer = (_answerer == NULL_ADDRESS) ? msg.sender : _answerer; _storeCommitment(question_id, commitment_id); _addAnswerToHistory(question_id, commitment_id, answerer, msg.value, 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(block.timestamp), "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); } 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, block.timestamp, is_commitment); } function _updateCurrentAnswer(bytes32 question_id, bytes32 answer) internal { questions[question_id].best_answer = answer; questions[question_id].finalize_ts = uint32(block.timestamp) + questions[question_id].timeout; } // Like _updateCurrentAnswer but without advancing the timeout function _updateCurrentAnswerByArbitrator(bytes32 question_id, bytes32 answer) internal { questions[question_id].best_answer = answer; questions[question_id].finalize_ts = uint32(block.timestamp); } /// @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].finalize_ts > UNANSWERED, "Question must already have an answer when arbitration is requested"); questions[question_id].is_pending_arbitration = true; emit LogNotifyOfArbitrationRequest(question_id, requester); } /// @notice Cancel a previously-requested arbitration and extend the timeout /// @dev Useful when doing arbitration across chains that can't be requested atomically /// @param question_id The ID of the question function cancelArbitration(bytes32 question_id) onlyArbitrator(question_id) statePendingArbitration(question_id) external { questions[question_id].is_pending_arbitration = false; questions[question_id].finalize_ts = uint32(block.timestamp) + questions[question_id].timeout; emit LogCancelArbitration(question_id); } /// @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) public { 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); _updateCurrentAnswerByArbitrator(question_id, answer); } /// @notice Submit the answer for a question, for use by the arbitrator, working out the appropriate winner based on the last answer details. /// @dev Doesn't require (or allow) a bond. /// @param question_id The ID of the question /// @param answer The answer, encoded into bytes32 /// @param payee_if_wrong The account to by credited as winner if the last answer given is wrong, usually the account that paid the arbitrator /// @param last_history_hash The history hash before the final one /// @param last_answer_or_commitment_id The last answer given, or the commitment ID if it was a commitment. /// @param last_answerer The address that supplied the last answer function assignWinnerAndSubmitAnswerByArbitrator(bytes32 question_id, bytes32 answer, address payee_if_wrong, bytes32 last_history_hash, bytes32 last_answer_or_commitment_id, address last_answerer) external { bool is_commitment = _verifyHistoryInputOrRevert(questions[question_id].history_hash, last_history_hash, last_answer_or_commitment_id, questions[question_id].bond, last_answerer); address payee; // If the last answer is an unrevealed commit, it's always wrong. // For anything else, the last answer was set as the "best answer" in submitAnswer or submitAnswerReveal. if (is_commitment && !commitments[last_answer_or_commitment_id].is_revealed) { require(commitments[last_answer_or_commitment_id].reveal_ts < uint32(block.timestamp), "You must wait for the reveal deadline before finalizing"); payee = payee_if_wrong; } else { payee = (questions[question_id].best_answer == answer) ? last_answerer : payee_if_wrong; } submitAnswerByArbitrator(question_id, answer, payee); } /// @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(block.timestamp)) ); } /// @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) public view returns (bytes32) { return questions[question_id].best_answer; } /// @notice Returns whether the question was answered before it had an answer, ie resolved to UNRESOLVED_ANSWER /// @param question_id The ID of the question function isSettledTooSoon(bytes32 question_id) public view returns(bool) { return (resultFor(question_id) == UNRESOLVED_ANSWER); } /// @notice Like resultFor(), but errors out if settled too soon, or returns the result of a replacement if it was reopened at the right time and settled /// @param question_id The ID of the question function resultForOnceSettled(bytes32 question_id) external view returns(bytes32) { bytes32 result = resultFor(question_id); if (result == UNRESOLVED_ANSWER) { // Try the replacement bytes32 replacement_id = reopened_questions[question_id]; require(replacement_id != bytes32(0x0), "Question was settled too soon and has not been reopened"); // We only try one layer down rather than recursing to keep the gas costs predictable result = resultFor(replacement_id); require(result != UNRESOLVED_ANSWER, "Question replacement was settled too soon and has not been reopened"); } return result; } /// @notice Asks a new question reopening a previously-asked question that was settled too soon /// @dev A special version of askQuestion() that replaces a previous question that was settled too soon /// @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 min_bond The minimum bond that can be used to provide the first answer. /// @param reopens_question_id The ID of the question this reopens /// @return The ID of the newly-created question, created deterministically. function reopenQuestion(uint256 template_id, string memory question, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 nonce, uint256 min_bond, bytes32 reopens_question_id) // stateNotCreated is enforced by the internal _askQuestion public payable returns (bytes32) { require(isSettledTooSoon(reopens_question_id), "You can only reopen questions that resolved as settled too soon"); bytes32 content_hash = keccak256(abi.encodePacked(template_id, opening_ts, question)); // A reopening must exactly match the original question, except for the nonce and the creator require(content_hash == questions[reopens_question_id].content_hash, "content hash mismatch"); require(arbitrator == questions[reopens_question_id].arbitrator, "arbitrator mismatch"); require(timeout == questions[reopens_question_id].timeout, "timeout mismatch"); require(opening_ts == questions[reopens_question_id].opening_ts , "opening_ts mismatch"); require(min_bond == questions[reopens_question_id].min_bond, "min_bond mismatch"); // If the the question was itself reopening some previous question, you'll have to re-reopen the previous question first. // This ensures the bounty can be passed on to the next attempt of the original question. require(!reopener_questions[reopens_question_id], "Question is already reopening a previous question"); // A question can only be reopened once, unless the reopening was also settled too soon in which case it can be replaced bytes32 existing_reopen_question_id = reopened_questions[reopens_question_id]; // Normally when we reopen a question we will take its bounty and pass it on to the reopened version. bytes32 take_bounty_from_question_id = reopens_question_id; // If the question has already been reopened but was again settled too soon, we can transfer its bounty to the next attempt. if (existing_reopen_question_id != bytes32(0)) { require(isSettledTooSoon(existing_reopen_question_id), "Question has already been reopened"); // We'll overwrite the reopening with our new question and move the bounty. // Once that's done we'll detach the failed reopener and you'll be able to reopen that too if you really want, but without the bounty. reopener_questions[existing_reopen_question_id] = false; take_bounty_from_question_id = existing_reopen_question_id; } bytes32 question_id = askQuestionWithMinBond(template_id, question, arbitrator, timeout, opening_ts, nonce, min_bond); reopened_questions[reopens_question_id] = question_id; reopener_questions[question_id] = true; questions[question_id].bounty = questions[take_bounty_from_question_id].bounty + questions[question_id].bounty; questions[take_bounty_from_question_id].bounty = 0; emit LogReopenQuestion(question_id, reopens_question_id); return question_id; } /// @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 + 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]; // Burn (just leave in contract balance) a fraction of all bonds except the final one. // This creates a cost to increasing your own bond, which could be used to delay resolution maliciously if (last_bond != questions[question_id].bond) { last_bond = last_bond - last_bond / BOND_CLAIM_FEE_PROPORTION; } 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 + 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] + 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; if (best_answer != UNRESOLVED_ANSWER && questions[question_id].bounty > 0) { _payPayee(question_id, payee, 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 - 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; } /// @notice Returns the minimum bond that can answer the question /// @param question_id The ID of the question function getMinBond(bytes32 question_id) public view returns(uint256) { return questions[question_id].min_bond; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}],"name":"LogCancelArbitration","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":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"min_bond","type":"uint256"}],"name":"LogMinimumBond","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":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"reopened_question_id","type":"bytes32"}],"name":"LogReopenQuestion","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":"payable","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":"min_bond","type":"uint256"}],"name":"askQuestionWithMinBond","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer","type":"bytes32"},{"internalType":"address","name":"payee_if_wrong","type":"address"},{"internalType":"bytes32","name":"last_history_hash","type":"bytes32"},{"internalType":"bytes32","name":"last_answer_or_commitment_id","type":"bytes32"},{"internalType":"address","name":"last_answerer","type":"address"}],"name":"assignWinnerAndSubmitAnswerByArbitrator","outputs":[],"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_id","type":"bytes32"}],"name":"cancelArbitration","outputs":[],"stateMutability":"nonpayable","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":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"fundAnswerBounty","outputs":[],"stateMutability":"payable","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":"getMinBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}],"name":"isSettledTooSoon","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"},{"internalType":"uint256","name":"min_bond","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"},{"internalType":"uint256","name":"min_bond","type":"uint256"},{"internalType":"bytes32","name":"reopens_question_id","type":"bytes32"}],"name":"reopenQuestion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"reopened_questions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"reopener_questions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"bytes32","name":"question_id","type":"bytes32"}],"name":"resultForOnceSettled","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":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer","type":"bytes32"},{"internalType":"uint256","name":"max_previous","type":"uint256"}],"name":"submitAnswer","outputs":[],"stateMutability":"payable","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"}],"name":"submitAnswerCommitment","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer","type":"bytes32"},{"internalType":"uint256","name":"max_previous","type":"uint256"},{"internalType":"address","name":"answerer","type":"address"}],"name":"submitAnswerFor","outputs":[],"stateMutability":"payable","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006001553480156200001657600080fd5b506200003b6040518060600160405280603f8152602001620044a4603f9139620000d6565b50620000606040518060800160405280604f815260200162004580604f9139620000d6565b50620000856040518060800160405280605a815260200162004526605a9139620000d6565b50620000aa6040518060800160405280605c815260200162004448605c9139620000d6565b50620000cf604051806080016040528060438152602001620044e360439139620000d6565b5062000223565b600154600081815260026020908152604080832043905551919291620000ff9185910162000176565b60408051601f1981840301815282825280516020918201206000858152600390925291902055339082907fb87fb721c0a557bb8dff89a86796466931d82ba530a66a239263eb8735ade2e4906200015890879062000194565b60405180910390a36200016d816001620001c9565b60015592915050565b600082516200018a818460208701620001f0565b9190910192915050565b6020815260008251806020840152620001b5816040850160208701620001f0565b601f01601f19169190910160400192915050565b60008219821115620001eb57634e487b7160e01b600052601160045260246000fd5b500190565b60005b838110156200020d578181015183820152602001620001f3565b838111156200021d576000848401525b50505050565b61421580620002336000396000f3fe6080604052600436106102675760003560e01c80637f8d429e11610144578063ab5a4e35116100b6578063d44e293c1161007a578063d44e293c14610983578063d7cff986146109a3578063e83bfb58146109b6578063ebbdd2b0146109e6578063f6a94ecb14610a06578063fe92049d14610a2657600080fd5b8063ab5a4e35146108cc578063acae8f4e146108ec578063bc52565214610929578063c081d8a314610956578063d09cc57e146108ac57600080fd5b8063924532fb11610108578063924532fb146106e357806395addb90146107165780639e63fa6a1461080a5780639f1025c61461085c578063a1130d0414610899578063a462fb7b146108ac57600080fd5b80637f8d429e146105d857806382ffa9f7146105f8578063839df9451461062857806383bf4609146106925780638d552d46146106b257600080fd5b8063484c0714116101dd578063590158a7116101a1578063590158a7146104da57806359245ff3146105455780636fa427421461055857806370a0823114610585578063762c38fd146105b257806377f325df146105c557600080fd5b8063484c0714146104105780634dc266b4146104405780634df6ca2a146104605780634e60f8831461048057806351577ea9146104ad57600080fd5b80632417395c1161022f5780632417395c146103175780632518904c1461034757806326d6c97b1461039857806328828b1e146103c85780633ccfd60b146103e8578063484b93c4146103fd57600080fd5b806306c3b67a1461026c5780631101a0fd146102a1578063111ec138146102c35780631126a9dc146102d657806312a203c3146102f7575b600080fd5b34801561027857600080fd5b5061028c610287366004613780565b610a46565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc3660046137ce565b610a5b565b005b6102c16102d136600461398b565b610d60565b6102e96102e4366004613ba2565b610fc2565b604051908152602001610298565b34801561030357600080fd5b506102e9610312366004613911565b611408565b34801561032357600080fd5b506102e9610332366004613780565b60009081526004602052604090206003015490565b34801561035357600080fd5b50610380610362366004613780565b6000908152600460205260409020600101546001600160a01b031690565b6040516001600160a01b039091168152602001610298565b3480156103a457600080fd5b506102e96103b3366004613780565b60009081526004602052604090206006015490565b3480156103d457600080fd5b506102c16103e336600461368c565b6115e3565b3480156103f457600080fd5b506102c161189b565b6102e961040b366004613b17565b611915565b34801561041c57600080fd5b506102e961042b366004613780565b60009081526004602052604090206007015490565b34801561044c57600080fd5b506102c161045b3660046139ca565b611a36565b34801561046c57600080fd5b506102c161047b366004613780565b611d3c565b34801561048c57600080fd5b506102e961049b366004613780565b60036020526000908152604090205481565b3480156104b957600080fd5b506102e96104c8366004613780565b60009081526004602052604090205490565b3480156104e657600080fd5b506105206104f5366004613780565b6005602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b604080516001600160a01b039094168452602084019290925290820152606001610298565b6102c1610553366004613780565b611d8a565b34801561056457600080fd5b506102e9610573366004613671565b60076020526000908152604090205481565b34801561059157600080fd5b506102e96105a0366004613671565b60006020819052908152604090205481565b6102e96105c0366004613ad5565b611f1d565b6102c16105d336600461395f565b61203f565b3480156105e457600080fd5b5061028c6105f3366004613780565b61224a565b34801561060457600080fd5b506102e9610613366004613780565b60009081526004602052604090206005015490565b34801561063457600080fd5b50610670610643366004613780565b6006602052600090815260409020805460019091015463ffffffff821691640100000000900460ff169083565b6040805163ffffffff9094168452911515602084015290820152606001610298565b34801561069e57600080fd5b506102e96106ad3660046139fc565b6122a6565b3480156106be57600080fd5b506102e96106cd366004613780565b6000908152600460208190526040909120015490565b3480156106ef57600080fd5b5061028c6106fe366004613780565b60009081526004602052604090206002015460ff1690565b34801561072257600080fd5b506107a3610731366004613780565b60046020819052600091825260409091208054600182015460028301546003840154948401546005850154600686015460079096015494966001600160a01b0385169663ffffffff600160a01b8704811697600160c01b8804821697600160e01b90049091169560ff1694929391908b565b604080519b8c526001600160a01b03909a1660208c015263ffffffff988916998b019990995295871660608a015295909316608088015290151560a087015260c086015260e085015261010084019190915261012083015261014082015261016001610298565b34801561081657600080fd5b50610847610825366004613780565b600090815260046020526040902060010154600160a01b900463ffffffff1690565b60405163ffffffff9091168152602001610298565b34801561086857600080fd5b50610847610877366004613780565b600090815260046020526040902060010154600160c01b900463ffffffff1690565b6102e96108a7366004613a38565b612342565b3480156108b857600080fd5b506102e96108c7366004613780565b61235e565b3480156108d857600080fd5b506102e96108e7366004613780565b61239e565b3480156108f857600080fd5b50610847610907366004613780565b600090815260046020526040902060010154600160e01b900463ffffffff1690565b34801561093557600080fd5b506102e9610944366004613780565b60026020526000908152604090205481565b34801561096257600080fd5b506102e9610971366004613780565b60086020526000908152604090205481565b34801561098f57600080fd5b506102c161099e3660046138b9565b6124cf565b6102c16109b136600461398b565b6125e6565b3480156109c257600080fd5b5061028c6109d1366004613780565b60096020526000908152604090205460ff1681565b3480156109f257600080fd5b506102c1610a01366004613780565b612846565b348015610a1257600080fd5b506102c1610a21366004613799565b61294a565b348015610a3257600080fd5b506102c1610a41366004613884565b612bca565b6000600119610a548361235e565b1492915050565b84610a658161224a565b610a8a5760405162461bcd60e51b8152600401610a8190613f07565b60405180910390fd5b6000855111610af45760405162461bcd60e51b815260206004820152603060248201527f6174206c65617374206f6e6520686973746f7279206861736820656e7472792060448201526f1b5d5cdd081899481c1c9bdd9a59195960821b6064820152608401610a81565b6000868152600560208181526040808420805460018201546002909201546004948590529286209485015494909301546001600160a01b039093169490939192905b8a51811015610ca4576000610bb2848d8481518110610b5757610b576141b3565b60200260200101518b8581518110610b7157610b716141b3565b60200260200101518d8681518110610b8b57610b8b6141b3565b60200260200101518f8781518110610ba557610ba56141b3565b6020026020010151612d1c565b9050610bbe868661408f565b9450610c1b8d84878a8f8781518110610bd957610bd96141b3565b60200260200101518f8881518110610bf357610bf36141b3565b60200260200101518f8981518110610c0d57610c0d6141b3565b602002602001015188612e0c565b8098508196505050898281518110610c3557610c356141b3565b60200260200101519550600460008e8152602001908152602001600020600601548614610c7457610c676028876140cf565b610c719087614125565b95505b8b8281518110610c8657610c866141b3565b60200260200101519350508080610c9c9061416c565b915050610b36565b8215610d02576001600160a01b03861615610cc957610cc48c8786612f56565b600093505b60008c815260056020526040902080546001600160a01b0319166001600160a01b03881617815560018101869055600201849055610d3e565b610d168c87610d11888861408f565b612f56565b60008c815260056020526040812080546001600160a01b031916815560018101829055600201555b50506000998a5260046020526040909920600501989098555050505050505050565b6000848152600460205260409020600101548490600160c01b900463ffffffff16610d9d5760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff1615610dcf5760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580610e0657504263ffffffff168163ffffffff16115b610e225760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580610e5a57504263ffffffff168163ffffffff1611155b610e765760405162461bcd60e51b8152600401610a8190613e4f565b8660003411610e975760405162461bcd60e51b8152600401610a8190613f75565b60008181526004602052604090206006015480610ee457600082815260046020526040902060070154341015610edf5760405162461bcd60e51b8152600401610a8190613d5d565b610f0e565b610eef816002614106565b341015610f0e5760405162461bcd60e51b8152600401610a8190613ebd565b88878015610f4757600082815260046020526040902060060154811015610f475760405162461bcd60e51b8152600401610a8190613f3e565b6001600160a01b038816610f9d5760405162461bcd60e51b815260206004820152601960248201527f616e737765726572206d757374206265206e6f6e2d7a65726f000000000000006044820152606401610a81565b610fab8b8b8a346000612fd0565b610fb58b8b6130a8565b5050505050505050505050565b6000610fcd82610a46565b61103f5760405162461bcd60e51b815260206004820152603f60248201527f596f752063616e206f6e6c792072656f70656e207175657374696f6e7320746860448201527f6174207265736f6c76656420617320736574746c656420746f6f20736f6f6e006064820152608401610a81565b600089868a60405160200161105693929190613d11565b60408051601f1981840301815291815281516020928301206000868152600490935291205490915081146110c45760405162461bcd60e51b81526020600482015260156024820152740c6dedce8cadce840d0c2e6d040dad2e6dac2e8c6d605b1b6044820152606401610a81565b6000838152600460205260409020600101546001600160a01b038981169116146111265760405162461bcd60e51b81526020600482015260136024820152720c2e4c4d2e8e4c2e8dee440dad2e6dac2e8c6d606b1b6044820152606401610a81565b60008381526004602052604090206001015463ffffffff888116600160c01b90920416146111895760405162461bcd60e51b815260206004820152601060248201526f0e8d2dacadeeae840dad2e6dac2e8c6d60831b6044820152606401610a81565b60008381526004602052604090206001015463ffffffff878116600160a01b90920416146111ef5760405162461bcd60e51b81526020600482015260136024820152720dee0cadcd2dccebee8e640dad2e6dac2e8c6d606b1b6044820152606401610a81565b60008381526004602052604090206007015484146112435760405162461bcd60e51b81526020600482015260116024820152700dad2dcbec4dedcc840dad2e6dac2e8c6d607b1b6044820152606401610a81565b60008381526009602052604090205460ff16156112bc5760405162461bcd60e51b815260206004820152603160248201527f5175657374696f6e20697320616c72656164792072656f70656e696e67206120604482015270383932bb34b7bab99038bab2b9ba34b7b760791b6064820152608401610a81565b60008381526008602052604090205483811561134b576112db82610a46565b6113325760405162461bcd60e51b815260206004820152602260248201527f5175657374696f6e2068617320616c7265616479206265656e2072656f70656e604482015261195960f21b6064820152608401610a81565b506000818152600960205260409020805460ff19169055805b600061135c8d8d8d8d8d8d8d611915565b600087815260086020908152604080832084905583835260098252808320805460ff19166001179055600490915280822060039081015486845291909220909101549192506113aa9161408f565b6000828152600460205260408082206003908101939093558482528082209092018190559051879183917f32e7d5617fb1be6bd0e7c3974d438d4514c4cf349e9330691d8abf6f6fd431219190a39c9b505050505050505050505050565b6000856114148161224a565b6114305760405162461bcd60e51b8152600401610a8190613f07565b600087815260046020526040902054861461148d5760405162461bcd60e51b815260206004820152601760248201527f636f6e74656e742068617368206d757374206d617463680000000000000000006044820152606401610a81565b6000878152600460205260409020600101546001600160a01b038681169116146114f15760405162461bcd60e51b81526020600482015260156024820152740c2e4c4d2e8e4c2e8dee440daeae6e840dac2e8c6d605b1b6044820152606401610a81565b60008781526004602052604090206001015463ffffffff600160c01b909104811690851611156115635760405162461bcd60e51b815260206004820152601b60248201527f74696d656f7574206d757374206265206c6f6e6720656e6f75676800000000006044820152606401610a81565b6000878152600460205260409020600601548311156115c45760405162461bcd60e51b815260206004820152601860248201527f626f6e64206d757374206265206869676820656e6f75676800000000000000006044820152606401610a81565b6000878152600460208190526040909120015491505095945050505050565b6000805b8751821015611889576000888381518110611604576116046141b3565b602002602001015190506000888481518110611622576116226141b3565b602002602001015190506000816001600160401b03811115611646576116466141c9565b60405190808252806020026020018201604052801561166f578160200160208202803683370190505b5090506000826001600160401b0381111561168c5761168c6141c9565b6040519080825280602002602001820160405280156116b5578160200160208202803683370190505b5090506000836001600160401b038111156116d2576116d26141c9565b6040519080825280602002602001820160405280156116fb578160200160208202803683370190505b5090506000846001600160401b03811115611718576117186141c9565b604051908082528060200260200182016040528015611741578160200160208202803683370190505b50905060005b85811015611862578c8881518110611761576117616141b3565b602002602001015185828151811061177b5761177b6141b3565b6020026020010181815250508b8881518110611799576117996141b3565b60200260200101518482815181106117b3576117b36141b3565b60200260200101906001600160a01b031690816001600160a01b0316815250508a88815181106117e5576117e56141b3565b60200260200101518382815181106117ff576117ff6141b3565b60200260200101818152505089888151811061181d5761181d6141b3565b6020026020010151828281518110611837576118376141b3565b60209081029190910101528761184c8161416c565b985050808061185a9061416c565b915050611747565b61186f8786868686610a5b565b5050505050505081806118819061416c565b9250506115e7565b61189161189b565b5050505050505050565b33600081815260208190526040808220805490839055905190929183156108fc02918491818181858888f193505050501580156118dc573d6000803e3d6000fd5b5060405181815233907f4ce7033d118120e254016dccf195288400b28fc8936425acd5f17ce2df3ab7089060200160405180910390a250565b6000878152600260205260408120546119665760405162461bcd60e51b81526020600482015260136024820152721d195b5c1b185d19481b5d5cdd08195e1a5cdd606a1b6044820152606401610a81565b600088858960405160200161197d93929190613d11565b60405160208183030381529060405280519060200120905060008188888630338a6040516020016119b49796959493929190613c61565b60405160208183030381529060405280519060200120905081336001600160a01b0316827ffe2dac156a3890636ce13f65f4fdf41dcaee11526e4a5374531572d92194796c8d8d8d8d8d8d42604051611a139796959493929190613fec565b60405180910390a4611a2981838a8a8a89613112565b9998505050505050505050565b6000848152600460205260409020600101548490600160c01b900463ffffffff16611a735760405162461bcd60e51b8152600401610a8190613dde565b600081815260046020526040902060010154600160e01b900463ffffffff16801580611aaa57504263ffffffff168163ffffffff16115b611b085760405162461bcd60e51b815260206004820152602960248201527f66696e616c697a6174696f6e206465616c696e65206d757374206e6f742068616044820152681d99481c185cdcd95960ba1b6064820152608401610a81565b600082815260046020526040902060010154600160a01b900463ffffffff16801580611b4057504263ffffffff168163ffffffff1611155b611b5c5760405162461bcd60e51b8152600401610a8190613e4f565b604080516020808201899052818301889052825180830384018152606083018452805190820120608083018b905260a0830181905260c08084018990528451808503909101815260e090930184528251928201929092206000818152600690925292902054909190640100000000900460ff1615611c2f5760405162461bcd60e51b815260206004820152602a60248201527f636f6d6d69746d656e74206d757374206e6f742068617665206265656e2072656044820152691d99585b1959081e595d60b21b6064820152608401610a81565b60008181526006602052604090205463ffffffff428116911611611ca15760405162461bcd60e51b8152602060048201526024808201527f72657665616c20646561646c696e65206d757374206e6f7420686176652070616044820152631cdcd95960e21b6064820152608401610a81565b6000818152600660208181526040808420600181018d9055805464ff0000000019166401000000001790558c845260049091529091200154861415611cea57611cea89896130a8565b6040805189815260208101899052908101879052829033908b907fa7b2d313bc7a062e30b2c3b811aa4c9faf09755a6b4ea3bf42deff920944332f9060600160405180910390a4505050505050505050565b33600081815260076020908152604091829020849055815192835282018390527fdca703d022171824d3d639b33c1525fd2338120b4cfb89507c0b59596893acda910160405180910390a150565b6000818152600460205260409020600101548190600160c01b900463ffffffff16611dc75760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff1615611df95760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580611e3057504263ffffffff168163ffffffff16115b611e4c5760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580611e8457504263ffffffff168163ffffffff1611155b611ea05760405162461bcd60e51b8152600401610a8190613e4f565b600084815260046020526040902060030154611ebd90349061408f565b6000858152600460205260409081902060030182905551339186917f54d68405b79f2aa4fd4e8db7b67844ad254cf8f208aac476c2894134a9deab6691611f0f91349190918252602082015260400190565b60405180910390a350505050565b600086815260026020526040812054611f6e5760405162461bcd60e51b81526020600482015260136024820152721d195b5c1b185d19481b5d5cdd08195e1a5cdd606a1b6044820152606401610a81565b6000878488604051602001611f8593929190613d11565b60405160208183030381529060405280519060200120905060008187876000303389604051602001611fbd9796959493929190613c61565b60405160208183030381529060405280519060200120905081336001600160a01b0316827ffe2dac156a3890636ce13f65f4fdf41dcaee11526e4a5374531572d92194796c8c8c8c8c8c8c4260405161201c9796959493929190613fec565b60405180910390a461203381838989896000613112565b98975050505050505050565b6000838152600460205260409020600101548390600160c01b900463ffffffff1661207c5760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156120ae5760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff168015806120e557504263ffffffff168163ffffffff16115b6121015760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff1680158061213957504263ffffffff168163ffffffff1611155b6121555760405162461bcd60e51b8152600401610a8190613e4f565b85600034116121765760405162461bcd60e51b8152600401610a8190613f75565b600081815260046020526040902060060154806121c3576000828152600460205260409020600701543410156121be5760405162461bcd60e51b8152600401610a8190613d5d565b6121ed565b6121ce816002614106565b3410156121ed5760405162461bcd60e51b8152600401610a8190613ebd565b87868015612226576000828152600460205260409020600601548110156122265760405162461bcd60e51b8152600401610a8190613f3e565b6122348a8a33346000612fd0565b61223e8a8a6130a8565b50505050505050505050565b60008181526004602052604081206001810154600290910154600160e01b90910463ffffffff169060ff16158015612287575063ffffffff811615155b801561229f57504263ffffffff168163ffffffff1611155b9392505050565b6001546000818152600260209081526040808320439055519192916122cd91859101613cf5565b60408051601f1981840301815282825280516020918201206000858152600390925291902055339082907fb87fb721c0a557bb8dff89a86796466931d82ba530a66a239263eb8735ade2e490612324908790613d4a565b60405180910390a361233781600161408f565b60015590505b919050565b60008061234e886122a6565b9050612033818888888888611f1d565b60008161236a8161224a565b6123865760405162461bcd60e51b8152600401610a8190613f07565b50506000908152600460208190526040909120015490565b6000806123aa8361235e565b90506001198114156124c957600083815260086020526040902054806124385760405162461bcd60e51b815260206004820152603760248201527f5175657374696f6e2077617320736574746c656420746f6f20736f6f6e20616e60448201527f6420686173206e6f74206265656e2072656f70656e65640000000000000000006064820152608401610a81565b6124418161235e565b91506001198214156124c75760405162461bcd60e51b815260206004820152604360248201527f5175657374696f6e207265706c6163656d656e742077617320736574746c656460448201527f20746f6f20736f6f6e20616e6420686173206e6f74206265656e2072656f70656064820152621b995960ea1b608482015260a401610a81565b505b92915050565b600086815260046020526040812060058101546006909101546124f791908690869086612d1c565b9050600081801561251f5750600084815260066020526040902054640100000000900460ff16155b156125b75760008481526006602052604090205463ffffffff4281169116106125b05760405162461bcd60e51b815260206004820152603760248201527f596f75206d757374207761697420666f72207468652072657665616c2064656160448201527f646c696e65206265666f72652066696e616c697a696e670000000000000000006064820152608401610a81565b50846125db565b6000888152600460208190526040909120015487146125d657856125d8565b825b90505b611891888883612bca565b6000848152600460205260409020600101548490600160c01b900463ffffffff166126235760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156126555760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff1680158061268c57504263ffffffff168163ffffffff16115b6126a85760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff168015806126e057504263ffffffff168163ffffffff1611155b6126fc5760405162461bcd60e51b8152600401610a8190613e4f565b866000341161271d5760405162461bcd60e51b8152600401610a8190613f75565b6000818152600460205260409020600601548061276a576000828152600460205260409020600701543410156127655760405162461bcd60e51b8152600401610a8190613d5d565b612794565b612775816002614106565b3410156127945760405162461bcd60e51b8152600401610a8190613ebd565b888780156127cd576000828152600460205260409020600601548110156127cd5760405162461bcd60e51b8152600401610a8190613f3e565b60408051602081018d90529081018b905234606082015260009060800160408051601f198184030181529190528051602090910120905060006001600160a01b038a161561281b578961281d565b335b90506128298d83613430565b6128378d8383346001612fd0565b50505050505050505050505050565b60008181526004602052604090206001015481906001600160a01b031633146128815760405162461bcd60e51b8152600401610a8190613e86565b600082815260046020526040902060020154829060ff166128b45760405162461bcd60e51b8152600401610a8190613e0b565b600083815260046020526040902060028101805460ff19169055600101546128e990600160c01b900463ffffffff16426140a7565b600084815260046020526040808220600101805463ffffffff94909416600160e01b026001600160e01b0390941693909317909255905184917f71bf7c2b9df0b8818e7eb6746a5bf69699ebbab041f3795f9ed58e469afa9a3a91a2505050565b60008381526004602052604090206001015483906001600160a01b031633146129855760405162461bcd60e51b8152600401610a8190613e86565b6000848152600460205260409020600101548490600160c01b900463ffffffff166129c25760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156129f45760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580612a2b57504263ffffffff168163ffffffff16115b612a475760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580612a7f57504263ffffffff168163ffffffff1611155b612a9b5760405162461bcd60e51b8152600401610a8190613e4f565b86858015612ad457600082815260046020526040902060060154811015612ad45760405162461bcd60e51b8152600401610a8190613f3e565b600089815260046020526040902060010154600160e01b900463ffffffff16612b705760405162461bcd60e51b815260206004820152604260248201527f5175657374696f6e206d75737420616c7265616479206861766520616e20616e60448201527f73776572207768656e206172626974726174696f6e2069732072657175657374606482015261195960f21b608482015260a401610a81565b600089815260046020526040808220600201805460ff19166001179055516001600160a01b038a16918b917f75d7939999bc902187c4aed400872883e445145f1983539166f783fa040b47629190a3505050505050505050565b60008381526004602052604090206001015483906001600160a01b03163314612c055760405162461bcd60e51b8152600401610a8190613e86565b600084815260046020526040902060020154849060ff16612c385760405162461bcd60e51b8152600401610a8190613e0b565b6001600160a01b038316612c8e5760405162461bcd60e51b815260206004820152601960248201527f616e737765726572206d7573742062652070726f7669646564000000000000006044820152606401610a81565b604051849086907f18d760beffe3717270cd90d9d920ec1a48c194e9ad7bba23eb1c92d3eb974f9790600090a36000858152600460205260408120600201805460ff19169055612ce49086908690869080612fd0565b50505060009182526004602081905260409092209182015560010180546001600160e01b0316600160e01b4263ffffffff1602179055565b6000848484846001604051602001612d38959493929190613cba565b60405160208183030381529060405280519060200120861415612d5d57506001612e03565b848484846000604051602001612d77959493929190613cba565b60405160208183030381529060405280519060200120861415612d9c57506000612e03565b60405162461bcd60e51b815260206004820152603660248201527f486973746f727920696e7075742070726f766964656420646964206e6f74206d6044820152750c2e8c6d040e8d0ca40caf0e0cac6e8cac840d0c2e6d60531b6064820152608401610a81565b95945050505050565b6000808215612e85576000848152600660205260409020548490640100000000900460ff16612e5d576000908152600660205260408120805464ffffffffff19168155600101555086905085612f49565b6000908152600660205260408120600181018054825464ffffffffff19169092559190915593505b88841415612f43576001600160a01b038716612eff5785965060011960001b8914158015612ec3575060008a81526004602052604090206003015415155b15612efa5760008a815260046020526040902060030154612ee7908b908990612f56565b60008a8152600460205260408120600301555b612f43565b866001600160a01b0316866001600160a01b031614612f4357600085891015612f285788612f2a565b855b9050612f3b8b89610d11848d614125565b869750809850505b50869050855b9850989650505050505050565b6001600160a01b038216600090815260208190526040902054612f7a90829061408f565b6001600160a01b038316600081815260208181526040918290209390935551838152909185917f9c121aff33b50c1a53fef034ebec5f83da2d5a5187048f9c76c397ba27c1a1a6910160405180910390a3505050565b6000858152600460209081526040808320600501549051612ff992889187918991889101613cba565b604051602081830303815290604052805190602001209050600083111561302f5760008681526004602052604090206006018390555b600086815260046020908152604091829020600501839055815187815290810183905290810184905242606082015282151560808201526001600160a01b0385169087907fe47ca4ebbbc2990134d1168821f38c5e177f3d5ee564bffeadeaa351905e62219060a00160405180910390a3505050505050565b6000828152600460208190526040909120908101829055600101546130da90600160c01b900463ffffffff16426140a7565b600092835260046020526040909220600101805463ffffffff93909316600160e01b026001600160e01b039093169290921790915550565b6000868152600460205260409020600101548690600160c01b900463ffffffff16156131805760405162461bcd60e51b815260206004820152601760248201527f7175657374696f6e206d757374206e6f742065786973740000000000000000006044820152606401610a81565b60008463ffffffff16116131d65760405162461bcd60e51b815260206004820152601860248201527f74696d656f7574206d75737420626520706f73697469766500000000000000006044820152606401610a81565b6301e133808463ffffffff161061323a5760405162461bcd60e51b815260206004820152602260248201527f74696d656f7574206d757374206265206c657373207468616e20333635206461604482015261797360f01b6064820152608401610a81565b346001600160a01b0386161580159061325c5750336001600160a01b03871614155b15613322576001600160a01b038616600090815260076020526040902054808210156132d65760405162461bcd60e51b8152602060048201526024808201527f4554482070726f7669646564206d75737420636f766572207175657374696f6e6044820152632066656560e01b6064820152608401610a81565b6132e08183614125565b6001600160a01b03881660009081526020819052604090205490925061330790829061408f565b6001600160a01b038816600090815260208190526040902055505b6000888152600460205260409020878155600101805463ffffffff878116600160c01b0263ffffffff60c01b19918816600160a01b026001600160c01b03199093166001600160a01b038b1617929092171617905580156133d057600088815260046020908152604091829020600301839055815183815290810183905233918a917f54d68405b79f2aa4fd4e8db7b67844ad254cf8f208aac476c2894134a9deab66910160405180910390a35b821561189157600088815260046020526040908190206007018490555188907f9641ca9d53af3bead658ffcc6c7d8c35e7dae9938367bd8eb45bee35d5c625049061341e9086815260200190565b60405180910390a25050505050505050565b60008181526006602052604090205463ffffffff161561349c5760405162461bcd60e51b815260206004820152602160248201527f636f6d6d69746d656e74206d757374206e6f7420616c726561647920657869736044820152601d60fa1b6064820152608401610a81565b6000828152600460205260408120600101546134c790600890600160c01b900463ffffffff166140e3565b90506134d381426140a7565b600092835260066020526040909220805463ffffffff191663ffffffff909316929092179091555050565b80356001600160a01b038116811461233d57600080fd5b600082601f83011261352657600080fd5b8135602061353b6135368361406c565b61403c565b80838252828201915082860187848660051b890101111561355b57600080fd5b60005b858110156135815761356f826134fe565b8452928401929084019060010161355e565b5090979650505050505050565b600082601f83011261359f57600080fd5b813560206135af6135368361406c565b80838252828201915082860187848660051b89010111156135cf57600080fd5b60005b85811015613581578135845292840192908401906001016135d2565b600082601f8301126135ff57600080fd5b81356001600160401b03811115613618576136186141c9565b61362b601f8201601f191660200161403c565b81815284602083860101111561364057600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff8116811461233d57600080fd5b60006020828403121561368357600080fd5b61229f826134fe565b60008060008060008060c087890312156136a557600080fd5b86356001600160401b03808211156136bc57600080fd5b6136c88a838b0161358e565b975060208901359150808211156136de57600080fd5b6136ea8a838b0161358e565b9650604089013591508082111561370057600080fd5b61370c8a838b0161358e565b9550606089013591508082111561372257600080fd5b61372e8a838b01613515565b9450608089013591508082111561374457600080fd5b6137508a838b0161358e565b935060a089013591508082111561376657600080fd5b5061377389828a0161358e565b9150509295509295509295565b60006020828403121561379257600080fd5b5035919050565b6000806000606084860312156137ae57600080fd5b833592506137be602085016134fe565b9150604084013590509250925092565b600080600080600060a086880312156137e657600080fd5b8535945060208601356001600160401b038082111561380457600080fd5b61381089838a0161358e565b9550604088013591508082111561382657600080fd5b61383289838a01613515565b9450606088013591508082111561384857600080fd5b61385489838a0161358e565b9350608088013591508082111561386a57600080fd5b506138778882890161358e565b9150509295509295909350565b60008060006060848603121561389957600080fd5b83359250602084013591506138b0604085016134fe565b90509250925092565b60008060008060008060c087890312156138d257600080fd5b86359550602087013594506138e9604088016134fe565b9350606087013592506080870135915061390560a088016134fe565b90509295509295509295565b600080600080600060a0868803121561392957600080fd5b8535945060208601359350613940604087016134fe565b925061394e6060870161365d565b949793965091946080013592915050565b60008060006060848603121561397457600080fd5b505081359360208301359350604090920135919050565b600080600080608085870312156139a157600080fd5b8435935060208501359250604085013591506139bf606086016134fe565b905092959194509250565b600080600080608085870312156139e057600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215613a0e57600080fd5b81356001600160401b03811115613a2457600080fd5b613a30848285016135ee565b949350505050565b60008060008060008060c08789031215613a5157600080fd5b86356001600160401b0380821115613a6857600080fd5b613a748a838b016135ee565b97506020890135915080821115613a8a57600080fd5b50613a9789828a016135ee565b955050613aa6604088016134fe565b9350613ab46060880161365d565b9250613ac26080880161365d565b915060a087013590509295509295509295565b60008060008060008060c08789031215613aee57600080fd5b8635955060208701356001600160401b03811115613b0b57600080fd5b613a9789828a016135ee565b600080600080600080600060e0888a031215613b3257600080fd5b8735965060208801356001600160401b03811115613b4f57600080fd5b613b5b8a828b016135ee565b965050613b6a604089016134fe565b9450613b786060890161365d565b9350613b866080890161365d565b925060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613bbf57600080fd5b8835975060208901356001600160401b03811115613bdc57600080fd5b613be88b828c016135ee565b975050613bf760408a016134fe565b9550613c0560608a0161365d565b9450613c1360808a0161365d565b979a969950949793969560a0850135955060c08501359460e001359350915050565b60008151808452613c4d81602086016020860161413c565b601f01601f19169290920160200192915050565b968752606095861b6bffffffffffffffffffffffff19908116602089015260e09590951b6001600160e01b0319166034880152603887019390935290841b8316605886015290921b16606c830152608082015260a00190565b94855260208501939093526040840191909152606090811b6bffffffffffffffffffffffff191690830152151560f81b607482015260750190565b60008251613d0781846020870161413c565b9190910192915050565b83815263ffffffff60e01b8360e01b16602082015260008251613d3b81602485016020870161413c565b91909101602401949350505050565b60208152600061229f6020830184613c35565b6020808252601c908201527f626f6e64206d7573742065786365656420746865206d696e696d756d00000000604082015260600190565b6020808252602a908201527f66696e616c697a6174696f6e20646561646c696e65206d757374206e6f742068604082015269185d99481c185cdcd95960b21b606082015260800190565b6020808252601390820152721c5d595cdd1a5bdb881b5d5cdd08195e1a5cdd606a1b604082015260600190565b60208082526024908201527f7175657374696f6e206d7573742062652070656e64696e6720617262697472616040820152633a34b7b760e11b606082015260800190565b6020808252601d908201527f6f70656e696e672064617465206d757374206861766520706173736564000000604082015260600190565b6020808252601d908201527f6d73672e73656e646572206d7573742062652061726269747261746f72000000604082015260600190565b6020808252602a908201527f626f6e64206d75737420626520646f75626c65206174206c65617374207072656040820152691d9a5bdd5cc8189bdb9960b21b606082015260800190565b6020808252601a908201527f7175657374696f6e206d7573742062652066696e616c697a6564000000000000604082015260600190565b6020808252601d908201527f626f6e64206d75737420657863656564206d61785f70726576696f7573000000604082015260600190565b602080825260159082015274626f6e64206d75737420626520706f73697469766560581b604082015260600190565b60208082526028908201527f7175657374696f6e206d757374206e6f742062652070656e64696e672061726260408201526734ba3930ba34b7b760c11b606082015260800190565b87815260e06020820152600061400560e0830189613c35565b6001600160a01b039790971660408301525063ffffffff948516606082015292909316608083015260a082015260c0015292915050565b604051601f8201601f191681016001600160401b0381118282101715614064576140646141c9565b604052919050565b60006001600160401b03821115614085576140856141c9565b5060051b60200190565b600082198211156140a2576140a2614187565b500190565b600063ffffffff8083168185168083038211156140c6576140c6614187565b01949350505050565b6000826140de576140de61419d565b500490565b600063ffffffff808416806140fa576140fa61419d565b92169190910492915050565b600081600019048311821515161561412057614120614187565b500290565b60008282101561413757614137614187565b500390565b60005b8381101561415757818101518382015260200161413f565b83811115614166576000848401525b50505050565b600060001982141561418057614180614187565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122005531d2892fcdeb48472a864e59887b41c9670a9e5c69b4cabf85caa744b255764736f6c634300080600337b227469746c65223a20222573222c202274797065223a20226d756c7469706c652d73656c656374222c20226f7574636f6d6573223a205b25735d2c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a2022626f6f6c222c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a20226461746574696d65222c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a202273696e676c652d73656c656374222c20226f7574636f6d6573223a205b25735d2c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a202275696e74222c2022646563696d616c73223a2031382c202263617465676f7279223a20222573222c20226c616e67223a20222573227d
Deployed Bytecode
0x6080604052600436106102675760003560e01c80637f8d429e11610144578063ab5a4e35116100b6578063d44e293c1161007a578063d44e293c14610983578063d7cff986146109a3578063e83bfb58146109b6578063ebbdd2b0146109e6578063f6a94ecb14610a06578063fe92049d14610a2657600080fd5b8063ab5a4e35146108cc578063acae8f4e146108ec578063bc52565214610929578063c081d8a314610956578063d09cc57e146108ac57600080fd5b8063924532fb11610108578063924532fb146106e357806395addb90146107165780639e63fa6a1461080a5780639f1025c61461085c578063a1130d0414610899578063a462fb7b146108ac57600080fd5b80637f8d429e146105d857806382ffa9f7146105f8578063839df9451461062857806383bf4609146106925780638d552d46146106b257600080fd5b8063484c0714116101dd578063590158a7116101a1578063590158a7146104da57806359245ff3146105455780636fa427421461055857806370a0823114610585578063762c38fd146105b257806377f325df146105c557600080fd5b8063484c0714146104105780634dc266b4146104405780634df6ca2a146104605780634e60f8831461048057806351577ea9146104ad57600080fd5b80632417395c1161022f5780632417395c146103175780632518904c1461034757806326d6c97b1461039857806328828b1e146103c85780633ccfd60b146103e8578063484b93c4146103fd57600080fd5b806306c3b67a1461026c5780631101a0fd146102a1578063111ec138146102c35780631126a9dc146102d657806312a203c3146102f7575b600080fd5b34801561027857600080fd5b5061028c610287366004613780565b610a46565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc3660046137ce565b610a5b565b005b6102c16102d136600461398b565b610d60565b6102e96102e4366004613ba2565b610fc2565b604051908152602001610298565b34801561030357600080fd5b506102e9610312366004613911565b611408565b34801561032357600080fd5b506102e9610332366004613780565b60009081526004602052604090206003015490565b34801561035357600080fd5b50610380610362366004613780565b6000908152600460205260409020600101546001600160a01b031690565b6040516001600160a01b039091168152602001610298565b3480156103a457600080fd5b506102e96103b3366004613780565b60009081526004602052604090206006015490565b3480156103d457600080fd5b506102c16103e336600461368c565b6115e3565b3480156103f457600080fd5b506102c161189b565b6102e961040b366004613b17565b611915565b34801561041c57600080fd5b506102e961042b366004613780565b60009081526004602052604090206007015490565b34801561044c57600080fd5b506102c161045b3660046139ca565b611a36565b34801561046c57600080fd5b506102c161047b366004613780565b611d3c565b34801561048c57600080fd5b506102e961049b366004613780565b60036020526000908152604090205481565b3480156104b957600080fd5b506102e96104c8366004613780565b60009081526004602052604090205490565b3480156104e657600080fd5b506105206104f5366004613780565b6005602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b604080516001600160a01b039094168452602084019290925290820152606001610298565b6102c1610553366004613780565b611d8a565b34801561056457600080fd5b506102e9610573366004613671565b60076020526000908152604090205481565b34801561059157600080fd5b506102e96105a0366004613671565b60006020819052908152604090205481565b6102e96105c0366004613ad5565b611f1d565b6102c16105d336600461395f565b61203f565b3480156105e457600080fd5b5061028c6105f3366004613780565b61224a565b34801561060457600080fd5b506102e9610613366004613780565b60009081526004602052604090206005015490565b34801561063457600080fd5b50610670610643366004613780565b6006602052600090815260409020805460019091015463ffffffff821691640100000000900460ff169083565b6040805163ffffffff9094168452911515602084015290820152606001610298565b34801561069e57600080fd5b506102e96106ad3660046139fc565b6122a6565b3480156106be57600080fd5b506102e96106cd366004613780565b6000908152600460208190526040909120015490565b3480156106ef57600080fd5b5061028c6106fe366004613780565b60009081526004602052604090206002015460ff1690565b34801561072257600080fd5b506107a3610731366004613780565b60046020819052600091825260409091208054600182015460028301546003840154948401546005850154600686015460079096015494966001600160a01b0385169663ffffffff600160a01b8704811697600160c01b8804821697600160e01b90049091169560ff1694929391908b565b604080519b8c526001600160a01b03909a1660208c015263ffffffff988916998b019990995295871660608a015295909316608088015290151560a087015260c086015260e085015261010084019190915261012083015261014082015261016001610298565b34801561081657600080fd5b50610847610825366004613780565b600090815260046020526040902060010154600160a01b900463ffffffff1690565b60405163ffffffff9091168152602001610298565b34801561086857600080fd5b50610847610877366004613780565b600090815260046020526040902060010154600160c01b900463ffffffff1690565b6102e96108a7366004613a38565b612342565b3480156108b857600080fd5b506102e96108c7366004613780565b61235e565b3480156108d857600080fd5b506102e96108e7366004613780565b61239e565b3480156108f857600080fd5b50610847610907366004613780565b600090815260046020526040902060010154600160e01b900463ffffffff1690565b34801561093557600080fd5b506102e9610944366004613780565b60026020526000908152604090205481565b34801561096257600080fd5b506102e9610971366004613780565b60086020526000908152604090205481565b34801561098f57600080fd5b506102c161099e3660046138b9565b6124cf565b6102c16109b136600461398b565b6125e6565b3480156109c257600080fd5b5061028c6109d1366004613780565b60096020526000908152604090205460ff1681565b3480156109f257600080fd5b506102c1610a01366004613780565b612846565b348015610a1257600080fd5b506102c1610a21366004613799565b61294a565b348015610a3257600080fd5b506102c1610a41366004613884565b612bca565b6000600119610a548361235e565b1492915050565b84610a658161224a565b610a8a5760405162461bcd60e51b8152600401610a8190613f07565b60405180910390fd5b6000855111610af45760405162461bcd60e51b815260206004820152603060248201527f6174206c65617374206f6e6520686973746f7279206861736820656e7472792060448201526f1b5d5cdd081899481c1c9bdd9a59195960821b6064820152608401610a81565b6000868152600560208181526040808420805460018201546002909201546004948590529286209485015494909301546001600160a01b039093169490939192905b8a51811015610ca4576000610bb2848d8481518110610b5757610b576141b3565b60200260200101518b8581518110610b7157610b716141b3565b60200260200101518d8681518110610b8b57610b8b6141b3565b60200260200101518f8781518110610ba557610ba56141b3565b6020026020010151612d1c565b9050610bbe868661408f565b9450610c1b8d84878a8f8781518110610bd957610bd96141b3565b60200260200101518f8881518110610bf357610bf36141b3565b60200260200101518f8981518110610c0d57610c0d6141b3565b602002602001015188612e0c565b8098508196505050898281518110610c3557610c356141b3565b60200260200101519550600460008e8152602001908152602001600020600601548614610c7457610c676028876140cf565b610c719087614125565b95505b8b8281518110610c8657610c866141b3565b60200260200101519350508080610c9c9061416c565b915050610b36565b8215610d02576001600160a01b03861615610cc957610cc48c8786612f56565b600093505b60008c815260056020526040902080546001600160a01b0319166001600160a01b03881617815560018101869055600201849055610d3e565b610d168c87610d11888861408f565b612f56565b60008c815260056020526040812080546001600160a01b031916815560018101829055600201555b50506000998a5260046020526040909920600501989098555050505050505050565b6000848152600460205260409020600101548490600160c01b900463ffffffff16610d9d5760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff1615610dcf5760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580610e0657504263ffffffff168163ffffffff16115b610e225760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580610e5a57504263ffffffff168163ffffffff1611155b610e765760405162461bcd60e51b8152600401610a8190613e4f565b8660003411610e975760405162461bcd60e51b8152600401610a8190613f75565b60008181526004602052604090206006015480610ee457600082815260046020526040902060070154341015610edf5760405162461bcd60e51b8152600401610a8190613d5d565b610f0e565b610eef816002614106565b341015610f0e5760405162461bcd60e51b8152600401610a8190613ebd565b88878015610f4757600082815260046020526040902060060154811015610f475760405162461bcd60e51b8152600401610a8190613f3e565b6001600160a01b038816610f9d5760405162461bcd60e51b815260206004820152601960248201527f616e737765726572206d757374206265206e6f6e2d7a65726f000000000000006044820152606401610a81565b610fab8b8b8a346000612fd0565b610fb58b8b6130a8565b5050505050505050505050565b6000610fcd82610a46565b61103f5760405162461bcd60e51b815260206004820152603f60248201527f596f752063616e206f6e6c792072656f70656e207175657374696f6e7320746860448201527f6174207265736f6c76656420617320736574746c656420746f6f20736f6f6e006064820152608401610a81565b600089868a60405160200161105693929190613d11565b60408051601f1981840301815291815281516020928301206000868152600490935291205490915081146110c45760405162461bcd60e51b81526020600482015260156024820152740c6dedce8cadce840d0c2e6d040dad2e6dac2e8c6d605b1b6044820152606401610a81565b6000838152600460205260409020600101546001600160a01b038981169116146111265760405162461bcd60e51b81526020600482015260136024820152720c2e4c4d2e8e4c2e8dee440dad2e6dac2e8c6d606b1b6044820152606401610a81565b60008381526004602052604090206001015463ffffffff888116600160c01b90920416146111895760405162461bcd60e51b815260206004820152601060248201526f0e8d2dacadeeae840dad2e6dac2e8c6d60831b6044820152606401610a81565b60008381526004602052604090206001015463ffffffff878116600160a01b90920416146111ef5760405162461bcd60e51b81526020600482015260136024820152720dee0cadcd2dccebee8e640dad2e6dac2e8c6d606b1b6044820152606401610a81565b60008381526004602052604090206007015484146112435760405162461bcd60e51b81526020600482015260116024820152700dad2dcbec4dedcc840dad2e6dac2e8c6d607b1b6044820152606401610a81565b60008381526009602052604090205460ff16156112bc5760405162461bcd60e51b815260206004820152603160248201527f5175657374696f6e20697320616c72656164792072656f70656e696e67206120604482015270383932bb34b7bab99038bab2b9ba34b7b760791b6064820152608401610a81565b60008381526008602052604090205483811561134b576112db82610a46565b6113325760405162461bcd60e51b815260206004820152602260248201527f5175657374696f6e2068617320616c7265616479206265656e2072656f70656e604482015261195960f21b6064820152608401610a81565b506000818152600960205260409020805460ff19169055805b600061135c8d8d8d8d8d8d8d611915565b600087815260086020908152604080832084905583835260098252808320805460ff19166001179055600490915280822060039081015486845291909220909101549192506113aa9161408f565b6000828152600460205260408082206003908101939093558482528082209092018190559051879183917f32e7d5617fb1be6bd0e7c3974d438d4514c4cf349e9330691d8abf6f6fd431219190a39c9b505050505050505050505050565b6000856114148161224a565b6114305760405162461bcd60e51b8152600401610a8190613f07565b600087815260046020526040902054861461148d5760405162461bcd60e51b815260206004820152601760248201527f636f6e74656e742068617368206d757374206d617463680000000000000000006044820152606401610a81565b6000878152600460205260409020600101546001600160a01b038681169116146114f15760405162461bcd60e51b81526020600482015260156024820152740c2e4c4d2e8e4c2e8dee440daeae6e840dac2e8c6d605b1b6044820152606401610a81565b60008781526004602052604090206001015463ffffffff600160c01b909104811690851611156115635760405162461bcd60e51b815260206004820152601b60248201527f74696d656f7574206d757374206265206c6f6e6720656e6f75676800000000006044820152606401610a81565b6000878152600460205260409020600601548311156115c45760405162461bcd60e51b815260206004820152601860248201527f626f6e64206d757374206265206869676820656e6f75676800000000000000006044820152606401610a81565b6000878152600460208190526040909120015491505095945050505050565b6000805b8751821015611889576000888381518110611604576116046141b3565b602002602001015190506000888481518110611622576116226141b3565b602002602001015190506000816001600160401b03811115611646576116466141c9565b60405190808252806020026020018201604052801561166f578160200160208202803683370190505b5090506000826001600160401b0381111561168c5761168c6141c9565b6040519080825280602002602001820160405280156116b5578160200160208202803683370190505b5090506000836001600160401b038111156116d2576116d26141c9565b6040519080825280602002602001820160405280156116fb578160200160208202803683370190505b5090506000846001600160401b03811115611718576117186141c9565b604051908082528060200260200182016040528015611741578160200160208202803683370190505b50905060005b85811015611862578c8881518110611761576117616141b3565b602002602001015185828151811061177b5761177b6141b3565b6020026020010181815250508b8881518110611799576117996141b3565b60200260200101518482815181106117b3576117b36141b3565b60200260200101906001600160a01b031690816001600160a01b0316815250508a88815181106117e5576117e56141b3565b60200260200101518382815181106117ff576117ff6141b3565b60200260200101818152505089888151811061181d5761181d6141b3565b6020026020010151828281518110611837576118376141b3565b60209081029190910101528761184c8161416c565b985050808061185a9061416c565b915050611747565b61186f8786868686610a5b565b5050505050505081806118819061416c565b9250506115e7565b61189161189b565b5050505050505050565b33600081815260208190526040808220805490839055905190929183156108fc02918491818181858888f193505050501580156118dc573d6000803e3d6000fd5b5060405181815233907f4ce7033d118120e254016dccf195288400b28fc8936425acd5f17ce2df3ab7089060200160405180910390a250565b6000878152600260205260408120546119665760405162461bcd60e51b81526020600482015260136024820152721d195b5c1b185d19481b5d5cdd08195e1a5cdd606a1b6044820152606401610a81565b600088858960405160200161197d93929190613d11565b60405160208183030381529060405280519060200120905060008188888630338a6040516020016119b49796959493929190613c61565b60405160208183030381529060405280519060200120905081336001600160a01b0316827ffe2dac156a3890636ce13f65f4fdf41dcaee11526e4a5374531572d92194796c8d8d8d8d8d8d42604051611a139796959493929190613fec565b60405180910390a4611a2981838a8a8a89613112565b9998505050505050505050565b6000848152600460205260409020600101548490600160c01b900463ffffffff16611a735760405162461bcd60e51b8152600401610a8190613dde565b600081815260046020526040902060010154600160e01b900463ffffffff16801580611aaa57504263ffffffff168163ffffffff16115b611b085760405162461bcd60e51b815260206004820152602960248201527f66696e616c697a6174696f6e206465616c696e65206d757374206e6f742068616044820152681d99481c185cdcd95960ba1b6064820152608401610a81565b600082815260046020526040902060010154600160a01b900463ffffffff16801580611b4057504263ffffffff168163ffffffff1611155b611b5c5760405162461bcd60e51b8152600401610a8190613e4f565b604080516020808201899052818301889052825180830384018152606083018452805190820120608083018b905260a0830181905260c08084018990528451808503909101815260e090930184528251928201929092206000818152600690925292902054909190640100000000900460ff1615611c2f5760405162461bcd60e51b815260206004820152602a60248201527f636f6d6d69746d656e74206d757374206e6f742068617665206265656e2072656044820152691d99585b1959081e595d60b21b6064820152608401610a81565b60008181526006602052604090205463ffffffff428116911611611ca15760405162461bcd60e51b8152602060048201526024808201527f72657665616c20646561646c696e65206d757374206e6f7420686176652070616044820152631cdcd95960e21b6064820152608401610a81565b6000818152600660208181526040808420600181018d9055805464ff0000000019166401000000001790558c845260049091529091200154861415611cea57611cea89896130a8565b6040805189815260208101899052908101879052829033908b907fa7b2d313bc7a062e30b2c3b811aa4c9faf09755a6b4ea3bf42deff920944332f9060600160405180910390a4505050505050505050565b33600081815260076020908152604091829020849055815192835282018390527fdca703d022171824d3d639b33c1525fd2338120b4cfb89507c0b59596893acda910160405180910390a150565b6000818152600460205260409020600101548190600160c01b900463ffffffff16611dc75760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff1615611df95760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580611e3057504263ffffffff168163ffffffff16115b611e4c5760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580611e8457504263ffffffff168163ffffffff1611155b611ea05760405162461bcd60e51b8152600401610a8190613e4f565b600084815260046020526040902060030154611ebd90349061408f565b6000858152600460205260409081902060030182905551339186917f54d68405b79f2aa4fd4e8db7b67844ad254cf8f208aac476c2894134a9deab6691611f0f91349190918252602082015260400190565b60405180910390a350505050565b600086815260026020526040812054611f6e5760405162461bcd60e51b81526020600482015260136024820152721d195b5c1b185d19481b5d5cdd08195e1a5cdd606a1b6044820152606401610a81565b6000878488604051602001611f8593929190613d11565b60405160208183030381529060405280519060200120905060008187876000303389604051602001611fbd9796959493929190613c61565b60405160208183030381529060405280519060200120905081336001600160a01b0316827ffe2dac156a3890636ce13f65f4fdf41dcaee11526e4a5374531572d92194796c8c8c8c8c8c8c4260405161201c9796959493929190613fec565b60405180910390a461203381838989896000613112565b98975050505050505050565b6000838152600460205260409020600101548390600160c01b900463ffffffff1661207c5760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156120ae5760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff168015806120e557504263ffffffff168163ffffffff16115b6121015760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff1680158061213957504263ffffffff168163ffffffff1611155b6121555760405162461bcd60e51b8152600401610a8190613e4f565b85600034116121765760405162461bcd60e51b8152600401610a8190613f75565b600081815260046020526040902060060154806121c3576000828152600460205260409020600701543410156121be5760405162461bcd60e51b8152600401610a8190613d5d565b6121ed565b6121ce816002614106565b3410156121ed5760405162461bcd60e51b8152600401610a8190613ebd565b87868015612226576000828152600460205260409020600601548110156122265760405162461bcd60e51b8152600401610a8190613f3e565b6122348a8a33346000612fd0565b61223e8a8a6130a8565b50505050505050505050565b60008181526004602052604081206001810154600290910154600160e01b90910463ffffffff169060ff16158015612287575063ffffffff811615155b801561229f57504263ffffffff168163ffffffff1611155b9392505050565b6001546000818152600260209081526040808320439055519192916122cd91859101613cf5565b60408051601f1981840301815282825280516020918201206000858152600390925291902055339082907fb87fb721c0a557bb8dff89a86796466931d82ba530a66a239263eb8735ade2e490612324908790613d4a565b60405180910390a361233781600161408f565b60015590505b919050565b60008061234e886122a6565b9050612033818888888888611f1d565b60008161236a8161224a565b6123865760405162461bcd60e51b8152600401610a8190613f07565b50506000908152600460208190526040909120015490565b6000806123aa8361235e565b90506001198114156124c957600083815260086020526040902054806124385760405162461bcd60e51b815260206004820152603760248201527f5175657374696f6e2077617320736574746c656420746f6f20736f6f6e20616e60448201527f6420686173206e6f74206265656e2072656f70656e65640000000000000000006064820152608401610a81565b6124418161235e565b91506001198214156124c75760405162461bcd60e51b815260206004820152604360248201527f5175657374696f6e207265706c6163656d656e742077617320736574746c656460448201527f20746f6f20736f6f6e20616e6420686173206e6f74206265656e2072656f70656064820152621b995960ea1b608482015260a401610a81565b505b92915050565b600086815260046020526040812060058101546006909101546124f791908690869086612d1c565b9050600081801561251f5750600084815260066020526040902054640100000000900460ff16155b156125b75760008481526006602052604090205463ffffffff4281169116106125b05760405162461bcd60e51b815260206004820152603760248201527f596f75206d757374207761697420666f72207468652072657665616c2064656160448201527f646c696e65206265666f72652066696e616c697a696e670000000000000000006064820152608401610a81565b50846125db565b6000888152600460208190526040909120015487146125d657856125d8565b825b90505b611891888883612bca565b6000848152600460205260409020600101548490600160c01b900463ffffffff166126235760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156126555760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff1680158061268c57504263ffffffff168163ffffffff16115b6126a85760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff168015806126e057504263ffffffff168163ffffffff1611155b6126fc5760405162461bcd60e51b8152600401610a8190613e4f565b866000341161271d5760405162461bcd60e51b8152600401610a8190613f75565b6000818152600460205260409020600601548061276a576000828152600460205260409020600701543410156127655760405162461bcd60e51b8152600401610a8190613d5d565b612794565b612775816002614106565b3410156127945760405162461bcd60e51b8152600401610a8190613ebd565b888780156127cd576000828152600460205260409020600601548110156127cd5760405162461bcd60e51b8152600401610a8190613f3e565b60408051602081018d90529081018b905234606082015260009060800160408051601f198184030181529190528051602090910120905060006001600160a01b038a161561281b578961281d565b335b90506128298d83613430565b6128378d8383346001612fd0565b50505050505050505050505050565b60008181526004602052604090206001015481906001600160a01b031633146128815760405162461bcd60e51b8152600401610a8190613e86565b600082815260046020526040902060020154829060ff166128b45760405162461bcd60e51b8152600401610a8190613e0b565b600083815260046020526040902060028101805460ff19169055600101546128e990600160c01b900463ffffffff16426140a7565b600084815260046020526040808220600101805463ffffffff94909416600160e01b026001600160e01b0390941693909317909255905184917f71bf7c2b9df0b8818e7eb6746a5bf69699ebbab041f3795f9ed58e469afa9a3a91a2505050565b60008381526004602052604090206001015483906001600160a01b031633146129855760405162461bcd60e51b8152600401610a8190613e86565b6000848152600460205260409020600101548490600160c01b900463ffffffff166129c25760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156129f45760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580612a2b57504263ffffffff168163ffffffff16115b612a475760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580612a7f57504263ffffffff168163ffffffff1611155b612a9b5760405162461bcd60e51b8152600401610a8190613e4f565b86858015612ad457600082815260046020526040902060060154811015612ad45760405162461bcd60e51b8152600401610a8190613f3e565b600089815260046020526040902060010154600160e01b900463ffffffff16612b705760405162461bcd60e51b815260206004820152604260248201527f5175657374696f6e206d75737420616c7265616479206861766520616e20616e60448201527f73776572207768656e206172626974726174696f6e2069732072657175657374606482015261195960f21b608482015260a401610a81565b600089815260046020526040808220600201805460ff19166001179055516001600160a01b038a16918b917f75d7939999bc902187c4aed400872883e445145f1983539166f783fa040b47629190a3505050505050505050565b60008381526004602052604090206001015483906001600160a01b03163314612c055760405162461bcd60e51b8152600401610a8190613e86565b600084815260046020526040902060020154849060ff16612c385760405162461bcd60e51b8152600401610a8190613e0b565b6001600160a01b038316612c8e5760405162461bcd60e51b815260206004820152601960248201527f616e737765726572206d7573742062652070726f7669646564000000000000006044820152606401610a81565b604051849086907f18d760beffe3717270cd90d9d920ec1a48c194e9ad7bba23eb1c92d3eb974f9790600090a36000858152600460205260408120600201805460ff19169055612ce49086908690869080612fd0565b50505060009182526004602081905260409092209182015560010180546001600160e01b0316600160e01b4263ffffffff1602179055565b6000848484846001604051602001612d38959493929190613cba565b60405160208183030381529060405280519060200120861415612d5d57506001612e03565b848484846000604051602001612d77959493929190613cba565b60405160208183030381529060405280519060200120861415612d9c57506000612e03565b60405162461bcd60e51b815260206004820152603660248201527f486973746f727920696e7075742070726f766964656420646964206e6f74206d6044820152750c2e8c6d040e8d0ca40caf0e0cac6e8cac840d0c2e6d60531b6064820152608401610a81565b95945050505050565b6000808215612e85576000848152600660205260409020548490640100000000900460ff16612e5d576000908152600660205260408120805464ffffffffff19168155600101555086905085612f49565b6000908152600660205260408120600181018054825464ffffffffff19169092559190915593505b88841415612f43576001600160a01b038716612eff5785965060011960001b8914158015612ec3575060008a81526004602052604090206003015415155b15612efa5760008a815260046020526040902060030154612ee7908b908990612f56565b60008a8152600460205260408120600301555b612f43565b866001600160a01b0316866001600160a01b031614612f4357600085891015612f285788612f2a565b855b9050612f3b8b89610d11848d614125565b869750809850505b50869050855b9850989650505050505050565b6001600160a01b038216600090815260208190526040902054612f7a90829061408f565b6001600160a01b038316600081815260208181526040918290209390935551838152909185917f9c121aff33b50c1a53fef034ebec5f83da2d5a5187048f9c76c397ba27c1a1a6910160405180910390a3505050565b6000858152600460209081526040808320600501549051612ff992889187918991889101613cba565b604051602081830303815290604052805190602001209050600083111561302f5760008681526004602052604090206006018390555b600086815260046020908152604091829020600501839055815187815290810183905290810184905242606082015282151560808201526001600160a01b0385169087907fe47ca4ebbbc2990134d1168821f38c5e177f3d5ee564bffeadeaa351905e62219060a00160405180910390a3505050505050565b6000828152600460208190526040909120908101829055600101546130da90600160c01b900463ffffffff16426140a7565b600092835260046020526040909220600101805463ffffffff93909316600160e01b026001600160e01b039093169290921790915550565b6000868152600460205260409020600101548690600160c01b900463ffffffff16156131805760405162461bcd60e51b815260206004820152601760248201527f7175657374696f6e206d757374206e6f742065786973740000000000000000006044820152606401610a81565b60008463ffffffff16116131d65760405162461bcd60e51b815260206004820152601860248201527f74696d656f7574206d75737420626520706f73697469766500000000000000006044820152606401610a81565b6301e133808463ffffffff161061323a5760405162461bcd60e51b815260206004820152602260248201527f74696d656f7574206d757374206265206c657373207468616e20333635206461604482015261797360f01b6064820152608401610a81565b346001600160a01b0386161580159061325c5750336001600160a01b03871614155b15613322576001600160a01b038616600090815260076020526040902054808210156132d65760405162461bcd60e51b8152602060048201526024808201527f4554482070726f7669646564206d75737420636f766572207175657374696f6e6044820152632066656560e01b6064820152608401610a81565b6132e08183614125565b6001600160a01b03881660009081526020819052604090205490925061330790829061408f565b6001600160a01b038816600090815260208190526040902055505b6000888152600460205260409020878155600101805463ffffffff878116600160c01b0263ffffffff60c01b19918816600160a01b026001600160c01b03199093166001600160a01b038b1617929092171617905580156133d057600088815260046020908152604091829020600301839055815183815290810183905233918a917f54d68405b79f2aa4fd4e8db7b67844ad254cf8f208aac476c2894134a9deab66910160405180910390a35b821561189157600088815260046020526040908190206007018490555188907f9641ca9d53af3bead658ffcc6c7d8c35e7dae9938367bd8eb45bee35d5c625049061341e9086815260200190565b60405180910390a25050505050505050565b60008181526006602052604090205463ffffffff161561349c5760405162461bcd60e51b815260206004820152602160248201527f636f6d6d69746d656e74206d757374206e6f7420616c726561647920657869736044820152601d60fa1b6064820152608401610a81565b6000828152600460205260408120600101546134c790600890600160c01b900463ffffffff166140e3565b90506134d381426140a7565b600092835260066020526040909220805463ffffffff191663ffffffff909316929092179091555050565b80356001600160a01b038116811461233d57600080fd5b600082601f83011261352657600080fd5b8135602061353b6135368361406c565b61403c565b80838252828201915082860187848660051b890101111561355b57600080fd5b60005b858110156135815761356f826134fe565b8452928401929084019060010161355e565b5090979650505050505050565b600082601f83011261359f57600080fd5b813560206135af6135368361406c565b80838252828201915082860187848660051b89010111156135cf57600080fd5b60005b85811015613581578135845292840192908401906001016135d2565b600082601f8301126135ff57600080fd5b81356001600160401b03811115613618576136186141c9565b61362b601f8201601f191660200161403c565b81815284602083860101111561364057600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff8116811461233d57600080fd5b60006020828403121561368357600080fd5b61229f826134fe565b60008060008060008060c087890312156136a557600080fd5b86356001600160401b03808211156136bc57600080fd5b6136c88a838b0161358e565b975060208901359150808211156136de57600080fd5b6136ea8a838b0161358e565b9650604089013591508082111561370057600080fd5b61370c8a838b0161358e565b9550606089013591508082111561372257600080fd5b61372e8a838b01613515565b9450608089013591508082111561374457600080fd5b6137508a838b0161358e565b935060a089013591508082111561376657600080fd5b5061377389828a0161358e565b9150509295509295509295565b60006020828403121561379257600080fd5b5035919050565b6000806000606084860312156137ae57600080fd5b833592506137be602085016134fe565b9150604084013590509250925092565b600080600080600060a086880312156137e657600080fd5b8535945060208601356001600160401b038082111561380457600080fd5b61381089838a0161358e565b9550604088013591508082111561382657600080fd5b61383289838a01613515565b9450606088013591508082111561384857600080fd5b61385489838a0161358e565b9350608088013591508082111561386a57600080fd5b506138778882890161358e565b9150509295509295909350565b60008060006060848603121561389957600080fd5b83359250602084013591506138b0604085016134fe565b90509250925092565b60008060008060008060c087890312156138d257600080fd5b86359550602087013594506138e9604088016134fe565b9350606087013592506080870135915061390560a088016134fe565b90509295509295509295565b600080600080600060a0868803121561392957600080fd5b8535945060208601359350613940604087016134fe565b925061394e6060870161365d565b949793965091946080013592915050565b60008060006060848603121561397457600080fd5b505081359360208301359350604090920135919050565b600080600080608085870312156139a157600080fd5b8435935060208501359250604085013591506139bf606086016134fe565b905092959194509250565b600080600080608085870312156139e057600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215613a0e57600080fd5b81356001600160401b03811115613a2457600080fd5b613a30848285016135ee565b949350505050565b60008060008060008060c08789031215613a5157600080fd5b86356001600160401b0380821115613a6857600080fd5b613a748a838b016135ee565b97506020890135915080821115613a8a57600080fd5b50613a9789828a016135ee565b955050613aa6604088016134fe565b9350613ab46060880161365d565b9250613ac26080880161365d565b915060a087013590509295509295509295565b60008060008060008060c08789031215613aee57600080fd5b8635955060208701356001600160401b03811115613b0b57600080fd5b613a9789828a016135ee565b600080600080600080600060e0888a031215613b3257600080fd5b8735965060208801356001600160401b03811115613b4f57600080fd5b613b5b8a828b016135ee565b965050613b6a604089016134fe565b9450613b786060890161365d565b9350613b866080890161365d565b925060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613bbf57600080fd5b8835975060208901356001600160401b03811115613bdc57600080fd5b613be88b828c016135ee565b975050613bf760408a016134fe565b9550613c0560608a0161365d565b9450613c1360808a0161365d565b979a969950949793969560a0850135955060c08501359460e001359350915050565b60008151808452613c4d81602086016020860161413c565b601f01601f19169290920160200192915050565b968752606095861b6bffffffffffffffffffffffff19908116602089015260e09590951b6001600160e01b0319166034880152603887019390935290841b8316605886015290921b16606c830152608082015260a00190565b94855260208501939093526040840191909152606090811b6bffffffffffffffffffffffff191690830152151560f81b607482015260750190565b60008251613d0781846020870161413c565b9190910192915050565b83815263ffffffff60e01b8360e01b16602082015260008251613d3b81602485016020870161413c565b91909101602401949350505050565b60208152600061229f6020830184613c35565b6020808252601c908201527f626f6e64206d7573742065786365656420746865206d696e696d756d00000000604082015260600190565b6020808252602a908201527f66696e616c697a6174696f6e20646561646c696e65206d757374206e6f742068604082015269185d99481c185cdcd95960b21b606082015260800190565b6020808252601390820152721c5d595cdd1a5bdb881b5d5cdd08195e1a5cdd606a1b604082015260600190565b60208082526024908201527f7175657374696f6e206d7573742062652070656e64696e6720617262697472616040820152633a34b7b760e11b606082015260800190565b6020808252601d908201527f6f70656e696e672064617465206d757374206861766520706173736564000000604082015260600190565b6020808252601d908201527f6d73672e73656e646572206d7573742062652061726269747261746f72000000604082015260600190565b6020808252602a908201527f626f6e64206d75737420626520646f75626c65206174206c65617374207072656040820152691d9a5bdd5cc8189bdb9960b21b606082015260800190565b6020808252601a908201527f7175657374696f6e206d7573742062652066696e616c697a6564000000000000604082015260600190565b6020808252601d908201527f626f6e64206d75737420657863656564206d61785f70726576696f7573000000604082015260600190565b602080825260159082015274626f6e64206d75737420626520706f73697469766560581b604082015260600190565b60208082526028908201527f7175657374696f6e206d757374206e6f742062652070656e64696e672061726260408201526734ba3930ba34b7b760c11b606082015260800190565b87815260e06020820152600061400560e0830189613c35565b6001600160a01b039790971660408301525063ffffffff948516606082015292909316608083015260a082015260c0015292915050565b604051601f8201601f191681016001600160401b0381118282101715614064576140646141c9565b604052919050565b60006001600160401b03821115614085576140856141c9565b5060051b60200190565b600082198211156140a2576140a2614187565b500190565b600063ffffffff8083168185168083038211156140c6576140c6614187565b01949350505050565b6000826140de576140de61419d565b500490565b600063ffffffff808416806140fa576140fa61419d565b92169190910492915050565b600081600019048311821515161561412057614120614187565b500290565b60008282101561413757614137614187565b500390565b60005b8381101561415757818101518382015260200161413f565b83811115614166576000848401525b50505050565b600060001982141561418057614180614187565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122005531d2892fcdeb48472a864e59887b41c9670a9e5c69b4cabf85caa744b255764736f6c63430008060033
Deployed Bytecode Sourcemap
465:49298:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30046:149;;;;;;;;;;-1:-1:-1;30046:149:0;;;;;:::i;:::-;;:::i;:::-;;;16122:14:1;;16115:22;16097:41;;16085:2;16070:18;30046:149:0;;;;;;;;38062:3237;;;;;;;;;;-1:-1:-1;38062:3237:0;;;;;:::i;:::-;;:::i;:::-;;18213:491;;;;;;:::i;:::-;;:::i;32225:3078::-;;;;;;:::i;:::-;;:::i;:::-;;;16295:25:1;;;16283:2;16268:18;32225:3078:0;16250:76:1;36060:668:0;;;;;;;;;;-1:-1:-1;36060:668:0;;;;;:::i;:::-;;:::i;48531:130::-;;;;;;;;;;-1:-1:-1;48531:130:0;;;;;:::i;:::-;48597:7;48624:22;;;:9;:22;;;;;:29;;;;48531:130;47108:138;;;;;;;;;;-1:-1:-1;47108:138:0;;;;;:::i;:::-;47178:7;47205:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;;;47205:33:0;;47108:138;;;;-1:-1:-1;;;;;15284:32:1;;;15266:51;;15254:2;15239:18;47108:138:0;15221:102:1;49370:126:0;;;;;;;;;;-1:-1:-1;49370:126:0;;;;;:::i;:::-;49434:7;49461:22;;;:9;:22;;;;;:27;;;;49370:126;45622:1072;;;;;;;;;;-1:-1:-1;45622:1072:0;;;;;:::i;:::-;;:::i;245:211::-;;;;;;;;;;;;;:::i;13357:1019::-;;;;;;:::i;:::-;;:::i;49626:132::-;;;;;;;;;;-1:-1:-1;49626:132:0;;;;;:::i;:::-;49692:7;49719:22;;;:9;:22;;;;;:31;;;;49626:132;21873:904;;;;;;;;;;-1:-1:-1;21873:904:0;;;;;:::i;:::-;;:::i;8261:184::-;;;;;;;;;;-1:-1:-1;8261:184:0;;;;;:::i;:::-;;:::i;4252:50::-;;;;;;;;;;-1:-1:-1;4252:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;46842:141;;;;;;;;;;-1:-1:-1;46842:141:0;;;;;:::i;:::-;46913:7;46940:22;;;:9;:22;;;;;:35;;46842:141;4361:48;;;;;;;;;;-1:-1:-1;4361:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4361:48:0;;;;;;;;;;;-1:-1:-1;;;;;15827:32:1;;;15809:51;;15891:2;15876:18;;15869:34;;;;15919:18;;;15912:34;15797:2;15782:18;4361:48:0;15764:188:1;16404:296:0;;;;;;:::i;:::-;;:::i;4472:59::-;;;;;;;;;;-1:-1:-1;4472:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;103:44;;;;;;;;;;-1:-1:-1;103:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;11417:973;;;;;;:::i;:::-;;:::i;17199:400::-;;;;;;:::i;:::-;;:::i;28798:291::-;;;;;;;;;;-1:-1:-1;28798:291:0;;;;;:::i;:::-;;:::i;49098:141::-;;;;;;;;;;-1:-1:-1;49098:141:0;;;;;:::i;:::-;49169:7;49196:22;;;:9;:22;;;;;:35;;;;49098:141;4416:49;;;;;;;;;;-1:-1:-1;4416:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35284:10:1;35272:23;;;35254:42;;35339:14;;35332:22;35327:2;35312:18;;35305:50;35371:18;;;35364:34;35242:2;35227:18;4416:49:0;35209:195:1;8832:361:0;;;;;;;;;;-1:-1:-1;8832:361:0;;;;;:::i;:::-;;:::i;48770:139::-;;;;;;;;;;-1:-1:-1;48770:139:0;;;;;:::i;:::-;48840:7;48867:22;;;:9;:22;;;;;;;;:34;;;48770:139;48193:154;;;;;;;;;;-1:-1:-1;48193:154:0;;;;;:::i;:::-;48270:4;48294:22;;;:9;:22;;;;;:45;;;;;;48193:154;4309:45;;;;;;;;;;-1:-1:-1;4309:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4309:45:0;;;;-1:-1:-1;;;4309:45:0;;;;;-1:-1:-1;;;4309:45:0;;;;;-1:-1:-1;;;4309:45:0;;;;;;;;;;;;;;;;;;;16747:25:1;;;-1:-1:-1;;;;;16808:32:1;;;16803:2;16788:18;;16781:60;16860:10;16906:15;;;16886:18;;;16879:43;;;;16958:15;;;16953:2;16938:18;;16931:43;17011:15;;;;17005:3;16990:19;;16983:44;17071:14;;17064:22;16828:3;17043:19;;17036:51;17118:3;17103:19;;17096:35;17162:3;17147:19;;17140:35;17206:3;17191:19;;17184:35;;;;17250:3;17235:19;;17228:35;17294:3;17279:19;;17272:36;16734:3;16719:19;4309:45:0;16701:613:1;47385:136:0;;;;;;;;;;-1:-1:-1;47385:136:0;;;;;:::i;:::-;47454:6;47480:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;47480:33:0;;;;;47385:136;;;;35037:10:1;35025:23;;;35007:42;;34995:2;34980:18;47385:136:0;34962:93:1;47652:131:0;;;;;;;;;;-1:-1:-1;47652:131:0;;;;;:::i;:::-;47719:6;47745:22;;;:9;:22;;;;;:30;;;-1:-1:-1;;;47745:30:0;;;;;47652:131;10078:446;;;;;;:::i;:::-;;:::i;29309:180::-;;;;;;;;;;-1:-1:-1;29309:180:0;;;;;:::i;:::-;;:::i;30414:714::-;;;;;;;;;;-1:-1:-1;30414:714:0;;;;;:::i;:::-;;:::i;47926:138::-;;;;;;;;;;-1:-1:-1;47926:138:0;;;;;:::i;:::-;47996:6;48022:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;48022:34:0;;;;;47926:138;4201:44;;;;;;;;;;-1:-1:-1;4201:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;4539:53;;;;;;;;;;-1:-1:-1;4539:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;27508:1105;;;;;;;;;;-1:-1:-1;27508:1105:0;;;;;:::i;:::-;;:::i;20260:626::-;;;;;;:::i;:::-;;:::i;4599:50::-;;;;;;;;;;-1:-1:-1;4599:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25296:371;;;;;;;;;;-1:-1:-1;25296:371:0;;;;;:::i;:::-;;:::i;24532:530::-;;;;;;;;;;-1:-1:-1;24532:530:0;;;;;:::i;:::-;;:::i;26273:519::-;;;;;;;;;;-1:-1:-1;26273:519:0;;;;;:::i;:::-;;:::i;30046:149::-;30118:4;-1:-1:-1;;30143:22:0;30153:11;30143:9;:22::i;:::-;:43;;30046:149;-1:-1:-1;;30046:149:0:o;38062:3237::-;38264:11;6451:24;6463:11;6451;:24::i;:::-;6443:63;;;;-1:-1:-1;;;6443:63:0;;;;;;;:::i;:::-;;;;;;;;;38334:1:::1;38310:14;:21;:25;38302:86;;;::::0;-1:-1:-1;;;38302:86:0;;32659:2:1;38302:86:0::1;::::0;::::1;32641:21:1::0;32698:2;32678:18;;;32671:30;32737:34;32717:18;;;32710:62;-1:-1:-1;;;32788:18:1;;;32781:46;32844:19;;38302:86:0::1;32631:238:1::0;38302:86:0::1;38482:13;38498:28:::0;;;:15:::1;:28;::::0;;;;;;;:34;;;38564:38;::::1;::::0;38637:41:::1;::::0;;::::1;::::0;38931:9:::1;:22:::0;;;;;;;:35;;::::1;::::0;39001:34;;;::::1;::::0;-1:-1:-1;;;;;38498:34:0;;::::1;::::0;38564:38;;38637:41;;39001:34;39068:1134:::1;39084:14;:21;39080:1;:25;39068:1134;;;39249:18;39270:97;39298:17;39317:14;39332:1;39317:17;;;;;;;;:::i;:::-;;;;;;;39336:7;39344:1;39336:10;;;;;;;;:::i;:::-;;;;;;;39348:5;39354:1;39348:8;;;;;;;;:::i;:::-;;;;;;;39358:5;39364:1;39358:8;;;;;;;;:::i;:::-;;;;;;;39270:27;:97::i;:::-;39249:118:::0;-1:-1:-1;39411:24:0::1;39426:9:::0;39411:12;:24:::1;:::i;:::-;39396:39;;39475:149;39513:11;39526;39539:12;39553:5;39578;39584:1;39578:8;;;;;;;;:::i;:::-;;;;;;;39588:5;39594:1;39588:8;;;;;;;;:::i;:::-;;;;;;;39598:7;39606:1;39598:10;;;;;;;;:::i;:::-;;;;;;;39610:13;39475:19;:149::i;:::-;39451:173;;;;;;;;39751:5;39757:1;39751:8;;;;;;;;:::i;:::-;;;;;;;39739:20;;40010:9;:22;40020:11;40010:22;;;;;;;;;;;:27;;;39997:9;:40;39993:142;;40082:37;1196:2;40082:9:::0;:37:::1;:::i;:::-;40070:49;::::0;:9;:49:::1;:::i;:::-;40058:61;;39993:142;40171:14;40186:1;40171:17;;;;;;;;:::i;:::-;;;;;;;40151:37;;39112:1090;39107:3;;;;;:::i;:::-;;;;39068:1134;;;40219:30:::0;;40215:1007:::1;;-1:-1:-1::0;;;;;40660:21:0;::::1;::::0;40656:140:::1;;40702:43;40712:11;40725:5;40732:12;40702:9;:43::i;:::-;40779:1;40764:16;;40656:140;40812:28;::::0;;;:15:::1;:28;::::0;;;;:42;;-1:-1:-1;;;;;;40812:42:0::1;-1:-1:-1::0;;;;;40812:42:0;::::1;;::::0;;-1:-1:-1;40869:38:0;::::1;:50:::0;;;40934:41:::1;;:56:::0;;;40215:1007:::1;;;41105:55;41115:11:::0;41128:5;41135:24:::1;41150:9:::0;41135:12;:24:::1;:::i;:::-;41105:9;:55::i;:::-;41182:28;::::0;;;:15:::1;:28;::::0;;;;41175:35;;-1:-1:-1;;;;;;41175:35:0::1;::::0;;;;::::1;::::0;;;::::1;;::::0;40215:1007:::1;-1:-1:-1::0;;41234:22:0::1;::::0;;;:9:::1;:22;::::0;;;;;:35:::1;;:55:::0;;;;-1:-1:-1;;;;;;;;38062:3237:0:o;18213:491::-;5129:1;5096:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;5096:30:0;;;;5088:66;;;;-1:-1:-1;;;5088:66:0;;;;;;;:::i;:::-;5174:22;;;;:9;:22;;;;;:45;;;;;5173:46;5165:99;;;;-1:-1:-1;;;5165:99:0;;;;;;;:::i;:::-;5275:18;5296:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;5296:34:0;;;;5349:25;;;:66;;;5399:15;5378:37;;:11;:37;;;5349:66;5341:121;;;;-1:-1:-1;;;5341:121:0;;;;;;;:::i;:::-;5473:17;5493:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;5493:33:0;;;;5545:15;;;:56;;;5585:15;5564:37;;:10;:37;;;;5545:56;5537:98;;;;-1:-1:-1;;;5537:98:0;;;;;;;:::i;:::-;18386:11:::1;6625:1;6613:9;:13;6605:47;;;;-1:-1:-1::0;;;6605:47:0::1;;;;;;;:::i;:::-;6664:20;6687:22:::0;;;:9:::1;:22;::::0;;;;:27:::1;;::::0;6729:17;6725:256:::1;;6785:22;::::0;;;:9:::1;:22;::::0;;;;:31:::1;;::::0;6771:9:::1;:46;;6763:87;;;;-1:-1:-1::0;;;6763:87:0::1;;;;;;;:::i;:::-;6725:256;;;6905:16;:12:::0;6920:1:::1;6905:16;:::i;:::-;6891:9;:31;;6883:86;;;;-1:-1:-1::0;;;6883:86:0::1;;;;;;;:::i;:::-;18443:11:::0;18456:12;7110:16;;7106:134:::2;;7151:22;::::0;;;:9:::2;:22;::::0;;;;:27:::2;;::::0;:43;-1:-1:-1;7151:43:0::2;7143:85;;;;-1:-1:-1::0;;;7143:85:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18511:24:0;::::3;18503:62;;;::::0;-1:-1:-1;;;18503:62:0;;19821:2:1;18503:62:0::3;::::0;::::3;19803:21:1::0;19860:2;19840:18;;;19833:30;19899:27;19879:18;;;19872:55;19944:18;;18503:62:0::3;19793:175:1::0;18503:62:0::3;18576:68;18596:11;18609:6;18617:8;18627:9;18638:5;18576:19;:68::i;:::-;18655:41;18676:11;18689:6;18655:20;:41::i;:::-;6991:1:::2;;6594:406:::1;5647:1;5077:579:::0;;18213:491;;;;;:::o;32225:3078::-;32509:7;32539:37;32556:19;32539:16;:37::i;:::-;32531:113;;;;-1:-1:-1;;;32531:113:0;;18548:2:1;32531:113:0;;;18530:21:1;18587:2;18567:18;;;18560:30;18626:34;18606:18;;;18599:62;18697:33;18677:18;;;18670:61;18748:19;;32531:113:0;18520:253:1;32531:113:0;32657:20;32707:11;32720:10;32732:8;32690:51;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;32690:51:0;;;;;;;;;32680:62;;32690:51;32680:62;;;;32882:30;;;;:9;:30;;;;;:43;32680:62;;-1:-1:-1;32866:59:0;;32858:93;;;;-1:-1:-1;;;32858:93:0;;30802:2:1;32858:93:0;;;30784:21:1;30841:2;30821:18;;;30814:30;-1:-1:-1;;;30860:18:1;;;30853:51;30921:18;;32858:93:0;30774:171:1;32858:93:0;32984:30;;;;:9;:30;;;;;:41;;;-1:-1:-1;;;;;32970:55:0;;;32984:41;;32970:55;32962:87;;;;-1:-1:-1;;;32962:87:0;;20880:2:1;32962:87:0;;;20862:21:1;20919:2;20899:18;;;20892:30;-1:-1:-1;;;20938:18:1;;;20931:49;20997:18;;32962:87:0;20852:169:1;32962:87:0;33079:30;;;;:9;:30;;;;;:38;;;;33068:49;;;-1:-1:-1;;;33079:38:0;;;;33068:49;33060:78;;;;-1:-1:-1;;;33060:78:0;;31152:2:1;33060:78:0;;;31134:21:1;31191:2;31171:18;;;31164:30;-1:-1:-1;;;31210:18:1;;;31203:46;31266:18;;33060:78:0;31124:166:1;33060:78:0;33171:30;;;;:9;:30;;;;;:41;;;;33157:55;;;-1:-1:-1;;;33171:41:0;;;;33157:55;33149:88;;;;-1:-1:-1;;;33149:88:0;;21228:2:1;33149:88:0;;;21210:21:1;21267:2;21247:18;;;21240:30;-1:-1:-1;;;21286:18:1;;;21279:49;21345:18;;33149:88:0;21200:169:1;33149:88:0;33268:30;;;;:9;:30;;;;;:39;;;33256:51;;33248:81;;;;-1:-1:-1;;;33248:81:0;;26518:2:1;33248:81:0;;;26500:21:1;26557:2;26537:18;;;26530:30;-1:-1:-1;;;26576:18:1;;;26569:47;26633:18;;33248:81:0;26490:167:1;33248:81:0;33581:39;;;;:18;:39;;;;;;;;33580:40;33572:102;;;;-1:-1:-1;;;33572:102:0;;19403:2:1;33572:102:0;;;19385:21:1;19442:2;19422:18;;;19415:30;19481:34;19461:18;;;19454:62;-1:-1:-1;;;19532:18:1;;;19525:47;19589:19;;33572:102:0;19375:239:1;33572:102:0;33817:35;33855:39;;;:18;:39;;;;;;33874:19;34225:41;;34221:546;;34291:45;34308:27;34291:16;:45::i;:::-;34283:92;;;;-1:-1:-1;;;34283:92:0;;24232:2:1;34283:92:0;;;24214:21:1;24271:2;24251:18;;;24244:30;24310:34;24290:18;;;24283:62;-1:-1:-1;;;24361:18:1;;;24354:32;24403:19;;34283:92:0;24204:224:1;34283:92:0;-1:-1:-1;34677:5:0;34627:47;;;:18;:47;;;;;:55;;-1:-1:-1;;34627:55:0;;;34646:27;34221:546;34779:19;34801:95;34824:11;34837:8;34847:10;34859:7;34868:10;34880:5;34887:8;34801:22;:95::i;:::-;34909:39;;;;:18;:39;;;;;;;;:53;;;34973:31;;;:18;:31;;;;;:38;;-1:-1:-1;;34973:38:0;35007:4;34973:38;;;35105:9;:22;;;;;;:29;;;;;35056:39;;;;;;;:46;;;;34779:117;;-1:-1:-1;35056:78:0;;;:::i;:::-;35024:22;;;;:9;:22;;;;;;:29;;;;:110;;;;35145:39;;;;;;:46;;;:50;;;35213:51;;35244:19;;35034:11;;35213:51;;35024:22;35213:51;35284:11;32225:3078;-1:-1:-1;;;;;;;;;;;;32225:3078:0:o;36060:668::-;36286:7;36245:11;6451:24;6463:11;6451;:24::i;:::-;6443:63;;;;-1:-1:-1;;;6443:63:0;;;;;;;:::i;:::-;36330:22:::1;::::0;;;:9:::1;:22;::::0;;;;:35;36314:51;::::1;36306:87;;;::::0;-1:-1:-1;;;36306:87:0;;20175:2:1;36306:87:0::1;::::0;::::1;20157:21:1::0;20214:2;20194:18;;;20187:30;20253:25;20233:18;;;20226:53;20296:18;;36306:87:0::1;20147:173:1::0;36306:87:0::1;36426:22;::::0;;;:9:::1;:22;::::0;;;;:33:::1;;::::0;-1:-1:-1;;;;;36412:47:0;;::::1;36426:33:::0;::::1;36412:47;36404:81;;;::::0;-1:-1:-1;;;36404:81:0;;32309:2:1;36404:81:0::1;::::0;::::1;32291:21:1::0;32348:2;32328:18;;;32321:30;-1:-1:-1;;;32367:18:1;;;32360:51;32428:18;;36404:81:0::1;32281:171:1::0;36404:81:0::1;36519:22;::::0;;;:9:::1;:22;::::0;;;;:30:::1;;::::0;::::1;-1:-1:-1::0;;;36519:30:0;;::::1;::::0;::::1;36504:45:::0;;::::1;;;36496:85;;;::::0;-1:-1:-1;;;36496:85:0;;30446:2:1;36496:85:0::1;::::0;::::1;30428:21:1::0;30485:2;30465:18;;;30458:30;30524:29;30504:18;;;30497:57;30571:18;;36496:85:0::1;30418:177:1::0;36496:85:0::1;36612:22;::::0;;;:9:::1;:22;::::0;;;;:27:::1;;::::0;36600:39;::::1;;36592:76;;;::::0;-1:-1:-1;;;36592:76:0;;23097:2:1;36592:76:0::1;::::0;::::1;23079:21:1::0;23136:2;23116:18;;;23109:30;23175:26;23155:18;;;23148:54;23219:18;;36592:76:0::1;23069:174:1::0;36592:76:0::1;36686:22;::::0;;;:9:::1;:22;::::0;;;;;;;:34:::1;::::0;;-1:-1:-1;36060:668:0;;;;;;;;:::o;45622:1072::-;45970:10:::1;::::0;46011:655:::1;46029:12;:19;46024:2;:24;46011:655;;;46071:11;46085:12;46098:2;46085:16;;;;;;;;:::i;:::-;;;;;;;46071:30;;46116:10;46129:7;46137:2;46129:11;;;;;;;;:::i;:::-;;;;;;;46116:24;;46155:19;46191:2;-1:-1:-1::0;;;;;46177:17:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;46177:17:0::1;;46155:39;;46209:19;46245:2;-1:-1:-1::0;;;;;46231:17:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;46231:17:0::1;;46209:39;;46263:19;46299:2;-1:-1:-1::0;;;;;46285:17:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;46285:17:0::1;;46263:39;;46317:19;46353:2;-1:-1:-1::0;;;;;46339:17:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;46339:17:0::1;;46317:39;;46371:9;46395:211;46411:2;46407:1;:6;46395:211;;;46447:11;46459:1;46447:14;;;;;;;;:::i;:::-;;;;;;;46439:2;46442:1;46439:5;;;;;;;;:::i;:::-;;;;;;:22;;;::::0;::::1;46488:5;46494:1;46488:8;;;;;;;;:::i;:::-;;;;;;;46480:2;46483:1;46480:5;;;;;;;;:::i;:::-;;;;;;:16;-1:-1:-1::0;;;;;46480:16:0::1;;;-1:-1:-1::0;;;;;46480:16:0::1;;;::::0;::::1;46523:5;46529:1;46523:8;;;;;;;;:::i;:::-;;;;;;;46515:2;46518:1;46515:5;;;;;;;;:::i;:::-;;;;;;:16;;;::::0;::::1;46558:7;46566:1;46558:10;;;;;;;;:::i;:::-;;;;;;;46550:2;46553:1;46550:5;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:18;46587:3;::::1;::::0;::::1;:::i;:::-;;;;46415;;;;;:::i;:::-;;;;46395:211;;;46620:34;46634:3;46639:2;46643;46647;46651;46620:13;:34::i;:::-;46056:610;;;;;;;46050:4;;;;;:::i;:::-;;;;46011:655;;;46676:10;:8;:10::i;:::-;45949:745;;45622:1072:::0;;;;;;:::o;245:211::-;313:10;289:11;303:21;;;;;;;;;;;;;335:25;;;;371:33;;303:21;;313:10;371:33;;;;;303:21;;371:33;289:11;371:33;303:21;313:10;371:33;;;;;;;;;;;;;;;;;;;;-1:-1:-1;420:28:0;;16295:25:1;;;432:10:0;;420:28;;16283:2:1;16268:18;420:28:0;;;;;;;278:178;245:211::o;13357:1019::-;13621:7;13651:22;;;:9;:22;;;;;;13643:58;;;;-1:-1:-1;;;13643:58:0;;25404:2:1;13643:58:0;;;25386:21:1;25443:2;25423:18;;;25416:30;-1:-1:-1;;;25462:18:1;;;25455:49;25521:18;;13643:58:0;25376:169:1;13643:58:0;13714:20;13764:11;13777:10;13789:8;13747:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13737:62;;;;;;13714:85;;13810:19;13859:12;13873:10;13885:7;13894:8;13912:4;13919:10;13931:5;13842:95;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13832:106;;;;;;13810:128;;14174:12;14139:10;-1:-1:-1;;;;;14111:133:0;14126:11;14111:133;14151:11;14164:8;14188:10;14200:7;14209:10;14221:5;14228:15;14111:133;;;;;;;;;;;;:::i;:::-;;;;;;;;14255:82;14268:11;14281:12;14295:10;14307:7;14316:10;14328:8;14255:12;:82::i;:::-;14357:11;13357:1019;-1:-1:-1;;;;;;;;;13357:1019:0:o;21873:904::-;5963:1;5930:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;5930:30:0;;;;5922:66;;;;-1:-1:-1;;;5922:66:0;;;;;;;:::i;:::-;5999:18;6020:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;6020:34:0;;;;6073:25;;;:66;;;6123:15;6102:37;;:11;:37;;;6073:66;6065:120;;;;-1:-1:-1;;;6065:120:0;;28173:2:1;6065:120:0;;;28155:21:1;28212:2;28192:18;;;28185:30;28251:34;28231:18;;;28224:62;-1:-1:-1;;;28302:18:1;;;28295:39;28351:19;;6065:120:0;28145:231:1;6065:120:0;6196:17;6216:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;6216:33:0;;;;6268:15;;;:56;;;6308:15;6287:37;;:10;:37;;;;6268:56;6260:98;;;;-1:-1:-1;;;6260:98:0;;;;;;;:::i;:::-;22079:31:::1;::::0;;::::1;::::0;;::::1;14291:19:1::0;;;14326:12;;;14319:28;;;22079:31:0;;;;;;;;;14363:12:1;;;22079:31:0;;22069:42;;;;::::1;::::0;22156:48;;;13486:19:1;;;13521:12;;;13514:28;;;13558:12;;;;13551:28;;;22156:48:0;;;;;;;;;;13595:12:1;;;;22156:48:0;;22146:59;;;;::::1;::::0;;;;-1:-1:-1;22227:26:0;;;:11:::1;:26:::0;;;;;;:38;22069:42;;22146:59;22227:38;;::::1;;;22226:39;22218:94;;;::::0;-1:-1:-1;;;22218:94:0;;25752:2:1;22218:94:0::1;::::0;::::1;25734:21:1::0;25791:2;25771:18;;;25764:30;25830:34;25810:18;;;25803:62;-1:-1:-1;;;25881:18:1;;;25874:40;25931:19;;22218:94:0::1;25724:232:1::0;22218:94:0::1;22331:26;::::0;;;:11:::1;:26;::::0;;;;:36;:62:::1;22377:15;22331:62:::0;::::1;:36:::0;::::1;:62;22323:111;;;::::0;-1:-1:-1;;;22323:111:0;;29639:2:1;22323:111:0::1;::::0;::::1;29621:21:1::0;29678:2;29658:18;;;29651:30;29717:34;29697:18;;;29690:62;-1:-1:-1;;;29768:18:1;;;29761:34;29812:19;;22323:111:0::1;29611:226:1::0;22323:111:0::1;22447:26;::::0;;;:11:::1;:26;::::0;;;;;;;:42:::1;::::0;::::1;:51:::0;;;22509:45;;-1:-1:-1;;22509:45:0::1;::::0;::::1;::::0;;22579:22;;;22509:38:::1;22579:22:::0;;;;;;:27:::1;::::0;22571:35;::::1;22567:109;;;22623:41;22644:11;22657:6;22623:20;:41::i;:::-;22693:74;::::0;;17999:25:1;;;18055:2;18040:18;;18033:34;;;18083:18;;;18076:34;;;22734:11:0;;22722:10:::1;::::0;22709:11;;22693:74:::1;::::0;17987:2:1;17972:18;22693:74:0::1;;;;;;;22034:743;;5911:468:::0;;21873:904;;;;;:::o;8261:184::-;8370:10:::1;8345:36;::::0;;;:24:::1;:36;::::0;;;;;;;;:42;;;8403:34;;15502:51:1;;;15569:18;;15562:34;;;8403::0::1;::::0;15475:18:1;8403:34:0::1;;;;;;;8261:184:::0;:::o;16404:296::-;5129:1;5096:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;5096:30:0;;;;5088:66;;;;-1:-1:-1;;;5088:66:0;;;;;;;:::i;:::-;5174:22;;;;:9;:22;;;;;:45;;;;;5173:46;5165:99;;;;-1:-1:-1;;;5165:99:0;;;;;;;:::i;:::-;5275:18;5296:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;5296:34:0;;;;5349:25;;;:66;;;5399:15;5378:37;;:11;:37;;;5349:66;5341:121;;;;-1:-1:-1;;;5341:121:0;;;;;;;:::i;:::-;5473:17;5493:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;5493:33:0;;;;5545:15;;;:56;;;5585:15;5564:37;;:10;:37;;;;5545:56;5537:98;;;;-1:-1:-1;;;5537:98:0;;;;;;;:::i;:::-;16549:22:::1;::::0;;;:9:::1;:22;::::0;;;;:29:::1;;::::0;:41:::1;::::0;16581:9:::1;::::0;16549:41:::1;:::i;:::-;16517:22;::::0;;;:9:::1;:22;::::0;;;;;;:29:::1;;:73:::0;;;16606:86;16681:10:::1;::::0;16527:11;;16606:86:::1;::::0;::::1;::::0;16639:9:::1;::::0;16517:73;34784:25:1;;;34840:2;34825:18;;34818:34;34772:2;34757:18;;34739:119;16606:86:0::1;;;;;;;;5077:579:::0;;16404:296;;:::o;11417:973::-;11652:7;11682:22;;;:9;:22;;;;;;11674:58;;;;-1:-1:-1;;;11674:58:0;;25404:2:1;11674:58:0;;;25386:21:1;25443:2;25423:18;;;25416:30;-1:-1:-1;;;25462:18:1;;;25455:49;25521:18;;11674:58:0;25376:169:1;11674:58:0;11745:20;11795:11;11808:10;11820:8;11778:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11768:62;;;;;;11745:85;;11841:19;11890:12;11904:10;11916:7;11933:1;11945:4;11952:10;11964:5;11873:97;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11863:108;;;;;;11841:130;;12195:12;12160:10;-1:-1:-1;;;;;12132:133:0;12147:11;12132:133;12172:11;12185:8;12209:10;12221:7;12230:10;12242:5;12249:15;12132:133;;;;;;;;;;;;:::i;:::-;;;;;;;;12276:75;12289:11;12302:12;12316:10;12328:7;12337:10;12349:1;12276:12;:75::i;:::-;12371:11;11417:973;-1:-1:-1;;;;;;;;11417:973:0:o;17199:400::-;5129:1;5096:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;5096:30:0;;;;5088:66;;;;-1:-1:-1;;;5088:66:0;;;;;;;:::i;:::-;5174:22;;;;:9;:22;;;;;:45;;;;;5173:46;5165:99;;;;-1:-1:-1;;;5165:99:0;;;;;;;:::i;:::-;5275:18;5296:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;5296:34:0;;;;5349:25;;;:66;;;5399:15;5378:37;;:11;:37;;;5349:66;5341:121;;;;-1:-1:-1;;;5341:121:0;;;;;;;:::i;:::-;5473:17;5493:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;5493:33:0;;;;5545:15;;;:56;;;5585:15;5564:37;;:10;:37;;;;5545:56;5537:98;;;;-1:-1:-1;;;5537:98:0;;;;;;;:::i;:::-;17352:11:::1;6625:1;6613:9;:13;6605:47;;;;-1:-1:-1::0;;;6605:47:0::1;;;;;;;:::i;:::-;6664:20;6687:22:::0;;;:9:::1;:22;::::0;;;;:27:::1;;::::0;6729:17;6725:256:::1;;6785:22;::::0;;;:9:::1;:22;::::0;;;;:31:::1;;::::0;6771:9:::1;:46;;6763:87;;;;-1:-1:-1::0;;;6763:87:0::1;;;;;;;:::i;:::-;6725:256;;;6905:16;:12:::0;6920:1:::1;6905:16;:::i;:::-;6891:9;:31;;6883:86;;;;-1:-1:-1::0;;;6883:86:0::1;;;;;;;:::i;:::-;17409:11:::0;17422:12;7110:16;;7106:134:::2;;7151:22;::::0;;;:9:::2;:22;::::0;;;;:27:::2;;::::0;:43;-1:-1:-1;7151:43:0::2;7143:85;;;;-1:-1:-1::0;;;7143:85:0::2;;;;;;;:::i;:::-;17469:70:::3;17489:11;17502:6;17510:10;17522:9;17533:5;17469:19;:70::i;:::-;17550:41;17571:11;17584:6;17550:20;:41::i;:::-;6991:1:::2;;6594:406:::1;5647:1;5077:579:::0;;17199:400;;;;:::o;28798:291::-;28867:4;28905:22;;;:9;:22;;;;;:34;;;;28960:45;;;;;-1:-1:-1;;;28905:34:0;;;;;;28960:45;;28959:46;:76;;;;-1:-1:-1;29010:24:0;;;;;28959:76;:120;;;;;29062:15;29040:38;;:11;:38;;;;28959:120;28950:131;28798:291;-1:-1:-1;;;28798:291:0:o;8832:361::-;8954:14:::1;::::0;8921:7;8979:13;;;:9:::1;:13;::::0;;;;;;;8995:12:::1;8979:28:::0;;9050:25;8921:7;;8954:14;9050:25:::1;::::0;9067:7;;9050:25:::1;;:::i;:::-;;::::0;;-1:-1:-1;;9050:25:0;;::::1;::::0;;;;;;9040:36;;9050:25:::1;9040:36:::0;;::::1;::::0;9018:19:::1;::::0;;;:15:::1;:19:::0;;;;;;:58;9111:10:::1;::::0;9034:2;;9092:39:::1;::::0;::::1;::::0;9123:7;;9092:39:::1;:::i;:::-;;;;;;;;9159:6;:2:::0;9164:1:::1;9159:6;:::i;:::-;9142:14;:23:::0;9183:2;-1:-1:-1;4864:1:0::1;8832:361:::0;;;:::o;10078:446::-;10359:7;10379:19;10401:23;10416:7;10401:14;:23::i;:::-;10379:45;;10442:74;10454:11;10467:8;10477:10;10489:7;10498:10;10510:5;10442:11;:74::i;29309:180::-;29420:7;29379:11;6451:24;6463:11;6451;:24::i;:::-;6443:63;;;;-1:-1:-1;;;6443:63:0;;;;;;;:::i;:::-;-1:-1:-1;;29447:22:0::1;::::0;;;:9:::1;:22;::::0;;;;;;;:34:::1;::::0;;29309:180::o;30414:714::-;30492:7;30512:14;30529:22;30539:11;30529:9;:22::i;:::-;30512:39;-1:-1:-1;;;30566:27:0;;30562:535;;;30646:22;30671:31;;;:18;:31;;;;;;30725:30;30717:98;;;;-1:-1:-1;;;30717:98:0;;33481:2:1;30717:98:0;;;33463:21:1;33520:2;33500:18;;;33493:30;33559:34;33539:18;;;33532:62;33630:25;33610:18;;;33603:53;33673:19;;30717:98:0;33453:245:1;30717:98:0;30938:25;30948:14;30938:9;:25::i;:::-;30929:34;-1:-1:-1;;;30986:27:0;;;30978:107;;;;-1:-1:-1;;;30978:107:0;;27697:2:1;30978:107:0;;;27679:21:1;27736:2;27716:18;;;27709:30;27775:34;27755:18;;;27748:62;27846:34;27826:18;;;27819:62;-1:-1:-1;;;27897:19:1;;;27890:34;27941:19;;30978:107:0;27669:297:1;30978:107:0;30595:502;30562:535;31114:6;30414:714;-1:-1:-1;;30414:714:0:o;27508:1105::-;27732:18;27781:22;;;:9;:22;;;;;:35;;;;27867:27;;;;;27753:157;;27781:35;27818:17;;27837:28;;27896:13;27753:27;:157::i;:::-;27732:178;;27923:13;28141;:71;;;;-1:-1:-1;28159:41:0;;;;:11;:41;;;;;:53;;;;;;28158:54;28141:71;28137:406;;;28237:41;;;;:11;:41;;;;;:51;:77;28298:15;28237:77;;:51;;:77;28229:145;;;;-1:-1:-1;;;28229:145:0;;23808:2:1;28229:145:0;;;23790:21:1;23847:2;23827:18;;;23820:30;23886:34;23866:18;;;23859:62;23957:25;23937:18;;;23930:53;24000:19;;28229:145:0;23780:245:1;28229:145:0;-1:-1:-1;28397:14:0;28137:406;;;28453:22;;;;:9;:22;;;;;;;;:34;;:44;;28452:79;;28517:14;28452:79;;;28501:13;28452:79;28444:87;;28137:406;28553:52;28578:11;28591:6;28599:5;28553:24;:52::i;20260:626::-;5129:1;5096:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;5096:30:0;;;;5088:66;;;;-1:-1:-1;;;5088:66:0;;;;;;;:::i;:::-;5174:22;;;;:9;:22;;;;;:45;;;;;5173:46;5165:99;;;;-1:-1:-1;;;5165:99:0;;;;;;;:::i;:::-;5275:18;5296:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;5296:34:0;;;;5349:25;;;:66;;;5399:15;5378:37;;:11;:37;;;5349:66;5341:121;;;;-1:-1:-1;;;5341:121:0;;;;;;;:::i;:::-;5473:17;5493:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;5493:33:0;;;;5545:15;;;:56;;;5585:15;5564:37;;:10;:37;;;;5545:56;5537:98;;;;-1:-1:-1;;;5537:98:0;;;;;;;:::i;:::-;20447:11:::1;6625:1;6613:9;:13;6605:47;;;;-1:-1:-1::0;;;6605:47:0::1;;;;;;;:::i;:::-;6664:20;6687:22:::0;;;:9:::1;:22;::::0;;;;:27:::1;;::::0;6729:17;6725:256:::1;;6785:22;::::0;;;:9:::1;:22;::::0;;;;:31:::1;;::::0;6771:9:::1;:46;;6763:87;;;;-1:-1:-1::0;;;6763:87:0::1;;;;;;;:::i;:::-;6725:256;;;6905:16;:12:::0;6920:1:::1;6905:16;:::i;:::-;6891:9;:31;;6883:86;;;;-1:-1:-1::0;;;6883:86:0::1;;;;;;;:::i;:::-;20504:11:::0;20517:12;7110:16;;7106:134:::2;;7151:22;::::0;;;:9:::2;:22;::::0;;;;:27:::2;;::::0;:43;-1:-1:-1;7151:43:0::2;7143:85;;;;-1:-1:-1::0;;;7143:85:0::2;;;;;;;:::i;:::-;20600:53:::3;::::0;;::::3;::::0;::::3;13486:19:1::0;;;13521:12;;;13514:28;;;20643:9:0::3;13558:12:1::0;;;13551:28;20566:21:0::3;::::0;13595:12:1;;20600:53:0::3;::::0;;-1:-1:-1;;20600:53:0;;::::3;::::0;;;;;;20590:64;;20600:53:::3;20590:64:::0;;::::3;::::0;;-1:-1:-1;20665:16:0::3;-1:-1:-1::0;;;;;20685:25:0;::::3;::::0;20684:52:::3;;20727:9;20684:52;;;20714:10;20684:52;20665:71;;20747:44;20764:11;20777:13;20747:16;:44::i;:::-;20802:74;20822:11;20835:13;20850:8;20860:9;20871:4;20802:19;:74::i;:::-;20553:333;;6991:1:::2;;6594:406:::1;5647:1;5077:579:::0;;20260:626;;;;;:::o;25296:371::-;4738:22;;;;:9;:22;;;;;:33;;;:22;;-1:-1:-1;;;;;4738:33:0;4724:10;:47;4716:89;;;;-1:-1:-1;;;4716:89:0;;;;;;;:::i;:::-;5737:22:::1;::::0;;;:9:::1;:22;::::0;;;;:45:::1;;::::0;25415:11;;5737:45:::1;;5729:94;;;;-1:-1:-1::0;;;5729:94:0::1;;;;;;;:::i;:::-;25501:5:::2;25453:22:::0;;;:9:::2;:22;::::0;;;;:45:::2;::::0;::::2;:53:::0;;-1:-1:-1;;25453:53:0::2;::::0;;-1:-1:-1;25580:30:0::2;::::0;25554:56:::2;::::0;-1:-1:-1;;;25580:30:0;::::2;;;25561:15;25554:56;:::i;:::-;25517:22;::::0;;;:9:::2;:22;::::0;;;;;:34:::2;;:93:::0;;::::2;::::0;;;::::2;-1:-1:-1::0;;;25517:93:0::2;-1:-1:-1::0;;;;;25517:93:0;;::::2;::::0;;;::::2;::::0;;;25626:33;;25527:11;;25626:33:::2;::::0;::::2;4816:1:::1;25296:371:::0;;:::o;24532:530::-;4738:22;;;;:9;:22;;;;;:33;;;:22;;-1:-1:-1;;;;;4738:33:0;4724:10;:47;4716:89;;;;-1:-1:-1;;;4716:89:0;;;;;;;:::i;:::-;5129:1:::1;5096:22:::0;;;:9:::1;:22;::::0;;;;:30:::1;;::::0;:22;;-1:-1:-1;;;5096:30:0;::::1;;;5088:66;;;;-1:-1:-1::0;;;5088:66:0::1;;;;;;;:::i;:::-;5174:22;::::0;;;:9:::1;:22;::::0;;;;:45:::1;;::::0;::::1;;5173:46;5165:99;;;;-1:-1:-1::0;;;5165:99:0::1;;;;;;;:::i;:::-;5275:18;5296:22:::0;;;:9:::1;:22;::::0;;;;:34:::1;;::::0;-1:-1:-1;;;5296:34:0;::::1;;;5349:25:::0;;;:66:::1;;;5399:15;5378:37;;:11;:37;;;5349:66;5341:121;;;;-1:-1:-1::0;;;5341:121:0::1;;;;;;;:::i;:::-;5473:17;5493:22:::0;;;:9:::1;:22;::::0;;;;:33:::1;;::::0;-1:-1:-1;;;5493:33:0;::::1;;;5545:15:::0;;;:56:::1;;;5585:15;5564:37;;:10;:37;;;;5545:56;5537:98;;;;-1:-1:-1::0;;;5537:98:0::1;;;;;;;:::i;:::-;24744:11:::0;24757:12;7110:16;;7106:134:::2;;7151:22;::::0;;;:9:::2;:22;::::0;;;;:27:::2;;::::0;:43;-1:-1:-1;7151:43:0::2;7143:85;;;;-1:-1:-1::0;;;7143:85:0::2;;;;;;;:::i;:::-;810:1:::3;24804:22:::0;;;:9:::3;:22;::::0;;;;:34:::3;;::::0;-1:-1:-1;;;24804:34:0;::::3;:47;:34;24796:126;;;::::0;-1:-1:-1;;;24796:126:0;;26864:2:1;24796:126:0::3;::::0;::::3;26846:21:1::0;26903:2;26883:18;;;26876:30;26942:34;26922:18;;;26915:62;27013:34;26993:18;;;26986:62;-1:-1:-1;;;27064:19:1;;;27057:33;27107:19;;24796:126:0::3;26836:296:1::0;24796:126:0::3;24933:22;::::0;;;:9:::3;:22;::::0;;;;;:45:::3;;:52:::0;;-1:-1:-1;;24933:52:0::3;24981:4;24933:52;::::0;;25001:53;-1:-1:-1;;;;;25001:53:0;::::3;::::0;24943:11;;25001:53:::3;::::0;24933:22;25001:53:::3;5647:1:::2;;5077:579:::1;;4816:1;24532:530:::0;;;;:::o;26273:519::-;4738:22;;;;:9;:22;;;;;:33;;;:22;;-1:-1:-1;;;;;4738:33:0;4724:10;:47;4716:89;;;;-1:-1:-1;;;4716:89:0;;;;;;;:::i;:::-;5737:22:::1;::::0;;;:9:::1;:22;::::0;;;;:45:::1;;::::0;26433:11;;5737:45:::1;;5729:94;;;;-1:-1:-1::0;;;5729:94:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26479:24:0;::::2;26471:62;;;::::0;-1:-1:-1;;;26471:62:0;;28935:2:1;26471:62:0::2;::::0;::::2;28917:21:1::0;28974:2;28954:18;;;28947:30;29013:27;28993:18;;;28986:55;29058:18;;26471:62:0::2;28907:175:1::0;26471:62:0::2;26549:32;::::0;26574:6;;26561:11;;26549:32:::2;::::0;;;::::2;26642:5;26594:22:::0;;;:9:::2;:22;::::0;;;;:45:::2;;:53:::0;;-1:-1:-1;;26594:53:0::2;::::0;;26658:60:::2;::::0;26604:11;;26691:6;;26699:8;;26642:5;26658:19:::2;:60::i;:::-;-1:-1:-1::0;;;23922:22:0;;;;:9;:22;;;;;;;;:34;;;:43;23976:34;;:60;;-1:-1:-1;;;;;23976:60:0;-1:-1:-1;;;24020:15:0;23976:60;;;;;;26273:519::o;41513:561::-;41696:4;41765:12;41779:6;41787:4;41793;41799;41748:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41738:67;;;;;;41717:17;:88;41713:133;;;-1:-1:-1;41830:4:0;41823:11;;41713:133;41908:12;41922:6;41930:4;41936;41942:5;41891:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41881:68;;;;;;41860:17;:89;41856:135;;;-1:-1:-1;41974:5:0;41967:12;;41856:135;42002:64;;-1:-1:-1;;;42002:64:0;;18980:2:1;42002:64:0;;;18962:21:1;19019:2;18999:18;;;18992:30;19058:34;19038:18;;;19031:62;-1:-1:-1;;;19109:18:1;;;19102:52;19171:19;;42002:64:0;18952:244:1;41513:561:0;;;;;;;;:::o;42082:2584::-;42313:7;42322;42534:13;42530:492;;;42564:21;42712:26;;;:11;:26;;;;;:38;:26;;:38;;;;;42707:304;;42778:26;;;;:11;:26;;;;;42771:33;;-1:-1:-1;;42771:33:0;;;;;;-1:-1:-1;42831:12:0;;-1:-1:-1;42845:5:0;42823:28;;42707:304;42901:26;;;;:11;:26;;;;;:42;;;;;42962:33;;-1:-1:-1;;42962:33:0;;;;;;;;42901:42;-1:-1:-1;42530:492:0;43048:11;43038:6;:21;43034:1582;;;-1:-1:-1;;;;;43082:21:0;;43078:1525;;43264:4;43256:12;;-1:-1:-1;;43308:17:0;;43293:11;:32;;:69;;;;-1:-1:-1;43361:1:0;43329:22;;;:9;:22;;;;;:29;;;:33;;43293:69;43289:234;;;43417:22;;;;:9;:22;;;;;:29;;;43387:60;;43397:11;;43410:5;;43387:9;:60::i;:::-;43502:1;43470:22;;;:9;:22;;;;;:29;;:33;43289:234;43078:1525;;;43558:5;-1:-1:-1;;;;;43550:13:0;:4;-1:-1:-1;;;;;43550:13:0;;43546:1057;;44194:27;44241:4;44225:12;:20;;44224:44;;44256:12;44224:44;;;44249:4;44224:44;44194:74;-1:-1:-1;44352:65:0;44362:11;44375:5;44382:34;44194:74;44382:12;:34;:::i;44352:65::-;44528:4;44520:12;;44566:19;44551:34;;43565:1038;43546:1057;-1:-1:-1;44636:12:0;;-1:-1:-1;44650:5:0;42082:2584;;;;;;;;;;;;:::o;41307:198::-;-1:-1:-1;;;;;41422:16:0;;:9;:16;;;;;;;;;;;:24;;41441:5;;41422:24;:::i;:::-;-1:-1:-1;;;;;41403:16:0;;:9;:16;;;;;;;;;;;;:43;;;;41462:35;16295:25:1;;;41403:16:0;;41471:11;;41462:35;;16268:18:1;41462:35:0;;;;;;;41307:198;;;:::o;22785:702::-;22952:24;23006:22;;;:9;:22;;;;;;;;:35;;;22989:109;;;;23043:23;;23068:4;;23074:8;;23084:13;;22989:109;;:::i;:::-;;;;;;;;;;;;;22979:120;;;;;;22952:147;;23217:1;23210:4;:8;23206:75;;;23235:22;;;;:9;:22;;;;;:27;;:34;;;23206:75;23291:22;;;;:9;:22;;;;;;;;;:35;;:54;;;23363:116;;17572:25:1;;;17613:18;;;17606:34;;;17656:18;;;17649:34;;;23448:15:0;17714:2:1;17699:18;;17692:34;17770:14;;17763:22;17757:3;17742:19;;17735:51;-1:-1:-1;;;;;23363:116:0;;;23291:22;;23363:116;;17559:3:1;17544:19;23363:116:0;;;;;;;22941:546;22785:702;;;;;:::o;23495:247::-;23587:22;;;;:9;:22;;;;;;;;:34;;;:43;;;23704:30;;;23678:56;;-1:-1:-1;;;23704:30:0;;;;23685:15;23678:56;:::i;:::-;23641:22;;;;:9;:22;;;;;;:34;;:93;;;;;;;-1:-1:-1;;;23641:93:0;-1:-1:-1;;;;;23641:93:0;;;;;;;;;;-1:-1:-1;23495:247:0:o;14384:1766::-;4946:22;;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;4946:30:0;;;;:35;4938:71;;;;-1:-1:-1;;;4938:71:0;;28583:2:1;4938:71:0;;;28565:21:1;28622:2;28602:18;;;28595:30;28661:25;28641:18;;;28634:53;28704:18;;4938:71:0;28555:173:1;4938:71:0;14689:1:::1;14679:7;:11;;;14671:48;;;::::0;-1:-1:-1;;;14671:48:0;;20527:2:1;14671:48:0::1;::::0;::::1;20509:21:1::0;20566:2;20546:18;;;20539:30;20605:26;20585:18;;;20578:54;20649:18;;14671:48:0::1;20499:174:1::0;14671:48:0::1;14749:8;14739:7;:18;;;14731:65;;;::::0;-1:-1:-1;;;14731:65:0;;31497:2:1;14731:65:0::1;::::0;::::1;31479:21:1::0;31536:2;31516:18;;;31509:30;31575:34;31555:18;;;31548:62;-1:-1:-1;;;31626:18:1;;;31619:32;31668:19;;14731:65:0::1;31469:224:1::0;14731:65:0::1;14827:9;-1:-1:-1::0;;;;;15235:26:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;15265:10:0::1;-1:-1:-1::0;;;;;15265:24:0;::::1;;;15235:54;15231:353;;;-1:-1:-1::0;;;;;15329:36:0;::::1;15306:20;15329:36:::0;;;:24:::1;:36;::::0;;;;;15388:22;;::::1;;15380:71;;;::::0;-1:-1:-1;;;15380:71:0;;33076:2:1;15380:71:0::1;::::0;::::1;33058:21:1::0;33115:2;33095:18;;;33088:30;33154:34;33134:18;;;33127:62;-1:-1:-1;;;33205:18:1;;;33198:34;33249:19;;15380:71:0::1;33048:226:1::0;15380:71:0::1;15476:21;15485:12:::0;15476:6;:21:::1;:::i;:::-;-1:-1:-1::0;;;;;15536:21:0;::::1;:9;:21:::0;;;::::1;::::0;;;;;;;15467:30;;-1:-1:-1;15536:36:0::1;::::0;15560:12;;15536:36:::1;:::i;:::-;-1:-1:-1::0;;;;;15512:21:0;::::1;:9;:21:::0;;;::::1;::::0;;;;;;:60;-1:-1:-1;15231:353:0::1;15596:22;::::0;;;:9:::1;:22;::::0;;;;:50;;;15657:33:::1;;:46:::0;;15714::::1;15771:40:::0;;::::1;-1:-1:-1::0;;;15771:40:0::1;-1:-1:-1::0;;;;15714:46:0;;::::1;-1:-1:-1::0;;;15714:46:0::1;-1:-1:-1::0;;;;;;15714:46:0;;;-1:-1:-1;;;;;15657:46:0;::::1;15714::::0;;;;::::1;15771:40;;::::0;;15828:10;;15824:161:::1;;15855:22;::::0;;;:9:::1;:22;::::0;;;;;;;;:29:::1;;:38:::0;;;15913:60;;34784:25:1;;;34825:18;;;34818:34;;;15962:10:0::1;::::0;15855:22;;15913:60:::1;::::0;34757:18:1;15913:60:0::1;;;;;;;15824:161;16001:12:::0;;15997:144:::1;;16030:22;::::0;;;:9:::1;:22;::::0;;;;;;:31:::1;;:42:::0;;;16092:37;16040:11;;16092:37:::1;::::0;::::1;::::0;16064:8;16295:25:1;;16283:2;16268:18;;16250:76;16092:37:0::1;;;;;;;;14575:1575;14384:1766:::0;;;;;;;:::o;18902:410::-;950:1;19011:26;;;:11;:26;;;;;:36;;;:63;19003:109;;;;-1:-1:-1;;;19003:109:0;;30044:2:1;19003:109:0;;;30026:21:1;30083:2;30063:18;;;30056:30;30122:34;30102:18;;;30095:62;-1:-1:-1;;;30173:18:1;;;30166:31;30214:19;;19003:109:0;30016:223:1;19003:109:0;19125:25;19153:22;;;:9;:22;;;;;:30;;;:57;;1081:1;;-1:-1:-1;;;19153:30:0;;;;:57;:::i;:::-;19125:85;-1:-1:-1;19260:44:0;19125:85;19267:15;19260:44;:::i;:::-;19221:26;;;;:11;:26;;;;;;:83;;-1:-1:-1;;19221:83:0;;;;;;;;;;;;-1:-1:-1;;18902:410:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:679;246:5;299:3;292:4;284:6;280:17;276:27;266:2;;317:1;314;307:12;266:2;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:2;;;641:1;638;631:12;584:2;663:1;673:169;687:2;684:1;681:9;673:169;;;744:23;763:3;744:23;:::i;:::-;732:36;;788:12;;;;820;;;;705:1;698:9;673:169;;;-1:-1:-1;860:5:1;;256:615;-1:-1:-1;;;;;;;256:615:1:o;876:673::-;930:5;983:3;976:4;968:6;964:17;960:27;950:2;;1001:1;998;991:12;950:2;1037:6;1024:20;1063:4;1087:60;1103:43;1143:2;1103:43;:::i;1087:60::-;1169:3;1193:2;1188:3;1181:15;1221:2;1216:3;1212:12;1205:19;;1256:2;1248:6;1244:15;1308:3;1303:2;1297;1294:1;1290:10;1282:6;1278:23;1274:32;1271:41;1268:2;;;1325:1;1322;1315:12;1268:2;1347:1;1357:163;1371:2;1368:1;1365:9;1357:163;;;1428:17;;1416:30;;1466:12;;;;1498;;;;1389:1;1382:9;1357:163;;2232:531;2275:5;2328:3;2321:4;2313:6;2309:17;2305:27;2295:2;;2346:1;2343;2336:12;2295:2;2382:6;2369:20;-1:-1:-1;;;;;2404:2:1;2401:26;2398:2;;;2430:18;;:::i;:::-;2474:55;2517:2;2498:13;;-1:-1:-1;;2494:27:1;2523:4;2490:38;2474:55;:::i;:::-;2554:2;2545:7;2538:19;2600:3;2593:4;2588:2;2580:6;2576:15;2572:26;2569:35;2566:2;;;2617:1;2614;2607:12;2566:2;2682;2675:4;2667:6;2663:17;2656:4;2647:7;2643:18;2630:55;2730:1;2705:16;;;2723:4;2701:27;2694:38;;;;2709:7;2285:478;-1:-1:-1;;;2285:478:1:o;2768:163::-;2835:20;;2895:10;2884:22;;2874:33;;2864:2;;2921:1;2918;2911:12;2936:186;2995:6;3048:2;3036:9;3027:7;3023:23;3019:32;3016:2;;;3064:1;3061;3054:12;3016:2;3087:29;3106:9;3087:29;:::i;3127:1502::-;3381:6;3389;3397;3405;3413;3421;3474:3;3462:9;3453:7;3449:23;3445:33;3442:2;;;3491:1;3488;3481:12;3442:2;3531:9;3518:23;-1:-1:-1;;;;;3601:2:1;3593:6;3590:14;3587:2;;;3617:1;3614;3607:12;3587:2;3640:61;3693:7;3684:6;3673:9;3669:22;3640:61;:::i;:::-;3630:71;;3754:2;3743:9;3739:18;3726:32;3710:48;;3783:2;3773:8;3770:16;3767:2;;;3799:1;3796;3789:12;3767:2;3822:63;3877:7;3866:8;3855:9;3851:24;3822:63;:::i;:::-;3812:73;;3938:2;3927:9;3923:18;3910:32;3894:48;;3967:2;3957:8;3954:16;3951:2;;;3983:1;3980;3973:12;3951:2;4006:63;4061:7;4050:8;4039:9;4035:24;4006:63;:::i;:::-;3996:73;;4122:2;4111:9;4107:18;4094:32;4078:48;;4151:2;4141:8;4138:16;4135:2;;;4167:1;4164;4157:12;4135:2;4190:63;4245:7;4234:8;4223:9;4219:24;4190:63;:::i;:::-;4180:73;;4306:3;4295:9;4291:19;4278:33;4262:49;;4336:2;4326:8;4323:16;4320:2;;;4352:1;4349;4342:12;4320:2;4375:63;4430:7;4419:8;4408:9;4404:24;4375:63;:::i;:::-;4365:73;;4491:3;4480:9;4476:19;4463:33;4447:49;;4521:2;4511:8;4508:16;4505:2;;;4537:1;4534;4527:12;4505:2;;4560:63;4615:7;4604:8;4593:9;4589:24;4560:63;:::i;:::-;4550:73;;;3432:1197;;;;;;;;:::o;4634:180::-;4693:6;4746:2;4734:9;4725:7;4721:23;4717:32;4714:2;;;4762:1;4759;4752:12;4714:2;-1:-1:-1;4785:23:1;;4704:110;-1:-1:-1;4704:110:1:o;4819:322::-;4896:6;4904;4912;4965:2;4953:9;4944:7;4940:23;4936:32;4933:2;;;4981:1;4978;4971:12;4933:2;5017:9;5004:23;4994:33;;5046:38;5080:2;5069:9;5065:18;5046:38;:::i;:::-;5036:48;;5131:2;5120:9;5116:18;5103:32;5093:42;;4923:218;;;;;:::o;5146:1117::-;5341:6;5349;5357;5365;5373;5426:3;5414:9;5405:7;5401:23;5397:33;5394:2;;;5443:1;5440;5433:12;5394:2;5479:9;5466:23;5456:33;;5540:2;5529:9;5525:18;5512:32;-1:-1:-1;;;;;5604:2:1;5596:6;5593:14;5590:2;;;5620:1;5617;5610:12;5590:2;5643:61;5696:7;5687:6;5676:9;5672:22;5643:61;:::i;:::-;5633:71;;5757:2;5746:9;5742:18;5729:32;5713:48;;5786:2;5776:8;5773:16;5770:2;;;5802:1;5799;5792:12;5770:2;5825:63;5880:7;5869:8;5858:9;5854:24;5825:63;:::i;:::-;5815:73;;5941:2;5930:9;5926:18;5913:32;5897:48;;5970:2;5960:8;5957:16;5954:2;;;5986:1;5983;5976:12;5954:2;6009:63;6064:7;6053:8;6042:9;6038:24;6009:63;:::i;:::-;5999:73;;6125:3;6114:9;6110:19;6097:33;6081:49;;6155:2;6145:8;6142:16;6139:2;;;6171:1;6168;6161:12;6139:2;;6194:63;6249:7;6238:8;6227:9;6223:24;6194:63;:::i;:::-;6184:73;;;5384:879;;;;;;;;:::o;6268:322::-;6345:6;6353;6361;6414:2;6402:9;6393:7;6389:23;6385:32;6382:2;;;6430:1;6427;6420:12;6382:2;6466:9;6453:23;6443:33;;6523:2;6512:9;6508:18;6495:32;6485:42;;6546:38;6580:2;6569:9;6565:18;6546:38;:::i;:::-;6536:48;;6372:218;;;;;:::o;6595:535::-;6699:6;6707;6715;6723;6731;6739;6792:3;6780:9;6771:7;6767:23;6763:33;6760:2;;;6809:1;6806;6799:12;6760:2;6845:9;6832:23;6822:33;;6902:2;6891:9;6887:18;6874:32;6864:42;;6925:38;6959:2;6948:9;6944:18;6925:38;:::i;:::-;6915:48;;7010:2;6999:9;6995:18;6982:32;6972:42;;7061:3;7050:9;7046:19;7033:33;7023:43;;7085:39;7119:3;7108:9;7104:19;7085:39;:::i;:::-;7075:49;;6750:380;;;;;;;;:::o;7135:464::-;7229:6;7237;7245;7253;7261;7314:3;7302:9;7293:7;7289:23;7285:33;7282:2;;;7331:1;7328;7321:12;7282:2;7367:9;7354:23;7344:33;;7424:2;7413:9;7409:18;7396:32;7386:42;;7447:38;7481:2;7470:9;7466:18;7447:38;:::i;:::-;7437:48;;7504:37;7537:2;7526:9;7522:18;7504:37;:::i;:::-;7272:327;;;;-1:-1:-1;7272:327:1;;7588:3;7573:19;7560:33;;7272:327;-1:-1:-1;;7272:327:1:o;7604:316::-;7681:6;7689;7697;7750:2;7738:9;7729:7;7725:23;7721:32;7718:2;;;7766:1;7763;7756:12;7718:2;-1:-1:-1;;7789:23:1;;;7859:2;7844:18;;7831:32;;-1:-1:-1;7910:2:1;7895:18;;;7882:32;;7708:212;-1:-1:-1;7708:212:1:o;7925:391::-;8011:6;8019;8027;8035;8088:3;8076:9;8067:7;8063:23;8059:33;8056:2;;;8105:1;8102;8095:12;8056:2;8141:9;8128:23;8118:33;;8198:2;8187:9;8183:18;8170:32;8160:42;;8249:2;8238:9;8234:18;8221:32;8211:42;;8272:38;8306:2;8295:9;8291:18;8272:38;:::i;:::-;8262:48;;8046:270;;;;;;;:::o;8321:385::-;8407:6;8415;8423;8431;8484:3;8472:9;8463:7;8459:23;8455:33;8452:2;;;8501:1;8498;8491:12;8452:2;-1:-1:-1;;8524:23:1;;;8594:2;8579:18;;8566:32;;-1:-1:-1;8645:2:1;8630:18;;8617:32;;8696:2;8681:18;8668:32;;-1:-1:-1;8442:264:1;-1:-1:-1;8442:264:1:o;8711:322::-;8780:6;8833:2;8821:9;8812:7;8808:23;8804:32;8801:2;;;8849:1;8846;8839:12;8801:2;8889:9;8876:23;-1:-1:-1;;;;;8914:6:1;8911:30;8908:2;;;8954:1;8951;8944:12;8908:2;8977:50;9019:7;9010:6;8999:9;8995:22;8977:50;:::i;:::-;8967:60;8791:242;-1:-1:-1;;;;8791:242:1:o;9038:832::-;9160:6;9168;9176;9184;9192;9200;9253:3;9241:9;9232:7;9228:23;9224:33;9221:2;;;9270:1;9267;9260:12;9221:2;9310:9;9297:23;-1:-1:-1;;;;;9380:2:1;9372:6;9369:14;9366:2;;;9396:1;9393;9386:12;9366:2;9419:50;9461:7;9452:6;9441:9;9437:22;9419:50;:::i;:::-;9409:60;;9522:2;9511:9;9507:18;9494:32;9478:48;;9551:2;9541:8;9538:16;9535:2;;;9567:1;9564;9557:12;9535:2;;9590:52;9634:7;9623:8;9612:9;9608:24;9590:52;:::i;:::-;9580:62;;;9661:38;9695:2;9684:9;9680:18;9661:38;:::i;:::-;9651:48;;9718:37;9751:2;9740:9;9736:18;9718:37;:::i;:::-;9708:47;;9774:38;9807:3;9796:9;9792:19;9774:38;:::i;:::-;9764:48;;9859:3;9848:9;9844:19;9831:33;9821:43;;9211:659;;;;;;;;:::o;10060:679::-;10172:6;10180;10188;10196;10204;10212;10265:3;10253:9;10244:7;10240:23;10236:33;10233:2;;;10282:1;10279;10272:12;10233:2;10318:9;10305:23;10295:33;;10379:2;10368:9;10364:18;10351:32;-1:-1:-1;;;;;10398:6:1;10395:30;10392:2;;;10438:1;10435;10428:12;10392:2;10461:50;10503:7;10494:6;10483:9;10479:22;10461:50;:::i;10744:748::-;10865:6;10873;10881;10889;10897;10905;10913;10966:3;10954:9;10945:7;10941:23;10937:33;10934:2;;;10983:1;10980;10973:12;10934:2;11019:9;11006:23;10996:33;;11080:2;11069:9;11065:18;11052:32;-1:-1:-1;;;;;11099:6:1;11096:30;11093:2;;;11139:1;11136;11129:12;11093:2;11162:50;11204:7;11195:6;11184:9;11180:22;11162:50;:::i;:::-;11152:60;;;11231:38;11265:2;11254:9;11250:18;11231:38;:::i;:::-;11221:48;;11288:37;11321:2;11310:9;11306:18;11288:37;:::i;:::-;11278:47;;11344:38;11377:3;11366:9;11362:19;11344:38;:::i;:::-;11334:48;;11429:3;11418:9;11414:19;11401:33;11391:43;;11481:3;11470:9;11466:19;11453:33;11443:43;;10924:568;;;;;;;;;;:::o;11497:817::-;11627:6;11635;11643;11651;11659;11667;11675;11683;11736:3;11724:9;11715:7;11711:23;11707:33;11704:2;;;11753:1;11750;11743:12;11704:2;11789:9;11776:23;11766:33;;11850:2;11839:9;11835:18;11822:32;-1:-1:-1;;;;;11869:6:1;11866:30;11863:2;;;11909:1;11906;11899:12;11863:2;11932:50;11974:7;11965:6;11954:9;11950:22;11932:50;:::i;:::-;11922:60;;;12001:38;12035:2;12024:9;12020:18;12001:38;:::i;:::-;11991:48;;12058:37;12091:2;12080:9;12076:18;12058:37;:::i;:::-;12048:47;;12114:38;12147:3;12136:9;12132:19;12114:38;:::i;:::-;11694:620;;;;-1:-1:-1;11694:620:1;;;;12104:48;12199:3;12184:19;;12171:33;;-1:-1:-1;12251:3:1;12236:19;;12223:33;;12303:3;12288:19;12275:33;;-1:-1:-1;11694:620:1;-1:-1:-1;;11694:620:1:o;12319:258::-;12361:3;12399:5;12393:12;12426:6;12421:3;12414:19;12442:63;12498:6;12491:4;12486:3;12482:14;12475:4;12468:5;12464:16;12442:63;:::i;:::-;12559:2;12538:15;-1:-1:-1;;12534:29:1;12525:39;;;;12566:4;12521:50;;12369:208;-1:-1:-1;;12369:208:1:o;12582:714::-;12877:19;;;12984:2;12980:15;;;-1:-1:-1;;12976:24:1;;;12971:2;12962:12;;12955:46;13057:3;13035:16;;;;-1:-1:-1;;;;;;13031:43:1;13026:2;13017:12;;13010:65;13100:2;13091:12;;13084:28;;;;13146:15;;;13142:24;;13137:2;13128:12;;13121:46;13202:15;;;13198:24;13192:3;13183:13;;13176:47;13248:3;13239:13;;13232:29;13286:3;13277:13;;12867:429::o;13618:511::-;13853:19;;;13897:2;13888:12;;13881:28;;;;13934:2;13925:12;;13918:28;;;;13984:2;13980:15;;;-1:-1:-1;;13976:53:1;13962:12;;;13955:75;14077:14;14070:22;14065:3;14061:32;14055:3;14046:13;;14039:55;14119:3;14110:13;;13843:286::o;14386:276::-;14517:3;14555:6;14549:13;14571:53;14617:6;14612:3;14605:4;14597:6;14593:17;14571:53;:::i;:::-;14640:16;;;;;14525:137;-1:-1:-1;;14525:137:1:o;14667:448::-;14882:6;14877:3;14870:19;14950:10;14945:3;14941:20;14932:6;14927:3;14923:16;14919:43;14914:2;14909:3;14905:12;14898:65;14852:3;14992:6;14986:13;15008:60;15061:6;15056:2;15051:3;15047:12;15042:2;15034:6;15030:15;15008:60;:::i;:::-;15088:16;;;;15106:2;15084:25;;14860:255;-1:-1:-1;;;;14860:255:1:o;18121:220::-;18270:2;18259:9;18252:21;18233:4;18290:45;18331:2;18320:9;18316:18;18308:6;18290:45;:::i;21374:352::-;21576:2;21558:21;;;21615:2;21595:18;;;21588:30;21654;21649:2;21634:18;;21627:58;21717:2;21702:18;;21548:178::o;21731:406::-;21933:2;21915:21;;;21972:2;21952:18;;;21945:30;22011:34;22006:2;21991:18;;21984:62;-1:-1:-1;;;22077:2:1;22062:18;;22055:40;22127:3;22112:19;;21905:232::o;22142:343::-;22344:2;22326:21;;;22383:2;22363:18;;;22356:30;-1:-1:-1;;;22417:2:1;22402:18;;22395:49;22476:2;22461:18;;22316:169::o;22490:400::-;22692:2;22674:21;;;22731:2;22711:18;;;22704:30;22770:34;22765:2;22750:18;;22743:62;-1:-1:-1;;;22836:2:1;22821:18;;22814:34;22880:3;22865:19;;22664:226::o;23248:353::-;23450:2;23432:21;;;23489:2;23469:18;;;23462:30;23528:31;23523:2;23508:18;;23501:59;23592:2;23577:18;;23422:179::o;24433:353::-;24635:2;24617:21;;;24674:2;24654:18;;;24647:30;24713:31;24708:2;24693:18;;24686:59;24777:2;24762:18;;24607:179::o;24791:406::-;24993:2;24975:21;;;25032:2;25012:18;;;25005:30;25071:34;25066:2;25051:18;;25044:62;-1:-1:-1;;;25137:2:1;25122:18;;25115:40;25187:3;25172:19;;24965:232::o;25961:350::-;26163:2;26145:21;;;26202:2;26182:18;;;26175:30;26241:28;26236:2;26221:18;;26214:56;26302:2;26287:18;;26135:176::o;27137:353::-;27339:2;27321:21;;;27378:2;27358:18;;;27351:30;27417:31;27412:2;27397:18;;27390:59;27481:2;27466:18;;27311:179::o;29087:345::-;29289:2;29271:21;;;29328:2;29308:18;;;29301:30;-1:-1:-1;;;29362:2:1;29347:18;;29340:51;29423:2;29408:18;;29261:171::o;31698:404::-;31900:2;31882:21;;;31939:2;31919:18;;;31912:30;31978:34;31973:2;31958:18;;31951:62;-1:-1:-1;;;32044:2:1;32029:18;;32022:38;32092:3;32077:19;;31872:230::o;33885:720::-;34198:6;34187:9;34180:25;34241:3;34236:2;34225:9;34221:18;34214:31;34161:4;34262:46;34303:3;34292:9;34288:19;34280:6;34262:46;:::i;:::-;-1:-1:-1;;;;;34344:32:1;;;;34339:2;34324:18;;34317:60;-1:-1:-1;34396:10:1;34442:15;;;34437:2;34422:18;;34415:43;34495:15;;;;34489:3;34474:19;;34467:44;34364:3;34527:19;;34520:35;34586:3;34571:19;34564:35;34254:54;34170:435;-1:-1:-1;;34170:435:1:o;35409:275::-;35480:2;35474:9;35545:2;35526:13;;-1:-1:-1;;35522:27:1;35510:40;;-1:-1:-1;;;;;35565:34:1;;35601:22;;;35562:62;35559:2;;;35627:18;;:::i;:::-;35663:2;35656:22;35454:230;;-1:-1:-1;35454:230:1:o;35689:183::-;35749:4;-1:-1:-1;;;;;35774:6:1;35771:30;35768:2;;;35804:18;;:::i;:::-;-1:-1:-1;35849:1:1;35845:14;35861:4;35841:25;;35758:114::o;35877:128::-;35917:3;35948:1;35944:6;35941:1;35938:13;35935:2;;;35954:18;;:::i;:::-;-1:-1:-1;35990:9:1;;35925:80::o;36010:228::-;36049:3;36077:10;36114:2;36111:1;36107:10;36144:2;36141:1;36137:10;36175:3;36171:2;36167:12;36162:3;36159:21;36156:2;;;36183:18;;:::i;:::-;36219:13;;36057:181;-1:-1:-1;;;;36057:181:1:o;36243:120::-;36283:1;36309;36299:2;;36314:18;;:::i;:::-;-1:-1:-1;36348:9:1;;36289:74::o;36368:191::-;36407:1;36433:10;36470:2;36467:1;36463:10;36492:3;36482:2;;36499:18;;:::i;:::-;36537:10;;36533:20;;;;;36413:146;-1:-1:-1;;36413:146:1:o;36564:168::-;36604:7;36670:1;36666;36662:6;36658:14;36655:1;36652:21;36647:1;36640:9;36633:17;36629:45;36626:2;;;36677:18;;:::i;:::-;-1:-1:-1;36717:9:1;;36616:116::o;36737:125::-;36777:4;36805:1;36802;36799:8;36796:2;;;36810:18;;:::i;:::-;-1:-1:-1;36847:9:1;;36786:76::o;36867:258::-;36939:1;36949:113;36963:6;36960:1;36957:13;36949:113;;;37039:11;;;37033:18;37020:11;;;37013:39;36985:2;36978:10;36949:113;;;37080:6;37077:1;37074:13;37071:2;;;37115:1;37106:6;37101:3;37097:16;37090:27;37071:2;;36920:205;;;:::o;37130:135::-;37169:3;-1:-1:-1;;37190:17:1;;37187:2;;;37210:18;;:::i;:::-;-1:-1:-1;37257:1:1;37246:13;;37177:88::o;37270:127::-;37331:10;37326:3;37322:20;37319:1;37312:31;37362:4;37359:1;37352:15;37386:4;37383:1;37376:15;37402:127;37463:10;37458:3;37454:20;37451:1;37444:31;37494:4;37491:1;37484:15;37518:4;37515:1;37508:15;37534:127;37595:10;37590:3;37586:20;37583:1;37576:31;37626:4;37623:1;37616:15;37650:4;37647:1;37640:15;37666:127;37727:10;37722:3;37718:20;37715:1;37708:31;37758:4;37755:1;37748:15;37782:4;37779:1;37772:15
Swarm Source
ipfs://05531d2892fcdeb48472a864e59887b41c9670a9e5c69b4cabf85caa744b2557
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,416.21 | 4.7305 | $16,160.22 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.