More Info
Private Name Tags
ContractCreator
Sponsored
Latest 25 from a total of 438 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transmit | 115889936 | 241 days ago | IN | 0 ETH | 0.000274343134 | ||||
Transmit | 115846727 | 242 days ago | IN | 0 ETH | 0.000180503687 | ||||
Transmit | 115803518 | 243 days ago | IN | 0 ETH | 0.000557838893 | ||||
Transmit | 115760309 | 244 days ago | IN | 0 ETH | 0.000092525666 | ||||
Transmit | 115717101 | 245 days ago | IN | 0 ETH | 0.000090339348 | ||||
Transmit | 115673892 | 246 days ago | IN | 0 ETH | 0.000108761953 | ||||
Transmit | 115630683 | 247 days ago | IN | 0 ETH | 0.000149558129 | ||||
Transmit | 115587472 | 248 days ago | IN | 0 ETH | 0.000106465874 | ||||
Transmit | 115544265 | 249 days ago | IN | 0 ETH | 0.000120763561 | ||||
Transmit | 115501057 | 250 days ago | IN | 0 ETH | 0.000222346399 | ||||
Transmit | 115457849 | 251 days ago | IN | 0 ETH | 0.000074847743 | ||||
Transmit | 115414642 | 252 days ago | IN | 0 ETH | 0.00007514576 | ||||
Transmit | 115371433 | 253 days ago | IN | 0 ETH | 0.000072927407 | ||||
Transmit | 115328220 | 254 days ago | IN | 0 ETH | 0.000130240659 | ||||
Transmit | 115285012 | 255 days ago | IN | 0 ETH | 0.000072402318 | ||||
Transmit | 115241810 | 256 days ago | IN | 0 ETH | 0.000063997641 | ||||
Transmit | 115198607 | 257 days ago | IN | 0 ETH | 0.000077635073 | ||||
Transmit | 115155406 | 258 days ago | IN | 0 ETH | 0.000258694933 | ||||
Transmit | 115120840 | 259 days ago | IN | 0 ETH | 0.000103953628 | ||||
Transmit | 115077632 | 260 days ago | IN | 0 ETH | 0.000089923339 | ||||
Transmit | 115034423 | 261 days ago | IN | 0 ETH | 0.000148913877 | ||||
Transmit | 114991209 | 262 days ago | IN | 0 ETH | 0.00027053951 | ||||
Transmit | 114948008 | 263 days ago | IN | 0 ETH | 0.000248351694 | ||||
Transmit | 114904797 | 264 days ago | IN | 0 ETH | 0.000232359653 | ||||
Transmit | 114861589 | 265 days ago | IN | 0 ETH | 0.000118555085 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
107536750 | 434 days ago | 0 ETH | ||||
107536750 | 434 days ago | 0 ETH | ||||
107536750 | 434 days ago | 0 ETH | ||||
107493547 | 435 days ago | 0 ETH | ||||
107493547 | 435 days ago | 0 ETH | ||||
107493547 | 435 days ago | 0 ETH | ||||
107450332 | 436 days ago | 0 ETH | ||||
107450332 | 436 days ago | 0 ETH | ||||
107450332 | 436 days ago | 0 ETH | ||||
107407127 | 437 days ago | 0 ETH | ||||
107407127 | 437 days ago | 0 ETH | ||||
107407127 | 437 days ago | 0 ETH | ||||
107403802 | 437 days ago | 0 ETH | ||||
107363914 | 438 days ago | 0 ETH | ||||
107363914 | 438 days ago | 0 ETH | ||||
107363914 | 438 days ago | 0 ETH | ||||
107348302 | 439 days ago | 0 ETH | ||||
107348302 | 439 days ago | 0 ETH | ||||
107348302 | 439 days ago | 0 ETH | ||||
107348302 | 439 days ago | 0 ETH | ||||
107348302 | 439 days ago | 0 ETH | ||||
107348302 | 439 days ago | 0 ETH | ||||
107348302 | 439 days ago | 0 ETH | ||||
107348302 | 439 days ago | 0 ETH | ||||
107348302 | 439 days ago | 0 ETH |
Loading...
Loading
Contract Name:
AccessControlledOffchainAggregator
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at optimistic.etherscan.io on 2023-01-26 */ // Sources flattened with hardhat v2.12.6 https://hardhat.org // File contracts/ethereum/v0.7/src/AccessControllerInterface.sol // SPDX-License-Identifier: MIT pragma solidity ^0.7.0; interface AccessControllerInterface { function hasAccess(address user, bytes calldata data) external view returns (bool); } // File contracts/ethereum/v0.7/src/AggregatorInterface.sol pragma solidity ^0.7.0; interface AggregatorInterface { function latestAnswer() external view returns (int256); function latestTimestamp() external view returns (uint256); function latestRound() external view returns (uint256); function getAnswer(uint256 roundId) external view returns (int256); function getTimestamp(uint256 roundId) external view returns (uint256); event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); } // File contracts/ethereum/v0.7/src/AggregatorV3Interface.sol pragma solidity ^0.7.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } // File contracts/ethereum/v0.7/src/AggregatorV2V3Interface.sol pragma solidity ^0.7.0; interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface { } // File contracts/ethereum/v0.7/src/AggregatorValidatorInterface.sol pragma solidity ^0.7.0; interface AggregatorValidatorInterface { function validate( uint256 previousRoundId, int256 previousAnswer, uint256 currentRoundId, int256 currentAnswer ) external returns (bool); } // File contracts/ethereum/v0.7/src/LinkTokenInterface.sol pragma solidity ^0.7.1; interface LinkTokenInterface { function allowance(address owner, address spender) external view returns (uint256 remaining); function approve(address spender, uint256 value) external returns (bool success); function balanceOf(address owner) external view returns (uint256 balance); function decimals() external view returns (uint8 decimalPlaces); function decreaseApproval(address spender, uint256 addedValue) external returns (bool success); function increaseApproval(address spender, uint256 subtractedValue) external; function name() external view returns (string memory tokenName); function symbol() external view returns (string memory tokenSymbol); function totalSupply() external view returns (uint256 totalTokensIssued); function transfer(address to, uint256 value) external returns (bool success); function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success); function transferFrom(address from, address to, uint256 value) external returns (bool success); } // File contracts/ethereum/v0.7/src/Owned.sol pragma solidity ^0.7.0; /** * @title The Owned contract * @notice A contract with helpers for basic contract ownership. */ contract Owned { address payable public owner; address private pendingOwner; event OwnershipTransferRequested( address indexed from, address indexed to ); event OwnershipTransferred( address indexed from, address indexed to ); constructor() { owner = msg.sender; } /** * @dev Allows an owner to begin transferring ownership to a new address, * pending. */ function transferOwnership(address _to) external onlyOwner() { pendingOwner = _to; emit OwnershipTransferRequested(owner, _to); } /** * @dev Allows an ownership transfer to be completed by the recipient. */ function acceptOwnership() external { require(msg.sender == pendingOwner, "Must be proposed owner"); address oldOwner = owner; owner = msg.sender; pendingOwner = address(0); emit OwnershipTransferred(oldOwner, msg.sender); } /** * @dev Reverts if called by anyone other than the contract owner. */ modifier onlyOwner() { require(msg.sender == owner, "Only callable by owner"); _; } } // File contracts/ethereum/v0.7/src/OffchainAggregatorBilling.sol pragma solidity ^0.7.0; /** * @notice tracks administration of oracle-reward and gas-reimbursement parameters. * @dev * If you read or change this, be sure to read or adjust the comments. They * track the units of the values under consideration, and are crucial to * the readability of the operations it specifies. * @notice * Trust Model: * Nothing in this contract prevents a billing admin from setting insane * values for the billing parameters in setBilling. Oracles * participating in this contract should regularly check that the * parameters make sense. Similarly, the outstanding obligations of this * contract to the oracles can exceed the funds held by the contract. * Oracles participating in this contract should regularly check that it * holds sufficient funds and stop interacting with it if funding runs * out. * This still leaves oracles with some risk due to TOCTOU issues. * However, since the sums involved are pretty small (Ethereum * transactions aren't that expensive in the end) and an oracle would * likely stop participating in a contract it repeatedly lost money on, * this risk is deemed acceptable. Oracles should also regularly * withdraw any funds in the contract to prevent issues where the * contract becomes underfunded at a later time, and different oracles * are competing for the left-over funds. * Finally, note that any change to the set of oracles or to the billing * parameters will trigger payout of all oracles first (using the old * parameters), a billing admin cannot take away funds that are already * marked for payment. */ contract OffchainAggregatorBilling is Owned { // Maximum number of oracles the offchain reporting protocol is designed for uint256 constant internal maxNumOracles = 31; // Parameters for oracle payments struct Billing { // Highest compensated gas price, in ETH-gwei uints uint32 maximumGasPrice; // If gas price is less (in ETH-gwei units), transmitter gets half the savings uint32 reasonableGasPrice; // Pay transmitter back this much LINK per unit eth spent on gas // (1e-6LINK/ETH units) uint32 microLinkPerEth; // Fixed LINK reward for each observer, in LINK-gwei units uint32 linkGweiPerObservation; // Fixed reward for transmitter, in linkGweiPerObservation units uint32 linkGweiPerTransmission; } Billing internal s_billing; // We assume that the token contract is correct. This contract is not written // to handle misbehaving ERC20 tokens! LinkTokenInterface internal s_linkToken; AccessControllerInterface internal s_billingAccessController; // ith element is number of observation rewards due to ith process, plus one. // This is expected to saturate after an oracle has submitted 65,535 // observations, or about 65535/(3*24*20) = 45 days, given a transmission // every 3 minutes. // // This is always one greater than the actual value, so that when the value is // reset to zero, we don't end up with a zero value in storage (which would // result in a higher gas cost, the next time the value is incremented.) // Calculations using this variable need to take that offset into account. uint16[maxNumOracles] internal s_oracleObservationsCounts; // Addresses at which oracles want to receive payments, by transmitter address mapping (address /* transmitter */ => address /* payment address */) internal s_payees; // Payee addresses which must be approved by the owner mapping (address /* transmitter */ => address /* payment address */) internal s_proposedPayees; // LINK-wei-denominated reimbursements for gas used by transmitters. // // This is always one greater than the actual value, so that when the value is // reset to zero, we don't end up with a zero value in storage (which would // result in a higher gas cost, the next time the value is incremented.) // Calculations using this variable need to take that offset into account. // // Argument for overflow safety: // We have the following maximum intermediate values: // - 2**40 additions to this variable (epochAndRound is a uint40) // - 2**32 gas price in ethgwei/gas // - 1e9 ethwei/ethgwei // - 2**32 gas since the block gas limit is at ~20 million // - 2**32 (microlink/eth) // And we have 2**40 * 2**32 * 1e9 * 2**32 * 2**32 < 2**166 // (we also divide in some places, but that only makes the value smaller) // We can thus safely use uint256 intermediate values for the computation // updating this variable. uint256[maxNumOracles] internal s_gasReimbursementsLinkWei; // Used for s_oracles[a].role, where a is an address, to track the purpose // of the address, or to indicate that the address is unset. enum Role { // No oracle role has been set for address a Unset, // Signing address for the s_oracles[a].index'th oracle. I.e., report // signatures from this oracle should ecrecover back to address a. Signer, // Transmission address for the s_oracles[a].index'th oracle. I.e., if a // report is received by OffchainAggregator.transmit in which msg.sender is // a, it is attributed to the s_oracles[a].index'th oracle. Transmitter } struct Oracle { uint8 index; // Index of oracle in s_signers/s_transmitters Role role; // Role of the address which mapped to this struct } mapping (address /* signer OR transmitter address */ => Oracle) internal s_oracles; // s_signers contains the signing address of each oracle address[] internal s_signers; // s_transmitters contains the transmission address of each oracle, // i.e. the address the oracle actually sends transactions to the contract from address[] internal s_transmitters; uint256 constant private maxUint16 = (1 << 16) - 1; uint256 constant internal maxUint128 = (1 << 128) - 1; constructor( uint32 _maximumGasPrice, uint32 _reasonableGasPrice, uint32 _microLinkPerEth, uint32 _linkGweiPerObservation, uint32 _linkGweiPerTransmission, LinkTokenInterface _link, AccessControllerInterface _billingAccessController ) { setBillingInternal(_maximumGasPrice, _reasonableGasPrice, _microLinkPerEth, _linkGweiPerObservation, _linkGweiPerTransmission); s_linkToken = _link; emit LinkTokenSet(LinkTokenInterface(address(0)), _link); setBillingAccessControllerInternal(_billingAccessController); uint16[maxNumOracles] memory counts; // See s_oracleObservationsCounts docstring uint256[maxNumOracles] memory gas; // see s_gasReimbursementsLinkWei docstring for (uint8 i = 0; i < maxNumOracles; i++) { counts[i] = 1; gas[i] = 1; } s_oracleObservationsCounts = counts; s_gasReimbursementsLinkWei = gas; } /* * @notice emitted when the LINK token contract is set * @param _oldLinkToken the address of the old LINK token contract * @param _newLinkToken the address of the new LINK token contract */ event LinkTokenSet( LinkTokenInterface indexed _oldLinkToken, LinkTokenInterface indexed _newLinkToken ); /* * @notice sets the LINK token contract used for paying oracles * @param _linkToken the address of the LINK token contract * @param _recipient remaining funds from the previous token contract are transfered * here * @dev this function will return early (without an error) without changing any state * if _linkToken equals getLinkToken(). * @dev this will trigger a payout so that a malicious owner cannot take from oracles * what is already owed to them. * @dev we assume that the token contract is correct. This contract is not written * to handle misbehaving ERC20 tokens! */ function setLinkToken( LinkTokenInterface _linkToken, address _recipient ) external onlyOwner() { LinkTokenInterface oldLinkToken = s_linkToken; if (_linkToken == oldLinkToken) { // No change, nothing to be done return; } // call balanceOf as a sanity check on whether we're talking to a token // contract _linkToken.balanceOf(address(this)); // we break CEI here, but that's okay because we're dealing with a correct // token contract (by assumption). payOracles(); uint256 remainingBalance = oldLinkToken.balanceOf(address(this)); require(oldLinkToken.transfer(_recipient, remainingBalance), "transfer remaining funds failed"); s_linkToken = _linkToken; emit LinkTokenSet(oldLinkToken, _linkToken); } /* * @notice gets the LINK token contract used for paying oracles * @return linkToken the address of the LINK token contract */ function getLinkToken() external view returns(LinkTokenInterface linkToken) { return s_linkToken; } /** * @notice emitted when billing parameters are set * @param maximumGasPrice highest gas price for which transmitter will be compensated * @param reasonableGasPrice transmitter will receive reward for gas prices under this value * @param microLinkPerEth reimbursement per ETH of gas cost, in 1e-6LINK units * @param linkGweiPerObservation reward to oracle for contributing an observation to a successfully transmitted report, in 1e-9LINK units * @param linkGweiPerTransmission reward to transmitter of a successful report, in 1e-9LINK units */ event BillingSet( uint32 maximumGasPrice, uint32 reasonableGasPrice, uint32 microLinkPerEth, uint32 linkGweiPerObservation, uint32 linkGweiPerTransmission ); function setBillingInternal( uint32 _maximumGasPrice, uint32 _reasonableGasPrice, uint32 _microLinkPerEth, uint32 _linkGweiPerObservation, uint32 _linkGweiPerTransmission ) internal { s_billing = Billing(_maximumGasPrice, _reasonableGasPrice, _microLinkPerEth, _linkGweiPerObservation, _linkGweiPerTransmission); emit BillingSet(_maximumGasPrice, _reasonableGasPrice, _microLinkPerEth, _linkGweiPerObservation, _linkGweiPerTransmission); } /** * @notice sets billing parameters * @param _maximumGasPrice highest gas price for which transmitter will be compensated * @param _reasonableGasPrice transmitter will receive reward for gas prices under this value * @param _microLinkPerEth reimbursement per ETH of gas cost, in 1e-6LINK units * @param _linkGweiPerObservation reward to oracle for contributing an observation to a successfully transmitted report, in 1e-9LINK units * @param _linkGweiPerTransmission reward to transmitter of a successful report, in 1e-9LINK units * @dev access control provided by billingAccessController */ function setBilling( uint32 _maximumGasPrice, uint32 _reasonableGasPrice, uint32 _microLinkPerEth, uint32 _linkGweiPerObservation, uint32 _linkGweiPerTransmission ) external { AccessControllerInterface access = s_billingAccessController; require(msg.sender == owner || access.hasAccess(msg.sender, msg.data), "Only owner&billingAdmin can call"); payOracles(); setBillingInternal(_maximumGasPrice, _reasonableGasPrice, _microLinkPerEth, _linkGweiPerObservation, _linkGweiPerTransmission); } /** * @notice gets billing parameters * @param maximumGasPrice highest gas price for which transmitter will be compensated * @param reasonableGasPrice transmitter will receive reward for gas prices under this value * @param microLinkPerEth reimbursement per ETH of gas cost, in 1e-6LINK units * @param linkGweiPerObservation reward to oracle for contributing an observation to a successfully transmitted report, in 1e-9LINK units * @param linkGweiPerTransmission reward to transmitter of a successful report, in 1e-9LINK units */ function getBilling() external view returns ( uint32 maximumGasPrice, uint32 reasonableGasPrice, uint32 microLinkPerEth, uint32 linkGweiPerObservation, uint32 linkGweiPerTransmission ) { Billing memory billing = s_billing; return ( billing.maximumGasPrice, billing.reasonableGasPrice, billing.microLinkPerEth, billing.linkGweiPerObservation, billing.linkGweiPerTransmission ); } /** * @notice emitted when a new access-control contract is set * @param old the address prior to the current setting * @param current the address of the new access-control contract */ event BillingAccessControllerSet(AccessControllerInterface old, AccessControllerInterface current); function setBillingAccessControllerInternal(AccessControllerInterface _billingAccessController) internal { AccessControllerInterface oldController = s_billingAccessController; if (_billingAccessController != oldController) { s_billingAccessController = _billingAccessController; emit BillingAccessControllerSet( oldController, _billingAccessController ); } } /** * @notice sets billingAccessController * @param _billingAccessController new billingAccessController contract address * @dev only owner can call this */ function setBillingAccessController(AccessControllerInterface _billingAccessController) external onlyOwner { setBillingAccessControllerInternal(_billingAccessController); } /** * @notice gets billingAccessController * @return address of billingAccessController contract */ function billingAccessController() external view returns (AccessControllerInterface) { return s_billingAccessController; } /** * @notice withdraws an oracle's payment from the contract * @param _transmitter the transmitter address of the oracle * @dev must be called by oracle's payee address */ function withdrawPayment(address _transmitter) external { require(msg.sender == s_payees[_transmitter], "Only payee can withdraw"); payOracle(_transmitter); } /** * @notice query an oracle's payment amount * @param _transmitter the transmitter address of the oracle */ function owedPayment(address _transmitter) public view returns (uint256) { Oracle memory oracle = s_oracles[_transmitter]; if (oracle.role == Role.Unset) { return 0; } Billing memory billing = s_billing; uint256 linkWeiAmount = uint256(s_oracleObservationsCounts[oracle.index] - 1) * uint256(billing.linkGweiPerObservation) * (1 gwei); linkWeiAmount += s_gasReimbursementsLinkWei[oracle.index] - 1; return linkWeiAmount; } /** * @notice emitted when an oracle has been paid LINK * @param transmitter address from which the oracle sends reports to the transmit method * @param payee address to which the payment is sent * @param amount amount of LINK sent * @param linkToken address of the LINK token contract */ event OraclePaid( address indexed transmitter, address indexed payee, uint256 amount, LinkTokenInterface indexed linkToken ); // payOracle pays out _transmitter's balance to the corresponding payee, and zeros it out function payOracle(address _transmitter) internal { Oracle memory oracle = s_oracles[_transmitter]; uint256 linkWeiAmount = owedPayment(_transmitter); if (linkWeiAmount > 0) { address payee = s_payees[_transmitter]; // Poses no re-entrancy issues, because LINK.transfer does not yield // control flow. require(s_linkToken.transfer(payee, linkWeiAmount), "insufficient funds"); s_oracleObservationsCounts[oracle.index] = 1; // "zero" the counts. see var's docstring s_gasReimbursementsLinkWei[oracle.index] = 1; // "zero" the counts. see var's docstring emit OraclePaid(_transmitter, payee, linkWeiAmount, s_linkToken); } } // payOracles pays out all transmitters, and zeros out their balances. // // It's much more gas-efficient to do this as a single operation, to avoid // hitting storage too much. function payOracles() internal { Billing memory billing = s_billing; LinkTokenInterface linkToken = s_linkToken; uint16[maxNumOracles] memory observationsCounts = s_oracleObservationsCounts; uint256[maxNumOracles] memory gasReimbursementsLinkWei = s_gasReimbursementsLinkWei; address[] memory transmitters = s_transmitters; for (uint transmitteridx = 0; transmitteridx < transmitters.length; transmitteridx++) { uint256 reimbursementAmountLinkWei = gasReimbursementsLinkWei[transmitteridx] - 1; uint256 obsCount = observationsCounts[transmitteridx] - 1; uint256 linkWeiAmount = obsCount * uint256(billing.linkGweiPerObservation) * (1 gwei) + reimbursementAmountLinkWei; if (linkWeiAmount > 0) { address payee = s_payees[transmitters[transmitteridx]]; // Poses no re-entrancy issues, because LINK.transfer does not yield // control flow. require(linkToken.transfer(payee, linkWeiAmount), "insufficient funds"); observationsCounts[transmitteridx] = 1; // "zero" the counts. gasReimbursementsLinkWei[transmitteridx] = 1; // "zero" the counts. emit OraclePaid(transmitters[transmitteridx], payee, linkWeiAmount, linkToken); } } // "Zero" the accounting storage variables s_oracleObservationsCounts = observationsCounts; s_gasReimbursementsLinkWei = gasReimbursementsLinkWei; } function oracleRewards( bytes memory observers, uint16[maxNumOracles] memory observations ) internal pure returns (uint16[maxNumOracles] memory) { // reward each observer-participant with the observer reward for (uint obsIdx = 0; obsIdx < observers.length; obsIdx++) { uint8 observer = uint8(observers[obsIdx]); observations[observer] = saturatingAddUint16(observations[observer], 1); } return observations; } // This value needs to change if maxNumOracles is increased, or the accounting // calculations at the bottom of reimburseAndRewardOracles change. // // To recalculate it, run the profiler as described in // ../../profile/README.md, and add up the gas-usage values reported for the // lines in reimburseAndRewardOracles following the "gasLeft = gasleft()" // line. E.g., you will see output like this: // // 7 uint256 gasLeft = gasleft(); // 29 uint256 gasCostEthWei = transmitterGasCostEthWei( // 9 uint256(initialGas), // 3 gasPrice, // 3 callDataGasCost, // 3 gasLeft // . // . // . // 59 uint256 gasCostLinkWei = (gasCostEthWei * billing.microLinkPerEth)/ 1e6; // . // . // . // 5047 s_gasReimbursementsLinkWei[txOracle.index] = // 856 s_gasReimbursementsLinkWei[txOracle.index] + gasCostLinkWei + // 26 uint256(billing.linkGweiPerTransmission) * (1 gwei); // // If those were the only lines to be accounted for, you would add up // 29+9+3+3+3+59+5047+856+26=6035. uint256 internal constant accountingGasCost = 6035; // Uncomment the following declaration to compute the remaining gas cost after // above gasleft(). (This must exist in a base class to OffchainAggregator, so // it can't go in TestOffchainAggregator.) // // uint256 public gasUsedInAccounting; // Gas price at which the transmitter should be reimbursed, in ETH-gwei/gas function impliedGasPrice( uint256 txGasPrice, // ETH-gwei/gas units uint256 reasonableGasPrice, // ETH-gwei/gas units uint256 maximumGasPrice // ETH-gwei/gas units ) internal pure returns (uint256) { // Reward the transmitter for choosing an efficient gas price: if they manage // to come in lower than considered reasonable, give them half the savings. // // The following calculations are all in units of gwei/gas, i.e. 1e-9ETH/gas uint256 gasPrice = txGasPrice; if (txGasPrice < reasonableGasPrice) { // Give transmitter half the savings for coming in under the reasonable gas price gasPrice += (reasonableGasPrice - txGasPrice) / 2; } // Don't reimburse a gas price higher than maximumGasPrice return min(gasPrice, maximumGasPrice); } // gas reimbursement due the transmitter, in ETH-wei // // If this function is changed, accountingGasCost needs to change, too. See // its docstring function transmitterGasCostEthWei( uint256 initialGas, uint256 gasPrice, // ETH-gwei/gas units uint256 callDataCost, // gas units uint256 gasLeft ) internal pure returns (uint128 gasCostEthWei) { require(initialGas >= gasLeft, "gasLeft cannot exceed initialGas"); uint256 gasUsed = // gas units initialGas - gasLeft + // observed gas usage callDataCost + accountingGasCost; // estimated gas usage // gasUsed is in gas units, gasPrice is in ETH-gwei/gas units; convert to ETH-wei uint256 fullGasCostEthWei = gasUsed * gasPrice * (1 gwei); assert(fullGasCostEthWei < maxUint128); // the entire ETH supply fits in a uint128... return uint128(fullGasCostEthWei); } /** * @notice withdraw any available funds left in the contract, up to _amount, after accounting for the funds due to participants in past reports * @param _recipient address to send funds to * @param _amount maximum amount to withdraw, denominated in LINK-wei. * @dev access control provided by billingAccessController */ function withdrawFunds(address _recipient, uint256 _amount) external { require(msg.sender == owner || s_billingAccessController.hasAccess(msg.sender, msg.data), "Only owner&billingAdmin can call"); uint256 linkDue = totalLINKDue(); uint256 linkBalance = s_linkToken.balanceOf(address(this)); require(linkBalance >= linkDue, "insufficient balance"); require(s_linkToken.transfer(_recipient, min(linkBalance - linkDue, _amount)), "insufficient funds"); } // Total LINK due to participants in past reports. function totalLINKDue() internal view returns (uint256 linkDue) { // Argument for overflow safety: We do all computations in // uint256s. The inputs to linkDue are: // - the <= 31 observation rewards each of which has less than // 64 bits (32 bits for billing.linkGweiPerObservation, 32 bits // for wei/gwei conversion). Hence 69 bits are sufficient for this part. // - the <= 31 gas reimbursements, each of which consists of at most 166 // bits (see s_gasReimbursementsLinkWei docstring). Hence 171 bits are // sufficient for this part // In total, 172 bits are enough. uint16[maxNumOracles] memory observationCounts = s_oracleObservationsCounts; for (uint i = 0; i < maxNumOracles; i++) { linkDue += observationCounts[i] - 1; // Stored value is one greater than actual value } Billing memory billing = s_billing; // Convert linkGweiPerObservation to uint256, or this overflows! linkDue *= uint256(billing.linkGweiPerObservation) * (1 gwei); address[] memory transmitters = s_transmitters; uint256[maxNumOracles] memory gasReimbursementsLinkWei = s_gasReimbursementsLinkWei; for (uint i = 0; i < transmitters.length; i++) { linkDue += uint256(gasReimbursementsLinkWei[i]-1); // Stored value is one greater than actual value } } /** * @notice allows oracles to check that sufficient LINK balance is available * @return availableBalance LINK available on this contract, after accounting for outstanding obligations. can become negative */ function linkAvailableForPayment() external view returns (int256 availableBalance) { // there are at most one billion LINK, so this cast is safe int256 balance = int256(s_linkToken.balanceOf(address(this))); // according to the argument in the definition of totalLINKDue, // totalLINKDue is never greater than 2**172, so this cast is safe int256 due = int256(totalLINKDue()); // safe from overflow according to above sizes return int256(balance) - int256(due); } /** * @notice number of observations oracle is due to be reimbursed for * @param _signerOrTransmitter address used by oracle for signing or transmitting reports */ function oracleObservationCount(address _signerOrTransmitter) external view returns (uint16) { Oracle memory oracle = s_oracles[_signerOrTransmitter]; if (oracle.role == Role.Unset) { return 0; } return s_oracleObservationsCounts[oracle.index] - 1; } function reimburseAndRewardOracles( uint32 initialGas, bytes memory observers ) internal { Oracle memory txOracle = s_oracles[msg.sender]; Billing memory billing = s_billing; // Reward oracles for providing observations. Oracles are not rewarded // for providing signatures, because signing is essentially free. s_oracleObservationsCounts = oracleRewards(observers, s_oracleObservationsCounts); // Reimburse transmitter of the report for gas usage require(txOracle.role == Role.Transmitter, "sent by undesignated transmitter" ); uint256 gasPrice = impliedGasPrice( tx.gasprice / (1 gwei), // convert to ETH-gwei units billing.reasonableGasPrice, billing.maximumGasPrice ); // The following is only an upper bound, as it ignores the cheaper cost for // 0 bytes. Safe from overflow, because calldata just isn't that long. uint256 callDataGasCost = 16 * msg.data.length; // If any changes are made to subsequent calculations, accountingGasCost // needs to change, too. uint256 gasLeft = gasleft(); uint256 gasCostEthWei = transmitterGasCostEthWei( uint256(initialGas), gasPrice, callDataGasCost, gasLeft ); // microLinkPerEth is 1e-6LINK/ETH units, gasCostEthWei is 1e-18ETH units // (ETH-wei), product is 1e-24LINK-wei units, dividing by 1e6 gives // 1e-18LINK units, i.e. LINK-wei units // Safe from over/underflow, since all components are non-negative, // gasCostEthWei will always fit into uint128 and microLinkPerEth is a // uint32 (128+32 < 256!). uint256 gasCostLinkWei = (gasCostEthWei * billing.microLinkPerEth)/ 1e6; // Safe from overflow, because gasCostLinkWei < 2**160 and // billing.linkGweiPerTransmission * (1 gwei) < 2**64 and we increment // s_gasReimbursementsLinkWei[txOracle.index] at most 2**40 times. s_gasReimbursementsLinkWei[txOracle.index] = s_gasReimbursementsLinkWei[txOracle.index] + gasCostLinkWei + uint256(billing.linkGweiPerTransmission) * (1 gwei); // convert from linkGwei to linkWei // Uncomment next line to compute the remaining gas cost after above gasleft(). // See OffchainAggregatorBilling.accountingGasCost docstring for more information. // // gasUsedInAccounting = gasLeft - gasleft(); } /* * Payee management */ /** * @notice emitted when a transfer of an oracle's payee address has been initiated * @param transmitter address from which the oracle sends reports to the transmit method * @param current the payeee address for the oracle, prior to this setting * @param proposed the proposed new payee address for the oracle */ event PayeeshipTransferRequested( address indexed transmitter, address indexed current, address indexed proposed ); /** * @notice emitted when a transfer of an oracle's payee address has been completed * @param transmitter address from which the oracle sends reports to the transmit method * @param current the payeee address for the oracle, prior to this setting */ event PayeeshipTransferred( address indexed transmitter, address indexed previous, address indexed current ); /** * @notice sets the payees for transmitting addresses * @param _transmitters addresses oracles use to transmit the reports * @param _payees addresses of payees corresponding to list of transmitters * @dev must be called by owner * @dev cannot be used to change payee addresses, only to initially populate them */ function setPayees( address[] calldata _transmitters, address[] calldata _payees ) external onlyOwner() { require(_transmitters.length == _payees.length, "transmitters.size != payees.size"); for (uint i = 0; i < _transmitters.length; i++) { address transmitter = _transmitters[i]; address payee = _payees[i]; address currentPayee = s_payees[transmitter]; bool zeroedOut = currentPayee == address(0); require(zeroedOut || currentPayee == payee, "payee already set"); s_payees[transmitter] = payee; if (currentPayee != payee) { emit PayeeshipTransferred(transmitter, currentPayee, payee); } } } /** * @notice first step of payeeship transfer (safe transfer pattern) * @param _transmitter transmitter address of oracle whose payee is changing * @param _proposed new payee address * @dev can only be called by payee address */ function transferPayeeship( address _transmitter, address _proposed ) external { require(msg.sender == s_payees[_transmitter], "only current payee can update"); require(msg.sender != _proposed, "cannot transfer to self"); address previousProposed = s_proposedPayees[_transmitter]; s_proposedPayees[_transmitter] = _proposed; if (previousProposed != _proposed) { emit PayeeshipTransferRequested(_transmitter, msg.sender, _proposed); } } /** * @notice second step of payeeship transfer (safe transfer pattern) * @param _transmitter transmitter address of oracle whose payee is changing * @dev can only be called by proposed new payee address */ function acceptPayeeship( address _transmitter ) external { require(msg.sender == s_proposedPayees[_transmitter], "only proposed payees can accept"); address currentPayee = s_payees[_transmitter]; s_payees[_transmitter] = msg.sender; s_proposedPayees[_transmitter] = address(0); emit PayeeshipTransferred(_transmitter, currentPayee, msg.sender); } /* * Helper functions */ function saturatingAddUint16(uint16 _x, uint16 _y) internal pure returns (uint16) { return uint16(min(uint256(_x)+uint256(_y), maxUint16)); } function min(uint256 a, uint256 b) internal pure returns (uint256) { if (a < b) { return a; } return b; } } // File contracts/ethereum/v0.7/src/TypeAndVersionInterface.sol pragma solidity ^0.7.0; abstract contract TypeAndVersionInterface{ function typeAndVersion() external pure virtual returns (string memory); } // File contracts/ethereum/v0.7/src/OffchainAggregator.sol pragma solidity ^0.7.0; /** * @notice Onchain verification of reports from the offchain reporting protocol * @dev For details on its operation, see the offchain reporting protocol design * @dev doc, which refers to this contract as simply the "contract". */ contract OffchainAggregator is Owned, OffchainAggregatorBilling, AggregatorV2V3Interface, TypeAndVersionInterface { uint256 constant private maxUint32 = (1 << 32) - 1; // Storing these fields used on the hot path in a HotVars variable reduces the // retrieval of all of them to a single SLOAD. If any further fields are // added, make sure that storage of the struct still takes at most 32 bytes. struct HotVars { // Provides 128 bits of security against 2nd pre-image attacks, but only // 64 bits against collisions. This is acceptable, since a malicious owner has // easier way of messing up the protocol than to find hash collisions. bytes16 latestConfigDigest; uint40 latestEpochAndRound; // 32 most sig bits for epoch, 8 least sig bits for round // Current bound assumed on number of faulty/dishonest oracles participating // in the protocol, this value is referred to as f in the design uint8 threshold; // Chainlink Aggregators expose a roundId to consumers. The offchain reporting // protocol does not use this id anywhere. We increment it whenever a new // transmission is made to provide callers with contiguous ids for successive // reports. uint32 latestAggregatorRoundId; } HotVars internal s_hotVars; // Transmission records the median answer from the transmit transaction at // time timestamp struct Transmission { int192 answer; // 192 bits ought to be enough for anyone uint64 timestamp; } mapping(uint32 /* aggregator round ID */ => Transmission) internal s_transmissions; // incremented each time a new config is posted. This count is incorporated // into the config digest, to prevent replay attacks. uint32 internal s_configCount; uint32 internal s_latestConfigBlockNumber; // makes it easier for offchain systems // to extract config from logs. // Lowest answer the system is allowed to report in response to transmissions int192 immutable public minAnswer; // Highest answer the system is allowed to report in response to transmissions int192 immutable public maxAnswer; /* * @param _maximumGasPrice highest gas price for which transmitter will be compensated * @param _reasonableGasPrice transmitter will receive reward for gas prices under this value * @param _microLinkPerEth reimbursement per ETH of gas cost, in 1e-6LINK units * @param _linkGweiPerObservation reward to oracle for contributing an observation to a successfully transmitted report, in 1e-9LINK units * @param _linkGweiPerTransmission reward to transmitter of a successful report, in 1e-9LINK units * @param _link address of the LINK contract * @param _minAnswer lowest answer the median of a report is allowed to be * @param _maxAnswer highest answer the median of a report is allowed to be * @param _billingAccessController access controller for billing admin functions * @param _requesterAccessController access controller for requesting new rounds * @param _decimals answers are stored in fixed-point format, with this many digits of precision * @param _description short human-readable description of observable this contract's answers pertain to */ constructor( uint32 _maximumGasPrice, uint32 _reasonableGasPrice, uint32 _microLinkPerEth, uint32 _linkGweiPerObservation, uint32 _linkGweiPerTransmission, LinkTokenInterface _link, int192 _minAnswer, int192 _maxAnswer, AccessControllerInterface _billingAccessController, AccessControllerInterface _requesterAccessController, uint8 _decimals, string memory _description ) OffchainAggregatorBilling(_maximumGasPrice, _reasonableGasPrice, _microLinkPerEth, _linkGweiPerObservation, _linkGweiPerTransmission, _link, _billingAccessController ) { decimals = _decimals; s_description = _description; setRequesterAccessController(_requesterAccessController); setValidatorConfig(AggregatorValidatorInterface(0x0), 0); minAnswer = _minAnswer; maxAnswer = _maxAnswer; } /* * Versioning */ function typeAndVersion() external override pure virtual returns (string memory) { return "OffchainAggregator 3.0.0"; } /* * Config logic */ /** * @notice triggers a new run of the offchain reporting protocol * @param previousConfigBlockNumber block in which the previous config was set, to simplify historic analysis * @param configCount ordinal number of this config setting among all config settings over the life of this contract * @param signers ith element is address ith oracle uses to sign a report * @param transmitters ith element is address ith oracle uses to transmit a report via the transmit method * @param threshold maximum number of faulty/dishonest oracles the protocol can tolerate while still working correctly * @param encodedConfigVersion version of the serialization format used for "encoded" parameter * @param encoded serialized data used by oracles to configure their offchain operation */ event ConfigSet( uint32 previousConfigBlockNumber, uint64 configCount, address[] signers, address[] transmitters, uint8 threshold, uint64 encodedConfigVersion, bytes encoded ); // Reverts transaction if config args are invalid modifier checkConfigValid ( uint256 _numSigners, uint256 _numTransmitters, uint256 _threshold ) { require(_numSigners <= maxNumOracles, "too many signers"); require(_threshold > 0, "threshold must be positive"); require( _numSigners == _numTransmitters, "oracle addresses out of registration" ); require(_numSigners > 3*_threshold, "faulty-oracle threshold too high"); _; } /** * @notice sets offchain reporting protocol configuration incl. participating oracles * @param _signers addresses with which oracles sign the reports * @param _transmitters addresses oracles use to transmit the reports * @param _threshold number of faulty oracles the system can tolerate * @param _encodedConfigVersion version number for offchainEncoding schema * @param _encoded encoded off-chain oracle configuration */ function setConfig( address[] calldata _signers, address[] calldata _transmitters, uint8 _threshold, uint64 _encodedConfigVersion, bytes calldata _encoded ) external checkConfigValid(_signers.length, _transmitters.length, _threshold) onlyOwner() { while (s_signers.length != 0) { // remove any old signer/transmitter addresses uint lastIdx = s_signers.length - 1; address signer = s_signers[lastIdx]; address transmitter = s_transmitters[lastIdx]; payOracle(transmitter); delete s_oracles[signer]; delete s_oracles[transmitter]; s_signers.pop(); s_transmitters.pop(); } for (uint i = 0; i < _signers.length; i++) { // add new signer/transmitter addresses require( s_oracles[_signers[i]].role == Role.Unset, "repeated signer address" ); s_oracles[_signers[i]] = Oracle(uint8(i), Role.Signer); require(s_payees[_transmitters[i]] != address(0), "payee must be set"); require( s_oracles[_transmitters[i]].role == Role.Unset, "repeated transmitter address" ); s_oracles[_transmitters[i]] = Oracle(uint8(i), Role.Transmitter); s_signers.push(_signers[i]); s_transmitters.push(_transmitters[i]); } s_hotVars.threshold = _threshold; uint32 previousConfigBlockNumber = s_latestConfigBlockNumber; s_latestConfigBlockNumber = uint32(block.number); s_configCount += 1; uint64 configCount = s_configCount; { s_hotVars.latestConfigDigest = configDigestFromConfigData( address(this), configCount, _signers, _transmitters, _threshold, _encodedConfigVersion, _encoded ); s_hotVars.latestEpochAndRound = 0; } emit ConfigSet( previousConfigBlockNumber, configCount, _signers, _transmitters, _threshold, _encodedConfigVersion, _encoded ); } function configDigestFromConfigData( address _contractAddress, uint64 _configCount, address[] calldata _signers, address[] calldata _transmitters, uint8 _threshold, uint64 _encodedConfigVersion, bytes calldata _encodedConfig ) internal pure returns (bytes16) { return bytes16(keccak256(abi.encode(_contractAddress, _configCount, _signers, _transmitters, _threshold, _encodedConfigVersion, _encodedConfig ))); } /** * @notice information about current offchain reporting protocol configuration * @return configCount ordinal number of current config, out of all configs applied to this contract so far * @return blockNumber block at which this config was set * @return configDigest domain-separation tag for current config (see configDigestFromConfigData) */ function latestConfigDetails() external view returns ( uint32 configCount, uint32 blockNumber, bytes16 configDigest ) { return (s_configCount, s_latestConfigBlockNumber, s_hotVars.latestConfigDigest); } /** * @return list of addresses permitted to transmit reports to this contract * @dev The list will match the order used to specify the transmitter during setConfig */ function transmitters() external view returns(address[] memory) { return s_transmitters; } /* * On-chain validation logc */ // Configuration for validator struct ValidatorConfig { AggregatorValidatorInterface validator; uint32 gasLimit; } ValidatorConfig private s_validatorConfig; /** * @notice indicates that the validator configuration has been set * @param previousValidator previous validator contract * @param previousGasLimit previous gas limit for validate calls * @param currentValidator current validator contract * @param currentGasLimit current gas limit for validate calls */ event ValidatorConfigSet( AggregatorValidatorInterface indexed previousValidator, uint32 previousGasLimit, AggregatorValidatorInterface indexed currentValidator, uint32 currentGasLimit ); /** * @notice validator configuration * @return validator validator contract * @return gasLimit gas limit for validate calls */ function validatorConfig() external view returns (AggregatorValidatorInterface validator, uint32 gasLimit) { ValidatorConfig memory vc = s_validatorConfig; return (vc.validator, vc.gasLimit); } /** * @notice sets validator configuration * @dev set _newValidator to 0x0 to disable validate calls * @param _newValidator address of the new validator contract * @param _newGasLimit new gas limit for validate calls */ function setValidatorConfig(AggregatorValidatorInterface _newValidator, uint32 _newGasLimit) public onlyOwner() { ValidatorConfig memory previous = s_validatorConfig; if (previous.validator != _newValidator || previous.gasLimit != _newGasLimit) { s_validatorConfig = ValidatorConfig({ validator: _newValidator, gasLimit: _newGasLimit }); emit ValidatorConfigSet(previous.validator, previous.gasLimit, _newValidator, _newGasLimit); } } function validateAnswer( uint32 _aggregatorRoundId, int256 _answer ) private { ValidatorConfig memory vc = s_validatorConfig; if (address(vc.validator) == address(0)) { return; } uint32 prevAggregatorRoundId = _aggregatorRoundId - 1; int256 prevAggregatorRoundAnswer = s_transmissions[prevAggregatorRoundId].answer; // We do not want the validator to ever prevent reporting, so we limit its // gas usage and catch any errors that may arise. try vc.validator.validate{gas: vc.gasLimit}( prevAggregatorRoundId, prevAggregatorRoundAnswer, _aggregatorRoundId, _answer ) {} catch {} } /* * requestNewRound logic */ AccessControllerInterface internal s_requesterAccessController; /** * @notice emitted when a new requester access controller contract is set * @param old the address prior to the current setting * @param current the address of the new access controller contract */ event RequesterAccessControllerSet(AccessControllerInterface old, AccessControllerInterface current); /** * @notice emitted to immediately request a new round * @param requester the address of the requester * @param configDigest the latest transmission's configDigest * @param epoch the latest transmission's epoch * @param round the latest transmission's round */ event RoundRequested(address indexed requester, bytes16 configDigest, uint32 epoch, uint8 round); /** * @notice address of the requester access controller contract * @return requester access controller address */ function requesterAccessController() external view returns (AccessControllerInterface) { return s_requesterAccessController; } /** * @notice sets the requester access controller * @param _requesterAccessController designates the address of the new requester access controller */ function setRequesterAccessController(AccessControllerInterface _requesterAccessController) public onlyOwner() { AccessControllerInterface oldController = s_requesterAccessController; if (_requesterAccessController != oldController) { s_requesterAccessController = AccessControllerInterface(_requesterAccessController); emit RequesterAccessControllerSet(oldController, _requesterAccessController); } } /** * @notice immediately requests a new round * @return the aggregatorRoundId of the next round. Note: The report for this round may have been * transmitted (but not yet mined) *before* requestNewRound() was even called. There is *no* * guarantee of causality between the request and the report at aggregatorRoundId. */ function requestNewRound() external returns (uint80) { require(msg.sender == owner || s_requesterAccessController.hasAccess(msg.sender, msg.data), "Only owner&requester can call"); HotVars memory hotVars = s_hotVars; emit RoundRequested( msg.sender, hotVars.latestConfigDigest, uint32(s_hotVars.latestEpochAndRound >> 8), uint8(s_hotVars.latestEpochAndRound) ); return hotVars.latestAggregatorRoundId + 1; } /* * Transmission logic */ /** * @notice indicates that a new report was transmitted * @param aggregatorRoundId the round to which this report was assigned * @param answer median of the observations attached this report * @param transmitter address from which the report was transmitted * @param observations observations transmitted with this report * @param rawReportContext signature-replay-prevention domain-separation tag */ event NewTransmission( uint32 indexed aggregatorRoundId, int192 answer, address transmitter, int192[] observations, bytes observers, bytes32 rawReportContext ); // decodeReport is used to check that the solidity and go code are using the // same format. See TestOffchainAggregator.testDecodeReport and TestReportParsing function decodeReport(bytes memory _report) internal pure returns ( bytes32 rawReportContext, bytes32 rawObservers, int192[] memory observations ) { (rawReportContext, rawObservers, observations) = abi.decode(_report, (bytes32, bytes32, int192[])); } // Used to relieve stack pressure in transmit struct ReportData { HotVars hotVars; // Only read from storage once bytes observers; // ith element is the index of the ith observer int192[] observations; // ith element is the ith observation bytes vs; // jth element is the v component of the jth signature bytes32 rawReportContext; } /* * @notice details about the most recent report * @return configDigest domain separation tag for the latest report * @return epoch epoch in which the latest report was generated * @return round OCR round in which the latest report was generated * @return latestAnswer median value from latest report * @return latestTimestamp when the latest report was transmitted */ function latestTransmissionDetails() external view returns ( bytes16 configDigest, uint32 epoch, uint8 round, int192 latestAnswer, uint64 latestTimestamp ) { require(msg.sender == tx.origin, "Only callable by EOA"); return ( s_hotVars.latestConfigDigest, uint32(s_hotVars.latestEpochAndRound >> 8), uint8(s_hotVars.latestEpochAndRound), s_transmissions[s_hotVars.latestAggregatorRoundId].answer, s_transmissions[s_hotVars.latestAggregatorRoundId].timestamp ); } // The constant-length components of the msg.data sent to transmit. // See the "If we wanted to call sam" example on for example reasoning // https://solidity.readthedocs.io/en/v0.7.2/abi-spec.html uint16 private constant TRANSMIT_MSGDATA_CONSTANT_LENGTH_COMPONENT = 4 + // function selector 32 + // word containing start location of abiencoded _report value 32 + // word containing location start of abiencoded _rs value 32 + // word containing start location of abiencoded _ss value 32 + // _rawVs value 32 + // word containing length of _report 32 + // word containing length _rs 32 + // word containing length of _ss 0; // placeholder function expectedMsgDataLength( bytes calldata _report, bytes32[] calldata _rs, bytes32[] calldata _ss ) private pure returns (uint256 length) { // calldata will never be big enough to make this overflow return uint256(TRANSMIT_MSGDATA_CONSTANT_LENGTH_COMPONENT) + _report.length + // one byte pure entry in _report _rs.length * 32 + // 32 bytes per entry in _rs _ss.length * 32 + // 32 bytes per entry in _ss 0; // placeholder } /** * @notice transmit is called to post a new report to the contract * @param _report serialized report, which the signatures are signing. See parsing code below for format. The ith element of the observers component must be the index in s_signers of the address for the ith signature * @param _rs ith element is the R components of the ith signature on report. Must have at most maxNumOracles entries * @param _ss ith element is the S components of the ith signature on report. Must have at most maxNumOracles entries * @param _rawVs ith element is the the V component of the ith signature */ function transmit( // NOTE: If these parameters are changed, expectedMsgDataLength and/or // TRANSMIT_MSGDATA_CONSTANT_LENGTH_COMPONENT need to be changed accordingly bytes calldata _report, bytes32[] calldata _rs, bytes32[] calldata _ss, bytes32 _rawVs // signatures ) external { uint256 initialGas = gasleft(); // This line must come first // Make sure the transmit message-length matches the inputs. Otherwise, the // transmitter could append an arbitrarily long (up to gas-block limit) // string of 0 bytes, which we would reimburse at a rate of 16 gas/byte, but // which would only cost the transmitter 4 gas/byte. (Appendix G of the // yellow paper, p. 25, for G_txdatazero and EIP 2028 for G_txdatanonzero.) // This could amount to reimbursement profit of 36 million gas, given a 3MB // zero tail. require(msg.data.length == expectedMsgDataLength(_report, _rs, _ss), "transmit message too long"); ReportData memory r; // Relieves stack pressure { r.hotVars = s_hotVars; // cache read from storage bytes32 rawObservers; (r.rawReportContext, rawObservers, r.observations) = abi.decode( _report, (bytes32, bytes32, int192[]) ); // rawReportContext consists of: // 11-byte zero padding // 16-byte configDigest // 4-byte epoch // 1-byte round bytes16 configDigest = bytes16(r.rawReportContext << 88); require( r.hotVars.latestConfigDigest == configDigest, "configDigest mismatch" ); uint40 epochAndRound = uint40(uint256(r.rawReportContext)); // direct numerical comparison works here, because // // ((e,r) <= (e',r')) implies (epochAndRound <= epochAndRound') // // because alphabetic ordering implies e <= e', and if e = e', then r<=r', // so e*256+r <= e'*256+r', because r, r' < 256 require(r.hotVars.latestEpochAndRound < epochAndRound, "stale report"); require(_rs.length > r.hotVars.threshold, "not enough signatures"); require(_rs.length <= maxNumOracles, "too many signatures"); require(_ss.length == _rs.length, "signatures out of registration"); require(r.observations.length <= maxNumOracles, "num observations out of bounds"); require(r.observations.length > 2 * r.hotVars.threshold, "too few values to trust median"); // Copy signature parities in bytes32 _rawVs to bytes r.v r.vs = new bytes(_rs.length); for (uint8 i = 0; i < _rs.length; i++) { r.vs[i] = _rawVs[i]; } // Copy observer identities in bytes32 rawObservers to bytes r.observers r.observers = new bytes(r.observations.length); bool[maxNumOracles] memory seen; for (uint8 i = 0; i < r.observations.length; i++) { uint8 observerIdx = uint8(rawObservers[i]); require(!seen[observerIdx], "observer index repeated"); seen[observerIdx] = true; r.observers[i] = rawObservers[i]; } Oracle memory transmitter = s_oracles[msg.sender]; require( // Check that sender is authorized to report transmitter.role == Role.Transmitter && msg.sender == s_transmitters[transmitter.index], "unauthorized transmitter" ); // record epochAndRound here, so that we don't have to carry the local // variable in transmit. The change is reverted if something fails later. r.hotVars.latestEpochAndRound = epochAndRound; } { // Verify signatures attached to report bytes32 h = keccak256(_report); bool[maxNumOracles] memory signed; Oracle memory o; for (uint i = 0; i < _rs.length; i++) { address signer = ecrecover(h, uint8(r.vs[i])+27, _rs[i], _ss[i]); o = s_oracles[signer]; require(o.role == Role.Signer, "address not authorized to sign"); require(!signed[o.index], "non-unique signature"); signed[o.index] = true; } } { // Check the report contents, and record the result for (uint i = 0; i < r.observations.length - 1; i++) { bool inOrder = r.observations[i] <= r.observations[i+1]; require(inOrder, "observations not sorted"); } int192 median = r.observations[r.observations.length/2]; require(minAnswer <= median && median <= maxAnswer, "median is out of min-max range"); r.hotVars.latestAggregatorRoundId++; s_transmissions[r.hotVars.latestAggregatorRoundId] = Transmission(median, uint64(block.timestamp)); emit NewTransmission( r.hotVars.latestAggregatorRoundId, median, msg.sender, r.observations, r.observers, r.rawReportContext ); // Emit these for backwards compatability with offchain consumers // that only support legacy events emit NewRound( r.hotVars.latestAggregatorRoundId, address(0x0), // use zero address since we don't have anybody "starting" the round here block.timestamp ); emit AnswerUpdated( median, r.hotVars.latestAggregatorRoundId, block.timestamp ); validateAnswer(r.hotVars.latestAggregatorRoundId, median); } s_hotVars = r.hotVars; assert(initialGas < maxUint32); reimburseAndRewardOracles(uint32(initialGas), r.observers); } /* * v2 Aggregator interface */ /** * @notice median from the most recent report */ function latestAnswer() public override view virtual returns (int256) { return s_transmissions[s_hotVars.latestAggregatorRoundId].answer; } /** * @notice timestamp of block in which last report was transmitted */ function latestTimestamp() public override view virtual returns (uint256) { return s_transmissions[s_hotVars.latestAggregatorRoundId].timestamp; } /** * @notice Aggregator round (NOT OCR round) in which last report was transmitted */ function latestRound() public override view virtual returns (uint256) { return s_hotVars.latestAggregatorRoundId; } /** * @notice median of report from given aggregator round (NOT OCR round) * @param _roundId the aggregator round of the target report */ function getAnswer(uint256 _roundId) public override view virtual returns (int256) { if (_roundId > 0xFFFFFFFF) { return 0; } return s_transmissions[uint32(_roundId)].answer; } /** * @notice timestamp of block in which report from given aggregator round was transmitted * @param _roundId aggregator round (NOT OCR round) of target report */ function getTimestamp(uint256 _roundId) public override view virtual returns (uint256) { if (_roundId > 0xFFFFFFFF) { return 0; } return s_transmissions[uint32(_roundId)].timestamp; } /* * v3 Aggregator interface */ string constant private V3_NO_DATA_ERROR = "No data present"; /** * @return answers are stored in fixed-point format, with this many digits of precision */ uint8 immutable public override decimals; /** * @notice aggregator contract version */ uint256 constant public override version = 4; string internal s_description; /** * @notice human-readable description of observable this contract is reporting on */ function description() public override view virtual returns (string memory) { return s_description; } /** * @notice details for the given aggregator round * @param _roundId target aggregator round (NOT OCR round). Must fit in uint32 * @return roundId _roundId * @return answer median of report from given _roundId * @return startedAt timestamp of block in which report from given _roundId was transmitted * @return updatedAt timestamp of block in which report from given _roundId was transmitted * @return answeredInRound _roundId */ function getRoundData(uint80 _roundId) public override view virtual returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ) { require(_roundId <= 0xFFFFFFFF, V3_NO_DATA_ERROR); Transmission memory transmission = s_transmissions[uint32(_roundId)]; return ( _roundId, transmission.answer, transmission.timestamp, transmission.timestamp, _roundId ); } /** * @notice aggregator details for the most recently transmitted report * @return roundId aggregator round of latest report (NOT OCR round) * @return answer median of latest report * @return startedAt timestamp of block containing latest report * @return updatedAt timestamp of block containing latest report * @return answeredInRound aggregator round of latest report */ function latestRoundData() public override view virtual returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ) { roundId = s_hotVars.latestAggregatorRoundId; // Skipped for compatability with existing FluxAggregator in which latestRoundData never reverts. // require(roundId != 0, V3_NO_DATA_ERROR); Transmission memory transmission = s_transmissions[uint32(roundId)]; return ( roundId, transmission.answer, transmission.timestamp, transmission.timestamp, roundId ); } } // File contracts/ethereum/v0.7/src/SimpleWriteAccessController.sol pragma solidity ^0.7.0; /** * @title SimpleWriteAccessController * @notice Gives access to accounts explicitly added to an access list by the * controller's owner. * @dev does not make any special permissions for externally, see * SimpleReadAccessController for that. */ contract SimpleWriteAccessController is AccessControllerInterface, Owned { bool public checkEnabled; mapping(address => bool) internal accessList; event AddedAccess(address user); event RemovedAccess(address user); event CheckAccessEnabled(); event CheckAccessDisabled(); constructor() { checkEnabled = true; } /** * @notice Returns the access of an address * @param _user The address to query */ function hasAccess( address _user, bytes memory ) public view virtual override returns (bool) { return accessList[_user] || !checkEnabled; } /** * @notice Adds an address to the access list * @param _user The address to add */ function addAccess(address _user) external onlyOwner() { addAccessInternal(_user); } function addAccessInternal(address _user) internal { if (!accessList[_user]) { accessList[_user] = true; emit AddedAccess(_user); } } /** * @notice Removes an address from the access list * @param _user The address to remove */ function removeAccess(address _user) external onlyOwner() { if (accessList[_user]) { accessList[_user] = false; emit RemovedAccess(_user); } } /** * @notice makes the access check enforced */ function enableAccessCheck() external onlyOwner() { if (!checkEnabled) { checkEnabled = true; emit CheckAccessEnabled(); } } /** * @notice makes the access check unenforced */ function disableAccessCheck() external onlyOwner() { if (checkEnabled) { checkEnabled = false; emit CheckAccessDisabled(); } } /** * @dev reverts if the caller does not have access */ modifier checkAccess() { require(hasAccess(msg.sender, msg.data), "No access"); _; } } // File contracts/ethereum/v0.7/src/SimpleReadAccessController.sol pragma solidity ^0.7.1; /** * @title SimpleReadAccessController * @notice Gives access to: * - any externally owned account (note that offchain actors can always read * any contract storage regardless of onchain access control measures, so this * does not weaken the access control while improving usability) * - accounts explicitly added to an access list * @dev SimpleReadAccessController is not suitable for access controlling writes * since it grants any externally owned account access! See * SimpleWriteAccessController for that. */ contract SimpleReadAccessController is SimpleWriteAccessController { /** * @notice Returns the access of an address * @param _user The address to query */ function hasAccess( address _user, bytes memory _calldata ) public view virtual override returns (bool) { return super.hasAccess(_user, _calldata) || _user == tx.origin; } } // File contracts/ethereum/v0.7/src/AccessControlledOffchainAggregator.sol pragma solidity ^0.7.1; /** * @notice Wrapper of OffchainAggregator which checks read access on Aggregator-interface methods */ contract AccessControlledOffchainAggregator is OffchainAggregator, SimpleReadAccessController { constructor( uint32 _maximumGasPrice, uint32 _reasonableGasPrice, uint32 _microLinkPerEth, uint32 _linkGweiPerObservation, uint32 _linkGweiPerTransmission, LinkTokenInterface _link, int192 _minAnswer, int192 _maxAnswer, AccessControllerInterface _billingAccessController, AccessControllerInterface _requesterAccessController, uint8 _decimals, string memory description ) OffchainAggregator( _maximumGasPrice, _reasonableGasPrice, _microLinkPerEth, _linkGweiPerObservation, _linkGweiPerTransmission, _link, _minAnswer, _maxAnswer, _billingAccessController, _requesterAccessController, _decimals, description ) { } /* * Versioning */ function typeAndVersion() external override pure virtual returns (string memory) { return "AccessControlledOffchainAggregator 3.0.0"; } /* * v2 Aggregator interface */ /// @inheritdoc OffchainAggregator function latestAnswer() public override view checkAccess() returns (int256) { return super.latestAnswer(); } /// @inheritdoc OffchainAggregator function latestTimestamp() public override view checkAccess() returns (uint256) { return super.latestTimestamp(); } /// @inheritdoc OffchainAggregator function latestRound() public override view checkAccess() returns (uint256) { return super.latestRound(); } /// @inheritdoc OffchainAggregator function getAnswer(uint256 _roundId) public override view checkAccess() returns (int256) { return super.getAnswer(_roundId); } /// @inheritdoc OffchainAggregator function getTimestamp(uint256 _roundId) public override view checkAccess() returns (uint256) { return super.getTimestamp(_roundId); } /* * v3 Aggregator interface */ /// @inheritdoc OffchainAggregator function description() public override view checkAccess() returns (string memory) { return super.description(); } /// @inheritdoc OffchainAggregator function getRoundData(uint80 _roundId) public override view checkAccess() returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ) { return super.getRoundData(_roundId); } /// @inheritdoc OffchainAggregator function latestRoundData() public override view checkAccess() returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ) { return super.latestRoundData(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint32","name":"_maximumGasPrice","type":"uint32"},{"internalType":"uint32","name":"_reasonableGasPrice","type":"uint32"},{"internalType":"uint32","name":"_microLinkPerEth","type":"uint32"},{"internalType":"uint32","name":"_linkGweiPerObservation","type":"uint32"},{"internalType":"uint32","name":"_linkGweiPerTransmission","type":"uint32"},{"internalType":"contract LinkTokenInterface","name":"_link","type":"address"},{"internalType":"int192","name":"_minAnswer","type":"int192"},{"internalType":"int192","name":"_maxAnswer","type":"int192"},{"internalType":"contract AccessControllerInterface","name":"_billingAccessController","type":"address"},{"internalType":"contract AccessControllerInterface","name":"_requesterAccessController","type":"address"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"string","name":"description","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"AddedAccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"current","type":"int256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatedAt","type":"uint256"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract AccessControllerInterface","name":"old","type":"address"},{"indexed":false,"internalType":"contract AccessControllerInterface","name":"current","type":"address"}],"name":"BillingAccessControllerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"maximumGasPrice","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"reasonableGasPrice","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"microLinkPerEth","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"linkGweiPerObservation","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"linkGweiPerTransmission","type":"uint32"}],"name":"BillingSet","type":"event"},{"anonymous":false,"inputs":[],"name":"CheckAccessDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"CheckAccessEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"previousConfigBlockNumber","type":"uint32"},{"indexed":false,"internalType":"uint64","name":"configCount","type":"uint64"},{"indexed":false,"internalType":"address[]","name":"signers","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"transmitters","type":"address[]"},{"indexed":false,"internalType":"uint8","name":"threshold","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"encodedConfigVersion","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"encoded","type":"bytes"}],"name":"ConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract LinkTokenInterface","name":"_oldLinkToken","type":"address"},{"indexed":true,"internalType":"contract LinkTokenInterface","name":"_newLinkToken","type":"address"}],"name":"LinkTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"address","name":"startedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"startedAt","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"aggregatorRoundId","type":"uint32"},{"indexed":false,"internalType":"int192","name":"answer","type":"int192"},{"indexed":false,"internalType":"address","name":"transmitter","type":"address"},{"indexed":false,"internalType":"int192[]","name":"observations","type":"int192[]"},{"indexed":false,"internalType":"bytes","name":"observers","type":"bytes"},{"indexed":false,"internalType":"bytes32","name":"rawReportContext","type":"bytes32"}],"name":"NewTransmission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"},{"indexed":true,"internalType":"address","name":"payee","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"contract LinkTokenInterface","name":"linkToken","type":"address"}],"name":"OraclePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"},{"indexed":true,"internalType":"address","name":"current","type":"address"},{"indexed":true,"internalType":"address","name":"proposed","type":"address"}],"name":"PayeeshipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"},{"indexed":true,"internalType":"address","name":"previous","type":"address"},{"indexed":true,"internalType":"address","name":"current","type":"address"}],"name":"PayeeshipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"RemovedAccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract AccessControllerInterface","name":"old","type":"address"},{"indexed":false,"internalType":"contract AccessControllerInterface","name":"current","type":"address"}],"name":"RequesterAccessControllerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"bytes16","name":"configDigest","type":"bytes16"},{"indexed":false,"internalType":"uint32","name":"epoch","type":"uint32"},{"indexed":false,"internalType":"uint8","name":"round","type":"uint8"}],"name":"RoundRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract AggregatorValidatorInterface","name":"previousValidator","type":"address"},{"indexed":false,"internalType":"uint32","name":"previousGasLimit","type":"uint32"},{"indexed":true,"internalType":"contract AggregatorValidatorInterface","name":"currentValidator","type":"address"},{"indexed":false,"internalType":"uint32","name":"currentGasLimit","type":"uint32"}],"name":"ValidatorConfigSet","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_transmitter","type":"address"}],"name":"acceptPayeeship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"addAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"billingAccessController","outputs":[{"internalType":"contract AccessControllerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAccessCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAccessCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBilling","outputs":[{"internalType":"uint32","name":"maximumGasPrice","type":"uint32"},{"internalType":"uint32","name":"reasonableGasPrice","type":"uint32"},{"internalType":"uint32","name":"microLinkPerEth","type":"uint32"},{"internalType":"uint32","name":"linkGweiPerObservation","type":"uint32"},{"internalType":"uint32","name":"linkGweiPerTransmission","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLinkToken","outputs":[{"internalType":"contract LinkTokenInterface","name":"linkToken","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"hasAccess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestConfigDetails","outputs":[{"internalType":"uint32","name":"configCount","type":"uint32"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes16","name":"configDigest","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTransmissionDetails","outputs":[{"internalType":"bytes16","name":"configDigest","type":"bytes16"},{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint8","name":"round","type":"uint8"},{"internalType":"int192","name":"latestAnswer","type":"int192"},{"internalType":"uint64","name":"latestTimestamp","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linkAvailableForPayment","outputs":[{"internalType":"int256","name":"availableBalance","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAnswer","outputs":[{"internalType":"int192","name":"","type":"int192"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAnswer","outputs":[{"internalType":"int192","name":"","type":"int192"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signerOrTransmitter","type":"address"}],"name":"oracleObservationCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_transmitter","type":"address"}],"name":"owedPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestNewRound","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requesterAccessController","outputs":[{"internalType":"contract AccessControllerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_maximumGasPrice","type":"uint32"},{"internalType":"uint32","name":"_reasonableGasPrice","type":"uint32"},{"internalType":"uint32","name":"_microLinkPerEth","type":"uint32"},{"internalType":"uint32","name":"_linkGweiPerObservation","type":"uint32"},{"internalType":"uint32","name":"_linkGweiPerTransmission","type":"uint32"}],"name":"setBilling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract AccessControllerInterface","name":"_billingAccessController","type":"address"}],"name":"setBillingAccessController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"address[]","name":"_transmitters","type":"address[]"},{"internalType":"uint8","name":"_threshold","type":"uint8"},{"internalType":"uint64","name":"_encodedConfigVersion","type":"uint64"},{"internalType":"bytes","name":"_encoded","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract LinkTokenInterface","name":"_linkToken","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"setLinkToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_transmitters","type":"address[]"},{"internalType":"address[]","name":"_payees","type":"address[]"}],"name":"setPayees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract AccessControllerInterface","name":"_requesterAccessController","type":"address"}],"name":"setRequesterAccessController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract AggregatorValidatorInterface","name":"_newValidator","type":"address"},{"internalType":"uint32","name":"_newGasLimit","type":"uint32"}],"name":"setValidatorConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_transmitter","type":"address"},{"internalType":"address","name":"_proposed","type":"address"}],"name":"transferPayeeship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_report","type":"bytes"},{"internalType":"bytes32[]","name":"_rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_ss","type":"bytes32[]"},{"internalType":"bytes32","name":"_rawVs","type":"bytes32"}],"name":"transmit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transmitters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeAndVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"validatorConfig","outputs":[{"internalType":"contract AggregatorValidatorInterface","name":"validator","type":"address"},{"internalType":"uint32","name":"gasLimit","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_transmitter","type":"address"}],"name":"withdrawPayment","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b506040516200590a3803806200590a83398181016040526101808110156200003857600080fd5b815160208301516040808501516060860151608087015160a088015160c089015160e08a01516101008b01516101208c01516101408d01516101608e0180519a519c9e9b9d999c989b979a969995989497939692959194939182019284640100000000821115620000a857600080fd5b908301906020820185811115620000be57600080fd5b8251640100000000811182820188101715620000d957600080fd5b82525081516020918201929091019080838360005b8381101562000108578181015183820152602001620000ee565b50505050905090810190601f168015620001365780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b03191633179055508b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b89620001718787878787620002ef565b600380546001600160a01b0319166001600160a01b0384169081179091556040516000907f4966a50c93f855342ccf6c5c0d358b85b91335b2acedc7da0932f691f351711a908290a3620001c581620003e1565b620001cf62000678565b620001d962000678565b60005b601f8160ff16101562000229576001838260ff16601f8110620001fb57fe5b61ffff909216602092909202015260018260ff8316601f81106200021b57fe5b6020020152600101620001dc565b5062000239600583601f62000697565b5062000249600982601f62000734565b505050505060f887901b7fff000000000000000000000000000000000000000000000000000000000000001660c052505083516200029293506030925060208501915062000765565b506200029e836200045a565b620002ab60008062000532565b50505050601791820b820b604090811b60805290820b90910b901b60a05250506031805460ff1916600117905550620007fe9e505050505050505050505050505050565b6040805160a0808201835263ffffffff88811680845288821660208086018290528984168688018190528985166060808901829052958a1660809889018190526002805463ffffffff1916871763ffffffff60201b191664010000000087021763ffffffff60401b19166801000000000000000085021763ffffffff60601b19166c0100000000000000000000000084021763ffffffff60801b1916600160801b830217905589519586529285019390935283880152928201529283015291517fd0d9486a2c673e2a4b57fc82e4c8a556b3e2b82dd5db07e2c04a920ca0f469b6929181900390910190a15050505050565b6004546001600160a01b0390811690821681146200045657600480546001600160a01b0319166001600160a01b03848116918217909255604080519284168352602083019190915280517f793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d489129281900390910190a15b5050565b6000546001600160a01b03163314620004ba576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b602f546001600160a01b0390811690821681146200045657602f80546001600160a01b0319166001600160a01b03848116918217909255604080519284168352602083019190915280517f27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae6349281900390910190a15050565b6000546001600160a01b0316331462000592576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60408051808201909152602e546001600160a01b03808216808452600160a01b90920463ffffffff1660208401528416141580620005e057508163ffffffff16816020015163ffffffff1614155b1562000673576040805180820182526001600160a01b0385811680835263ffffffff8681166020948501819052602e80546001600160a01b031916841763ffffffff60a01b1916600160a01b8302179055865187860151875193168352948201528451919493909216927fb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541928290030190a35b505050565b604051806103e00160405280601f906020820280368337509192915050565b600283019183908215620007225791602002820160005b83821115620006f057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302620006ae565b8015620007205782816101000a81549061ffff0219169055600201602081600101049283019260010302620006f0565b505b5062000730929150620007e7565b5090565b82601f810192821562000722579160200282015b828111156200072257825182559160200191906001019062000748565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200079d576000855562000722565b82601f10620007b857805160ff191683800117855562000722565b828001600101855582156200072257918201828111156200072257825182559160200191906001019062000748565b5b80821115620007305760008155600101620007e8565b60805160401c60a05160401c60c05160f81c6150cc6200083e60003980610e5e5250806119e052806133b7525080610dd9528061338a52506150cc6000f3fe608060405234801561001057600080fd5b506004361061024a5760003560e01c80638e0566de1161013c578063c1075329116100be578063c107532914610966578063c980753914610992578063d09dc33914610aa0578063dc7f012414610aa8578063e4902f8214610ab0578063e5fe457714610aed578063e76d516814610b3e578063eb45716314610b46578063eb5dcd6c14610b78578063f2fde38b14610ba6578063fbffd2c114610bcc578063feaf968c14610bf25761024a565b80638e0566de146106f157806398e5b12a14610721578063996e8298146107455780639a6fc8f51461074d5780639c849b30146107b75780639e3ceeab14610875578063a118f2491461089b578063b121e147146108c1578063b5ab58dc146108e7578063b633620c14610904578063bd824706146109215761024a565b80636b14daf8116101d05780636b14daf8146104f857806370da2f67146105c057806370efdf2d146105c85780637284e416146105ec57806379ba5097146105f45780638038e4a1146105fc578063814118341461060457806381ff70481461065c5780638205bf6a146106955780638823da6c1461069d5780638ac28d5a146106c35780638da5cb5b146106e95761024a565b80630a7569831461024f5780630eafb25b14610259578063181f5a771461029157806322adbc781461030e578063299372681461032d578063313ce5671461036e5780634fb174701461038c57806350d25bcd146103ba57806354fd4d50146103c2578063585aa7de146103ca578063668a0f02146104f0575b600080fd5b610257610bfa565b005b61027f6004803603602081101561026f57600080fd5b50356001600160a01b0316610c88565b60408051918252519081900360200190f35b610299610db7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d35781810151838201526020016102bb565b50505050905090810190601f1680156103005780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610316610dd7565b6040805160179290920b8252519081900360200190f35b610335610dfb565b6040805163ffffffff96871681529486166020860152928516848401529084166060840152909216608082015290519081900360a00190f35b610376610e5c565b6040805160ff9092168252519081900360200190f35b610257600480360360408110156103a257600080fd5b506001600160a01b0381358116916020013516610e80565b61027f611108565b61027f611195565b610257600480360360a08110156103e057600080fd5b810190602081018135600160201b8111156103fa57600080fd5b82018360208201111561040c57600080fd5b803590602001918460208302840111600160201b8311171561042d57600080fd5b919390929091602081019035600160201b81111561044a57600080fd5b82018360208201111561045c57600080fd5b803590602001918460208302840111600160201b8311171561047d57600080fd5b9193909260ff833516926001600160401b03602082013516929190606081019060400135600160201b8111156104b257600080fd5b8201836020820111156104c457600080fd5b803590602001918460018302840111600160201b831117156104e557600080fd5b50909250905061119a565b61027f61192e565b6105ac6004803603604081101561050e57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561053857600080fd5b82018360208201111561054a57600080fd5b803590602001918460018302840111600160201b8311171561056b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506119b6945050505050565b604080519115158252519081900360200190f35b6103166119de565b6105d0611a02565b604080516001600160a01b039092168252519081900360200190f35b610299611a11565b610257611a99565b610257611b48565b61060c611bd7565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610648578181015183820152602001610630565b505050509050019250505060405180910390f35b610664611c39565b6040805163ffffffff94851681529290931660208301526001600160801b0319168183015290519081900360600190f35b61027f611c59565b610257600480360360208110156106b357600080fd5b50356001600160a01b0316611ce1565b610257600480360360208110156106d957600080fd5b50356001600160a01b0316611da8565b6105d0611e19565b6106f9611e28565b604080516001600160a01b03909316835263ffffffff90911660208301528051918290030190f35b610729611e5b565b604080516001600160501b039092168252519081900360200190f35b6105d061202e565b6107736004803603602081101561076357600080fd5b50356001600160501b031661203d565b60405180866001600160501b03168152602001858152602001848152602001838152602001826001600160501b031681526020019550505050505060405180910390f35b610257600480360360408110156107cd57600080fd5b810190602081018135600160201b8111156107e757600080fd5b8201836020820111156107f957600080fd5b803590602001918460208302840111600160201b8311171561081a57600080fd5b919390929091602081019035600160201b81111561083757600080fd5b82018360208201111561084957600080fd5b803590602001918460208302840111600160201b8311171561086a57600080fd5b5090925090506120de565b6102576004803603602081101561088b57600080fd5b50356001600160a01b03166122e1565b610257600480360360208110156108b157600080fd5b50356001600160a01b03166123a5565b610257600480360360208110156108d757600080fd5b50356001600160a01b03166123fb565b61027f600480360360208110156108fd57600080fd5b50356124dc565b61027f6004803603602081101561091a57600080fd5b5035612565565b610257600480360360a081101561093757600080fd5b5063ffffffff8135811691602081013582169160408201358116916060810135821691608090910135166125ee565b6102576004803603604081101561097c57600080fd5b506001600160a01b03813516906020013561271d565b610257600480360360808110156109a857600080fd5b810190602081018135600160201b8111156109c257600080fd5b8201836020820111156109d457600080fd5b803590602001918460018302840111600160201b831117156109f557600080fd5b919390929091602081019035600160201b811115610a1257600080fd5b820183602082011115610a2457600080fd5b803590602001918460208302840111600160201b83111715610a4557600080fd5b919390929091602081019035600160201b811115610a6257600080fd5b820183602082011115610a7457600080fd5b803590602001918460208302840111600160201b83111715610a9557600080fd5b9193509150356129e0565b61027f613719565b6105ac6137aa565b610ad660048036036020811015610ac657600080fd5b50356001600160a01b03166137b3565b6040805161ffff9092168252519081900360200190f35b610af5613860565b604080516001600160801b0319909616865263ffffffff909416602086015260ff9092168484015260170b60608401526001600160401b03166080830152519081900360a00190f35b6105d0613910565b61025760048036036040811015610b5c57600080fd5b5080356001600160a01b0316906020013563ffffffff1661391f565b61025760048036036040811015610b8e57600080fd5b506001600160a01b0381358116916020013516613a50565b61025760048036036020811015610bbc57600080fd5b50356001600160a01b0316613b8d565b61025760048036036020811015610be257600080fd5b50356001600160a01b0316613c2b565b610773613c81565b6000546001600160a01b03163314610c47576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b60315460ff1615610c86576031805460ff191690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a15b565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff808216845285948401916101009004166002811115610cca57fe5b6002811115610cd557fe5b9052509050600081602001516002811115610cec57fe5b1415610cfc576000915050610db2565b6040805160a08101825260025463ffffffff8082168352600160201b820481166020840152600160401b8204811693830193909352600160601b8104831660608301819052600160801b90910490921660808201528251909160009160019060059060ff16601f8110610d6b57fe5b601091828204019190066002029054906101000a900461ffff160361ffff1602633b9aca0002905060016009846000015160ff16601f8110610da957fe5b01540301925050505b919050565b606060405180606001604052806028815260200161502b60289139905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040805160a08101825260025463ffffffff808216808452600160201b8304821660208501819052600160401b84048316958501869052600160601b8404831660608601819052600160801b90940490921660809094018490529490939290565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314610ecd576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b6003546001600160a01b03908116908316811415610eeb5750611104565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015610f3157600080fd5b505afa158015610f45573d6000803e3d6000fd5b505050506040513d6020811015610f5b57600080fd5b50610f669050613d20565b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fb557600080fd5b505afa158015610fc9573d6000803e3d6000fd5b505050506040513d6020811015610fdf57600080fd5b50516040805163a9059cbb60e01b81526001600160a01b0386811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b15801561103757600080fd5b505af115801561104b573d6000803e3d6000fd5b505050506040513d602081101561106157600080fd5b50516110b4576040805162461bcd60e51b815260206004820152601f60248201527f7472616e736665722072656d61696e696e672066756e6473206661696c656400604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0386811691821790925560405190918416907f4966a50c93f855342ccf6c5c0d358b85b91335b2acedc7da0932f691f351711a90600090a350505b5050565b600061114b336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b611188576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6111906140a9565b905090565b600481565b868560ff8616601f8311156111e9576040805162461bcd60e51b815260206004820152601060248201526f746f6f206d616e79207369676e65727360801b604482015290519081900360640190fd5b6000811161123b576040805162461bcd60e51b815260206004820152601a6024820152797468726573686f6c64206d75737420626520706f73697469766560301b604482015290519081900360640190fd5b8183146112795760405162461bcd60e51b81526004018080602001828103825260248152602001806150536024913960400191505060405180910390fd5b8060030283116112d0576040805162461bcd60e51b815260206004820181905260248201527f6661756c74792d6f7261636c65207468726573686f6c6420746f6f2068696768604482015290519081900360640190fd5b6000546001600160a01b0316331461131d576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b6029541561141a57602980546000198101916000918390811061133c57fe5b6000918252602082200154602a80546001600160a01b039092169350908490811061136357fe5b6000918252602090912001546001600160a01b03169050611383816140d2565b6001600160a01b03808316600090815260286020526040808220805461ffff19908116909155928416825290208054909116905560298054806113c257fe5b600082815260209020810160001990810180546001600160a01b0319169055019055602a8054806113ef57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555061131d915050565b60005b8a811015611770576000602860008e8e8581811061143757fe5b602090810292909201356001600160a01b031683525081019190915260400160002054610100900460ff16600281111561146d57fe5b146114b9576040805162461bcd60e51b81526020600482015260176024820152767265706561746564207369676e6572206164647265737360481b604482015290519081900360640190fd5b6040805180820190915260ff8216815260016020820152602860008e8e858181106114e057fe5b602090810292909201356001600160a01b0316835250818101929092526040016000208251815460ff191660ff90911617808255918301519091829061ff00191661010083600281111561153057fe5b02179055506000915060079050818c8c8581811061154a57fe5b6001600160a01b03602091820293909301358316845283019390935260409091016000205416919091141590506115bc576040805162461bcd60e51b81526020600482015260116024820152701c185e5959481b5d5cdd081899481cd95d607a1b604482015290519081900360640190fd5b6000602860008c8c858181106115ce57fe5b602090810292909201356001600160a01b031683525081019190915260400160002054610100900460ff16600281111561160457fe5b14611656576040805162461bcd60e51b815260206004820152601c60248201527f7265706561746564207472616e736d6974746572206164647265737300000000604482015290519081900360640190fd5b6040805180820190915260ff8216815260026020820152602860008c8c8581811061167d57fe5b602090810292909201356001600160a01b0316835250818101929092526040016000208251815460ff191660ff90911617808255918301519091829061ff0019166101008360028111156116cd57fe5b021790555090505060298c8c838181106116e357fe5b835460018101855560009485526020948590200180546001600160a01b0319166001600160a01b039590920293909301359390931692909217905550602a8a8a8381811061172d57fe5b835460018181018655600095865260209586902090910180546001600160a01b0319166001600160a01b039690930294909401359490941617909155500161141d565b50602b805460ff8916600160a81b0260ff60a81b19909116179055602d80544363ffffffff908116600160201b90810263ffffffff60201b19841617808316600101831663ffffffff199091161793849055909104811691166117db30828f8f8f8f8f8f8f8f6142ba565b602b60000160006101000a8154816001600160801b03021916908360801c02179055506000602b60000160106101000a81548164ffffffffff021916908364ffffffffff1602179055507f25d719d88a4512dd76c7442b910a83360845505894eb444ef299409e180f8fb982828f8f8f8f8f8f8f8f604051808b63ffffffff1681526020018a6001600160401b0316815260200180602001806020018760ff168152602001866001600160401b031681526020018060200184810384528c8c82818152602001925060200280828437600083820152601f01601f191690910185810384528a8152602090810191508b908b0280828437600083820152601f01601f191690910185810383528681526020019050868680828437600083820152604051601f909101601f19169092018290039f50909d5050505050505050505050505050a150505050505050505050505050565b6000611971336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b6119ae576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6111906143bc565b60006119c283836143cf565b806119d557506001600160a01b03831632145b90505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b602f546001600160a01b031690565b6060611a54336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b611a91576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6111906143ff565b6001546001600160a01b03163314611af1576040805162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015290519081900360640190fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000546001600160a01b03163314611b95576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b60315460ff16610c86576031805460ff191660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6060602a805480602002602001604051908101604052809291908181526020018280548015611c2f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c11575b5050505050905090565b602d54602b5463ffffffff80831692600160201b9004169060801b909192565b6000611c9c336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b611cd9576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b61119061448c565b6000546001600160a01b03163314611d2e576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526032602052604090205460ff1615611da5576001600160a01b038116600081815260326020908152604091829020805460ff19169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a15b50565b6001600160a01b03818116600090815260076020526040902054163314611e10576040805162461bcd60e51b81526020600482015260176024820152764f6e6c792070617965652063616e20776974686472617760481b604482015290519081900360640190fd5b611da5816140d2565b6000546001600160a01b031681565b60408051808201909152602e546001600160a01b038116808352600160a01b90910463ffffffff16602090920182905291565b600080546001600160a01b0316331480611f1e5750602f5460408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b0390951694636b14daf894929360009391929190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015611ef157600080fd5b505afa158015611f05573d6000803e3d6000fd5b505050506040513d6020811015611f1b57600080fd5b50515b611f6f576040805162461bcd60e51b815260206004820152601d60248201527f4f6e6c79206f776e6572267265717565737465722063616e2063616c6c000000604482015290519081900360640190fd5b6040805160808082018352602b549081901b6001600160801b031916808352600160801b820464ffffffffff8116602080860191909152600160a81b840460ff90811686880152600160b01b90940463ffffffff9081166060808801919091528751948552600884901c909116918401919091529216818501529251919233927f3ea16a923ff4b1df6526e854c9e3a995c43385d70e73359e10623c74f0b52037929181900390910190a2806060015160010163ffffffff1691505090565b6004546001600160a01b031690565b6000806000806000612086336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b6120c3576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6120cc866144be565b939a9299509097509550909350915050565b6000546001600160a01b0316331461212b576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b82811461217f576040805162461bcd60e51b815260206004820181905260248201527f7472616e736d6974746572732e73697a6520213d207061796565732e73697a65604482015290519081900360640190fd5b60005b838110156122da57600085858381811061219857fe5b905060200201356001600160a01b0316905060008484848181106121b857fe5b6001600160a01b0385811660009081526007602090815260409091205492029390930135831693509091169050801580806122045750826001600160a01b0316826001600160a01b0316145b612249576040805162461bcd60e51b81526020600482015260116024820152701c185e595948185b1c9958591e481cd95d607a1b604482015290519081900360640190fd5b6001600160a01b03848116600090815260076020526040902080546001600160a01b031916858316908117909155908316146122ca57826001600160a01b0316826001600160a01b0316856001600160a01b03167f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b360405160405180910390a45b5050600190920191506121829050565b5050505050565b6000546001600160a01b0316331461232e576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b602f546001600160a01b03908116908216811461110457602f80546001600160a01b0319166001600160a01b03848116918217909255604080519284168352602083019190915280517f27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae6349281900390910190a15050565b6000546001600160a01b031633146123f2576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b611da5816145e2565b6001600160a01b03818116600090815260086020526040902054163314612469576040805162461bcd60e51b815260206004820152601f60248201527f6f6e6c792070726f706f736564207061796565732063616e2061636365707400604482015290519081900360640190fd5b6001600160a01b0381811660008181526007602090815260408083208054336001600160a01b031980831682179093556008909452828520805490921690915590519416939092849290917f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b39190a45050565b600061251f336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b61255c576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6119d88261465d565b60006125a8336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b6125e5576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6119d882614693565b6004546000546001600160a01b0391821691163314806126af575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b15801561268257600080fd5b505afa158015612696573d6000803e3d6000fd5b505050506040513d60208110156126ac57600080fd5b50515b612700576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722662696c6c696e6741646d696e2063616e2063616c6c604482015290519081900360640190fd5b612708613d20565b61271586868686866146d2565b505050505050565b6000546001600160a01b03163314806127de57506004805460408051630d629b5f60e31b8152339381018481526024820192835236604483018190526001600160a01b0390941694636b14daf8949093600093919291606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b1580156127b157600080fd5b505afa1580156127c5573d6000803e3d6000fd5b505050506040513d60208110156127db57600080fd5b50515b61282f576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722662696c6c696e6741646d696e2063616e2063616c6c604482015290519081900360640190fd5b60006128396147b5565b600354604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561288a57600080fd5b505afa15801561289e573d6000803e3d6000fd5b505050506040513d60208110156128b457600080fd5b5051905081811015612904576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6003546001600160a01b031663a9059cbb8561292285850387614969565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561296857600080fd5b505af115801561297c573d6000803e3d6000fd5b505050506040513d602081101561299257600080fd5b50516129da576040805162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b50505050565b60005a90506129f3888888888888614980565b3614612a42576040805162461bcd60e51b81526020600482015260196024820152787472616e736d6974206d65737361676520746f6f206c6f6e6760381b604482015290519081900360640190fd5b612a4a614ec0565b6040805160808082018352602b549081901b6001600160801b0319168252600160801b810464ffffffffff166020830152600160a81b810460ff1692820192909252600160b01b90910463ffffffff166060808301919091529082526000908a908a90811015612ab957600080fd5b813591602081013591810190606081016040820135600160201b811115612adf57600080fd5b820183602082011115612af157600080fd5b803590602001918460208302840111600160201b83111715612b1257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060408801525050506080840182905283515190925060589190911b906001600160801b0319808316911614612bb9576040805162461bcd60e51b81526020600482015260156024820152740c6dedcccd2ce88d2cecae6e840dad2e6dac2e8c6d605b1b604482015290519081900360640190fd5b608083015183516020015164ffffffffff808316911610612c10576040805162461bcd60e51b815260206004820152600c60248201526b1cdd185b19481c995c1bdc9d60a21b604482015290519081900360640190fd5b83516040015160ff168911612c64576040805162461bcd60e51b81526020600482015260156024820152746e6f7420656e6f756768207369676e61747572657360581b604482015290519081900360640190fd5b601f891115612cb0576040805162461bcd60e51b8152602060048201526013602482015272746f6f206d616e79207369676e61747572657360681b604482015290519081900360640190fd5b868914612d04576040805162461bcd60e51b815260206004820152601e60248201527f7369676e617475726573206f7574206f6620726567697374726174696f6e0000604482015290519081900360640190fd5b601f8460400151511115612d5f576040805162461bcd60e51b815260206004820152601e60248201527f6e756d206f62736572766174696f6e73206f7574206f6620626f756e64730000604482015290519081900360640190fd5b83600001516040015160020260ff1684604001515111612dc6576040805162461bcd60e51b815260206004820152601e60248201527f746f6f206665772076616c75657320746f207472757374206d656469616e0000604482015290519081900360640190fd5b886001600160401b0381118015612ddc57600080fd5b506040519080825280601f01601f191660200182016040528015612e07576020820181803683370190505b50606085015260005b60ff81168a1115612e6057868160ff1660208110612e2a57fe5b1a60f81b85606001518260ff1681518110612e4157fe5b60200101906001600160f81b031916908160001a905350600101612e10565b508360400151516001600160401b0381118015612e7c57600080fd5b506040519080825280601f01601f191660200182016040528015612ea7576020820181803683370190505b506020850152612eb5614ef4565b60005b8560400151518160ff161015612f9d576000858260ff1660208110612ed957fe5b1a90508281601f8110612ee857fe5b602002015115612f39576040805162461bcd60e51b81526020600482015260176024820152761bd89cd95c9d995c881a5b99195e081c995c19585d1959604a1b604482015290519081900360640190fd5b6001838260ff16601f8110612f4a57fe5b91151560209283029190910152869060ff8416908110612f6657fe5b1a60f81b87602001518360ff1681518110612f7d57fe5b60200101906001600160f81b031916908160001a90535050600101612eb8565b503360009081526028602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115612fdb57fe5b6002811115612fe657fe5b9052509050600281602001516002811115612ffd57fe5b1480156130315750602a816000015160ff168154811061301957fe5b6000918252602090912001546001600160a01b031633145b61307d576040805162461bcd60e51b81526020600482015260186024820152773ab730baba3437b934bd32b2103a3930b739b6b4ba3a32b960411b604482015290519081900360640190fd5b5050835164ffffffffff90911660209091015250506040516000908a908a9080838380828437604051920182900390912094506130be9350614ef492505050565b6130c6614f13565b60005b898110156132b6576000600185876060015184815181106130e657fe5b60209101015160f81c601b018e8e868181106130fe57fe5b905060200201358d8d8781811061311157fe5b9050602002013560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561316c573d6000803e3d6000fd5b505060408051601f198101516001600160a01b03811660009081526028602090815290849020838501909452835460ff808216855292965092945084019161010090041660028111156131bb57fe5b60028111156131c657fe5b90525092506001836020015160028111156131dd57fe5b1461322f576040805162461bcd60e51b815260206004820152601e60248201527f61646472657373206e6f7420617574686f72697a656420746f207369676e0000604482015290519081900360640190fd5b8251849060ff16601f811061324057fe5b60200201511561328e576040805162461bcd60e51b81526020600482015260146024820152736e6f6e2d756e69717565207369676e617475726560601b604482015290519081900360640190fd5b600184846000015160ff16601f81106132a357fe5b91151560209092020152506001016130c9565b5050505060005b600182604001515103811015613361576000826040015182600101815181106132e257fe5b602002602001015160170b836040015183815181106132fd57fe5b602002602001015160170b1315905080613358576040805162461bcd60e51b81526020600482015260176024820152761bd89cd95c9d985d1a5bdb9cc81b9bdd081cdbdc9d1959604a1b604482015290519081900360640190fd5b506001016132bd565b5060408101518051600091906002810490811061337a57fe5b602002602001015190508060170b7f000000000000000000000000000000000000000000000000000000000000000060170b131580156133e057507f000000000000000000000000000000000000000000000000000000000000000060170b8160170b13155b613431576040805162461bcd60e51b815260206004820152601e60248201527f6d656469616e206973206f7574206f66206d696e2d6d61782072616e67650000604482015290519081900360640190fd5b81516060908101805163ffffffff60019091018116909152604080518082018252601785810b8083526001600160401b0342811660208086019182528a5189015188166000908152602c8252878120965187549351909416600160c01b029390950b6001600160c01b039081166001600160c01b03199093169290921790911691909117909355875186015184890151848a01516080808c015188519586523386890181905291860181905260a0988601898152845199870199909952835194909916997ff6a97944f31ea060dfde0566e4167c1a1082551e64b60ecb14d599a9d023d451998c999298949793969095909492939185019260c086019289820192909102908190849084905b8381101561355557818101518382015260200161353d565b50505050905001838103825285818151815260200191508051906020019080838360005b83811015613591578181015183820152602001613579565b50505050905090810190601f1680156135be5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a281516060015160408051428152905160009263ffffffff16917f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271919081900360200190a381600001516060015163ffffffff168160170b7f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f426040518082815260200191505060405180910390a36136738260000151606001518260170b614998565b5080518051602b8054602084015160408501516060909501516001600160801b031990921660809490941c9390931764ffffffffff60801b1916600160801b64ffffffffff909416939093029290921760ff60a81b1916600160a81b60ff909416939093029290921763ffffffff60b01b1916600160b01b63ffffffff9283160217909155821061370057fe5b61370e828260200151614a90565b505050505050505050565b600354604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561376957600080fd5b505afa15801561377d573d6000803e3d6000fd5b505050506040513d602081101561379357600080fd5b5051905060006137a16147b5565b90910391505090565b60315460ff1681565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff8082168452859484019161010090041660028111156137f557fe5b600281111561380057fe5b905250905060008160200151600281111561381757fe5b1415613827576000915050610db2565b60016005826000015160ff16601f811061383d57fe5b601091828204019190066002029054906101000a900461ffff1603915050919050565b6000808080803332146138b1576040805162461bcd60e51b81526020600482015260146024820152734f6e6c792063616c6c61626c6520627920454f4160601b604482015290519081900360640190fd5b5050602b5463ffffffff600160b01b820481166000908152602c6020526040902054608083901b96600160801b909304600881901c909216955064ffffffffff9091169350601781900b9250600160c01b90046001600160401b031690565b6003546001600160a01b031690565b6000546001600160a01b0316331461396c576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b60408051808201909152602e546001600160a01b03808216808452600160a01b90920463ffffffff16602084015284161415806139b957508163ffffffff16816020015163ffffffff1614155b15613a4b576040805180820182526001600160a01b0385811680835263ffffffff8681166020948501819052602e80546001600160a01b031916841763ffffffff60a01b1916600160a01b8302179055865187860151875193168352948201528451919493909216927fb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541928290030190a35b505050565b6001600160a01b03828116600090815260076020526040902054163314613abe576040805162461bcd60e51b815260206004820152601d60248201527f6f6e6c792063757272656e742070617965652063616e20757064617465000000604482015290519081900360640190fd5b336001600160a01b0382161415613b16576040805162461bcd60e51b815260206004820152601760248201527631b0b73737ba103a3930b739b332b9103a379039b2b63360491b604482015290519081900360640190fd5b6001600160a01b03808316600090815260086020526040902080548383166001600160a01b031982168117909255909116908114613a4b576040516001600160a01b038084169133918616907f84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e3836790600090a4505050565b6000546001600160a01b03163314613bda576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000546001600160a01b03163314613c78576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b611da581614cb8565b6000806000806000613cca336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b613d07576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b613d0f614d2f565b945094509450945094509091929394565b6040805160a08101825260025463ffffffff8082168352600160201b820481166020840152600160401b8204811683850152600160601b820481166060840152600160801b90910416608082015260035482516103e081019384905291926001600160a01b0390911691600091600590601f908285855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411613d97575050604080516103e0810191829052959650600095945060099350601f9250905082845b815481526020019060010190808311613df157505050505090506000602a805480602002602001604051908101604052809291908181526020018280548015613e6357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613e45575b5050505050905060005b815181101561408d57600060018483601f8110613e8657fe5b6020020151039050600060018684601f8110613e9e57fe5b60200201510361ffff169050600082896060015163ffffffff168302633b9aca0002019050600081111561408257600060076000878781518110613ede57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03169050886001600160a01b031663a9059cbb82846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015613f7357600080fd5b505af1158015613f87573d6000803e3d6000fd5b505050506040513d6020811015613f9d57600080fd5b5051613fe5576040805162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b60018886601f8110613ff357fe5b61ffff909216602092909202015260018786601f811061400f57fe5b602002018181525050886001600160a01b0316816001600160a01b031687878151811061403857fe5b60200260200101516001600160a01b03167fd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c856040518082815260200191505060405180910390a4505b505050600101613e6d565b5061409b600584601f614f2a565b50612715600983601f614fc0565b602b54600160b01b900463ffffffff166000908152602c6020526040902054601790810b900b90565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561411857fe5b600281111561412357fe5b9052509050600061413383610c88565b90508015613a4b576001600160a01b03808416600090815260076020908152604080832054600354825163a9059cbb60e01b8152918616600483018190526024830188905292519295169363a9059cbb9360448084019491939192918390030190829087803b1580156141a557600080fd5b505af11580156141b9573d6000803e3d6000fd5b505050506040513d60208110156141cf57600080fd5b5051614217576040805162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b60016005846000015160ff16601f811061422d57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060016009846000015160ff16601f811061426857fe5b01556003546040805184815290516001600160a01b039283169284811692908816917fd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c9181900360200190a450505050565b60008a8a8a8a8a8a8a8a8a8a604051602001808b6001600160a01b031681526020018a6001600160401b0316815260200180602001806020018760ff168152602001866001600160401b031681526020018060200184810384528c8c82818152602001925060200280828437600083820152601f01601f191690910185810384528a8152602090810191508b908b0280828437600083820152601f01601f191690910185810383528681526020019050868680828437600081840152601f19601f8201169050808301925050509d50505050505050505050505050506040516020818303038152906040528051906020012090509a9950505050505050505050565b602b54600160b01b900463ffffffff1690565b6001600160a01b03821660009081526032602052604081205460ff16806119d557505060315460ff161592915050565b60308054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611c2f5780601f1061446057610100808354040283529160200191611c2f565b820191906000526020600020905b81548152906001019060200180831161446e57509395945050505050565b602b54600160b01b900463ffffffff166000908152602c6020526040902054600160c01b90046001600160401b031690565b600080600080600063ffffffff866001600160501b031611156040518060400160405280600f81526020016e139bc819185d18481c1c995cd95b9d608a1b815250906145885760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561454d578181015183820152602001614535565b50505050905090810190601f16801561457a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505063ffffffff83166000908152602c6020908152604091829020825180840190935254601781810b810b810b808552600160c01b9092046001600160401b031693909201839052949594900b939092508291508490565b6001600160a01b03811660009081526032602052604090205460ff16611da5576001600160a01b038116600081815260326020908152604091829020805460ff19166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b600063ffffffff82111561467357506000610db2565b5063ffffffff166000908152602c6020526040902054601790810b900b90565b600063ffffffff8211156146a957506000610db2565b5063ffffffff166000908152602c6020526040902054600160c01b90046001600160401b031690565b6040805160a0808201835263ffffffff88811680845288821660208086018290528984168688018190528985166060808901829052958a1660809889018190526002805463ffffffff1916871763ffffffff60201b1916600160201b87021763ffffffff60401b1916600160401b85021763ffffffff60601b1916600160601b84021763ffffffff60801b1916600160801b830217905589519586529285019390935283880152928201529283015291517fd0d9486a2c673e2a4b57fc82e4c8a556b3e2b82dd5db07e2c04a920ca0f469b6929181900390910190a15050505050565b604080516103e0810191829052600091829190600590601f908285855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116147d25790505050505050905060005b601f8110156148425760018282601f811061482b57fe5b60200201510361ffff169290920191600101614814565b506040805160a08101825260025463ffffffff8082168352600160201b82048116602080850191909152600160401b8304821684860152600160601b8304821660608501819052600160801b9093049091166080840152602a805485518184028101840190965280865296909202633b9aca00029592936000939092918301828280156148f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148da575b5050604080516103e0810191829052949550600094935060099250601f915082845b81548152602001906001019080831161491a575050505050905060005b82518110156149615760018282601f811061494e57fe5b6020020151039590950194600101614937565b505050505090565b60008183101561497a5750816119d8565b50919050565b602083810286019082020160e4019695505050505050565b60408051808201909152602e546001600160a01b038116808352600160a01b90910463ffffffff1660208301526149cf5750611104565b600019830163ffffffff8181166000818152602c6020908152604080832054875188840151835163beed9b5160e01b81526004810197909752601792830b90920b602487018190528b88166044880152606487018b9052925192966001600160a01b039091169563beed9b51959290911693608480830194919391928390030190829088803b158015614a6157600080fd5b5087f193505050508015614a8757506040513d6020811015614a8257600080fd5b505160015b612715576122da565b3360009081526028602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115614acd57fe5b6002811115614ad857fe5b9052506040805160a08101825260025463ffffffff8082168352600160201b820481166020840152600160401b8204811683850152600160601b820481166060840152600160801b90910416608082015281516103e081019283905292935091614b8c91859190600590601f90826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411614b4a5790505050505050614d8a565b614b9a90600590601f614f2a565b50600282602001516002811115614bad57fe5b14614bff576040805162461bcd60e51b815260206004820181905260248201527f73656e7420627920756e64657369676e61746564207472616e736d6974746572604482015290519081900360640190fd5b6000614c26633b9aca003a04836020015163ffffffff16846000015163ffffffff16614dff565b90506010360260005a90506000614c458863ffffffff16858585614e25565b6001600160801b031690506000620f4240866040015163ffffffff16830281614c6a57fe5b049050856080015163ffffffff16633b9aca0002816009896000015160ff16601f8110614c9357fe5b015401016009886000015160ff16601f8110614cab57fe5b0155505050505050505050565b6004546001600160a01b03908116908216811461110457600480546001600160a01b0319166001600160a01b03848116918217909255604080519284168352602083019190915280517f793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d489129281900390910190a15050565b602b54600160b01b900463ffffffff166000818152602c6020908152604091829020825180840190935254601781810b810b810b808552600160c01b9092046001600160401b031693909201839052929392900b9181908490565b614d92614ef4565b60005b8351811015614df7576000848281518110614dac57fe5b016020015160f81c9050614dd18482601f8110614dc557fe5b60200201516001614ea8565b848260ff16601f8110614de057fe5b61ffff909216602092909202015250600101614d95565b509092915050565b60008383811015614e1257600285850304015b614e1c8184614969565b95945050505050565b600081851015614e7c576040805162461bcd60e51b815260206004820181905260248201527f6761734c6566742063616e6e6f742065786365656420696e697469616c476173604482015290519081900360640190fd5b818503830161179301633b9aca00858202026001600160801b038110614e9e57fe5b9695505050505050565b60006119d58261ffff168461ffff160161ffff614969565b6040518060a00160405280614ed3614fee565b81526060602082018190526040820181905280820152600060809091015290565b604051806103e00160405280601f906020820280368337509192915050565b604080518082019091526000808252602082015290565b600283019183908215614fb05791602002820160005b83821115614f8057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302614f40565b8015614fae5782816101000a81549061ffff0219169055600201602081600101049283019260010302614f80565b505b50614fbc929150615015565b5090565b82601f8101928215614fb0579160200282015b82811115614fb0578251825591602001919060010190614fd3565b60408051608081018252600080825260208201819052918101829052606081019190915290565b5b80821115614fbc576000815560010161501656fe416363657373436f6e74726f6c6c65644f6666636861696e41676772656761746f7220332e302e306f7261636c6520616464726573736573206f7574206f6620726567697374726174696f6e4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000a264697066735822122052ec884bb73b07df8765d45f7fd81f45893fdf5b3ac3f7893e7d9ae0e968d8e264736f6c63430007060033000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000dff154d00000000000000000000000000000000000000000000000000000000007ad8b10000000000000000000000000000000000000000000000000000000002e11b59000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000000000000000000000000000000000000000000100000000000000000000ffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000f86056d00bcf39baef81bbed1786e6f32c1a5fe0000000000000000000000001f69648f1b985344cdeccd5d2a36255cd22aded700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a42555344202f2055534400000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061024a5760003560e01c80638e0566de1161013c578063c1075329116100be578063c107532914610966578063c980753914610992578063d09dc33914610aa0578063dc7f012414610aa8578063e4902f8214610ab0578063e5fe457714610aed578063e76d516814610b3e578063eb45716314610b46578063eb5dcd6c14610b78578063f2fde38b14610ba6578063fbffd2c114610bcc578063feaf968c14610bf25761024a565b80638e0566de146106f157806398e5b12a14610721578063996e8298146107455780639a6fc8f51461074d5780639c849b30146107b75780639e3ceeab14610875578063a118f2491461089b578063b121e147146108c1578063b5ab58dc146108e7578063b633620c14610904578063bd824706146109215761024a565b80636b14daf8116101d05780636b14daf8146104f857806370da2f67146105c057806370efdf2d146105c85780637284e416146105ec57806379ba5097146105f45780638038e4a1146105fc578063814118341461060457806381ff70481461065c5780638205bf6a146106955780638823da6c1461069d5780638ac28d5a146106c35780638da5cb5b146106e95761024a565b80630a7569831461024f5780630eafb25b14610259578063181f5a771461029157806322adbc781461030e578063299372681461032d578063313ce5671461036e5780634fb174701461038c57806350d25bcd146103ba57806354fd4d50146103c2578063585aa7de146103ca578063668a0f02146104f0575b600080fd5b610257610bfa565b005b61027f6004803603602081101561026f57600080fd5b50356001600160a01b0316610c88565b60408051918252519081900360200190f35b610299610db7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d35781810151838201526020016102bb565b50505050905090810190601f1680156103005780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610316610dd7565b6040805160179290920b8252519081900360200190f35b610335610dfb565b6040805163ffffffff96871681529486166020860152928516848401529084166060840152909216608082015290519081900360a00190f35b610376610e5c565b6040805160ff9092168252519081900360200190f35b610257600480360360408110156103a257600080fd5b506001600160a01b0381358116916020013516610e80565b61027f611108565b61027f611195565b610257600480360360a08110156103e057600080fd5b810190602081018135600160201b8111156103fa57600080fd5b82018360208201111561040c57600080fd5b803590602001918460208302840111600160201b8311171561042d57600080fd5b919390929091602081019035600160201b81111561044a57600080fd5b82018360208201111561045c57600080fd5b803590602001918460208302840111600160201b8311171561047d57600080fd5b9193909260ff833516926001600160401b03602082013516929190606081019060400135600160201b8111156104b257600080fd5b8201836020820111156104c457600080fd5b803590602001918460018302840111600160201b831117156104e557600080fd5b50909250905061119a565b61027f61192e565b6105ac6004803603604081101561050e57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561053857600080fd5b82018360208201111561054a57600080fd5b803590602001918460018302840111600160201b8311171561056b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506119b6945050505050565b604080519115158252519081900360200190f35b6103166119de565b6105d0611a02565b604080516001600160a01b039092168252519081900360200190f35b610299611a11565b610257611a99565b610257611b48565b61060c611bd7565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610648578181015183820152602001610630565b505050509050019250505060405180910390f35b610664611c39565b6040805163ffffffff94851681529290931660208301526001600160801b0319168183015290519081900360600190f35b61027f611c59565b610257600480360360208110156106b357600080fd5b50356001600160a01b0316611ce1565b610257600480360360208110156106d957600080fd5b50356001600160a01b0316611da8565b6105d0611e19565b6106f9611e28565b604080516001600160a01b03909316835263ffffffff90911660208301528051918290030190f35b610729611e5b565b604080516001600160501b039092168252519081900360200190f35b6105d061202e565b6107736004803603602081101561076357600080fd5b50356001600160501b031661203d565b60405180866001600160501b03168152602001858152602001848152602001838152602001826001600160501b031681526020019550505050505060405180910390f35b610257600480360360408110156107cd57600080fd5b810190602081018135600160201b8111156107e757600080fd5b8201836020820111156107f957600080fd5b803590602001918460208302840111600160201b8311171561081a57600080fd5b919390929091602081019035600160201b81111561083757600080fd5b82018360208201111561084957600080fd5b803590602001918460208302840111600160201b8311171561086a57600080fd5b5090925090506120de565b6102576004803603602081101561088b57600080fd5b50356001600160a01b03166122e1565b610257600480360360208110156108b157600080fd5b50356001600160a01b03166123a5565b610257600480360360208110156108d757600080fd5b50356001600160a01b03166123fb565b61027f600480360360208110156108fd57600080fd5b50356124dc565b61027f6004803603602081101561091a57600080fd5b5035612565565b610257600480360360a081101561093757600080fd5b5063ffffffff8135811691602081013582169160408201358116916060810135821691608090910135166125ee565b6102576004803603604081101561097c57600080fd5b506001600160a01b03813516906020013561271d565b610257600480360360808110156109a857600080fd5b810190602081018135600160201b8111156109c257600080fd5b8201836020820111156109d457600080fd5b803590602001918460018302840111600160201b831117156109f557600080fd5b919390929091602081019035600160201b811115610a1257600080fd5b820183602082011115610a2457600080fd5b803590602001918460208302840111600160201b83111715610a4557600080fd5b919390929091602081019035600160201b811115610a6257600080fd5b820183602082011115610a7457600080fd5b803590602001918460208302840111600160201b83111715610a9557600080fd5b9193509150356129e0565b61027f613719565b6105ac6137aa565b610ad660048036036020811015610ac657600080fd5b50356001600160a01b03166137b3565b6040805161ffff9092168252519081900360200190f35b610af5613860565b604080516001600160801b0319909616865263ffffffff909416602086015260ff9092168484015260170b60608401526001600160401b03166080830152519081900360a00190f35b6105d0613910565b61025760048036036040811015610b5c57600080fd5b5080356001600160a01b0316906020013563ffffffff1661391f565b61025760048036036040811015610b8e57600080fd5b506001600160a01b0381358116916020013516613a50565b61025760048036036020811015610bbc57600080fd5b50356001600160a01b0316613b8d565b61025760048036036020811015610be257600080fd5b50356001600160a01b0316613c2b565b610773613c81565b6000546001600160a01b03163314610c47576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b60315460ff1615610c86576031805460ff191690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a15b565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff808216845285948401916101009004166002811115610cca57fe5b6002811115610cd557fe5b9052509050600081602001516002811115610cec57fe5b1415610cfc576000915050610db2565b6040805160a08101825260025463ffffffff8082168352600160201b820481166020840152600160401b8204811693830193909352600160601b8104831660608301819052600160801b90910490921660808201528251909160009160019060059060ff16601f8110610d6b57fe5b601091828204019190066002029054906101000a900461ffff160361ffff1602633b9aca0002905060016009846000015160ff16601f8110610da957fe5b01540301925050505b919050565b606060405180606001604052806028815260200161502b60289139905090565b7f000000000000000000000000000000000000000000000000000000000000000181565b6040805160a08101825260025463ffffffff808216808452600160201b8304821660208501819052600160401b84048316958501869052600160601b8404831660608601819052600160801b90940490921660809094018490529490939290565b7f000000000000000000000000000000000000000000000000000000000000000881565b6000546001600160a01b03163314610ecd576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b6003546001600160a01b03908116908316811415610eeb5750611104565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015610f3157600080fd5b505afa158015610f45573d6000803e3d6000fd5b505050506040513d6020811015610f5b57600080fd5b50610f669050613d20565b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fb557600080fd5b505afa158015610fc9573d6000803e3d6000fd5b505050506040513d6020811015610fdf57600080fd5b50516040805163a9059cbb60e01b81526001600160a01b0386811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b15801561103757600080fd5b505af115801561104b573d6000803e3d6000fd5b505050506040513d602081101561106157600080fd5b50516110b4576040805162461bcd60e51b815260206004820152601f60248201527f7472616e736665722072656d61696e696e672066756e6473206661696c656400604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0386811691821790925560405190918416907f4966a50c93f855342ccf6c5c0d358b85b91335b2acedc7da0932f691f351711a90600090a350505b5050565b600061114b336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b611188576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6111906140a9565b905090565b600481565b868560ff8616601f8311156111e9576040805162461bcd60e51b815260206004820152601060248201526f746f6f206d616e79207369676e65727360801b604482015290519081900360640190fd5b6000811161123b576040805162461bcd60e51b815260206004820152601a6024820152797468726573686f6c64206d75737420626520706f73697469766560301b604482015290519081900360640190fd5b8183146112795760405162461bcd60e51b81526004018080602001828103825260248152602001806150536024913960400191505060405180910390fd5b8060030283116112d0576040805162461bcd60e51b815260206004820181905260248201527f6661756c74792d6f7261636c65207468726573686f6c6420746f6f2068696768604482015290519081900360640190fd5b6000546001600160a01b0316331461131d576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b6029541561141a57602980546000198101916000918390811061133c57fe5b6000918252602082200154602a80546001600160a01b039092169350908490811061136357fe5b6000918252602090912001546001600160a01b03169050611383816140d2565b6001600160a01b03808316600090815260286020526040808220805461ffff19908116909155928416825290208054909116905560298054806113c257fe5b600082815260209020810160001990810180546001600160a01b0319169055019055602a8054806113ef57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555061131d915050565b60005b8a811015611770576000602860008e8e8581811061143757fe5b602090810292909201356001600160a01b031683525081019190915260400160002054610100900460ff16600281111561146d57fe5b146114b9576040805162461bcd60e51b81526020600482015260176024820152767265706561746564207369676e6572206164647265737360481b604482015290519081900360640190fd5b6040805180820190915260ff8216815260016020820152602860008e8e858181106114e057fe5b602090810292909201356001600160a01b0316835250818101929092526040016000208251815460ff191660ff90911617808255918301519091829061ff00191661010083600281111561153057fe5b02179055506000915060079050818c8c8581811061154a57fe5b6001600160a01b03602091820293909301358316845283019390935260409091016000205416919091141590506115bc576040805162461bcd60e51b81526020600482015260116024820152701c185e5959481b5d5cdd081899481cd95d607a1b604482015290519081900360640190fd5b6000602860008c8c858181106115ce57fe5b602090810292909201356001600160a01b031683525081019190915260400160002054610100900460ff16600281111561160457fe5b14611656576040805162461bcd60e51b815260206004820152601c60248201527f7265706561746564207472616e736d6974746572206164647265737300000000604482015290519081900360640190fd5b6040805180820190915260ff8216815260026020820152602860008c8c8581811061167d57fe5b602090810292909201356001600160a01b0316835250818101929092526040016000208251815460ff191660ff90911617808255918301519091829061ff0019166101008360028111156116cd57fe5b021790555090505060298c8c838181106116e357fe5b835460018101855560009485526020948590200180546001600160a01b0319166001600160a01b039590920293909301359390931692909217905550602a8a8a8381811061172d57fe5b835460018181018655600095865260209586902090910180546001600160a01b0319166001600160a01b039690930294909401359490941617909155500161141d565b50602b805460ff8916600160a81b0260ff60a81b19909116179055602d80544363ffffffff908116600160201b90810263ffffffff60201b19841617808316600101831663ffffffff199091161793849055909104811691166117db30828f8f8f8f8f8f8f8f6142ba565b602b60000160006101000a8154816001600160801b03021916908360801c02179055506000602b60000160106101000a81548164ffffffffff021916908364ffffffffff1602179055507f25d719d88a4512dd76c7442b910a83360845505894eb444ef299409e180f8fb982828f8f8f8f8f8f8f8f604051808b63ffffffff1681526020018a6001600160401b0316815260200180602001806020018760ff168152602001866001600160401b031681526020018060200184810384528c8c82818152602001925060200280828437600083820152601f01601f191690910185810384528a8152602090810191508b908b0280828437600083820152601f01601f191690910185810383528681526020019050868680828437600083820152604051601f909101601f19169092018290039f50909d5050505050505050505050505050a150505050505050505050505050565b6000611971336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b6119ae576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6111906143bc565b60006119c283836143cf565b806119d557506001600160a01b03831632145b90505b92915050565b7f00000000000000000000ffffffffffffffffffffffffffffffffffffffffffff81565b602f546001600160a01b031690565b6060611a54336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b611a91576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6111906143ff565b6001546001600160a01b03163314611af1576040805162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015290519081900360640190fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000546001600160a01b03163314611b95576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b60315460ff16610c86576031805460ff191660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6060602a805480602002602001604051908101604052809291908181526020018280548015611c2f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c11575b5050505050905090565b602d54602b5463ffffffff80831692600160201b9004169060801b909192565b6000611c9c336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b611cd9576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b61119061448c565b6000546001600160a01b03163314611d2e576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526032602052604090205460ff1615611da5576001600160a01b038116600081815260326020908152604091829020805460ff19169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a15b50565b6001600160a01b03818116600090815260076020526040902054163314611e10576040805162461bcd60e51b81526020600482015260176024820152764f6e6c792070617965652063616e20776974686472617760481b604482015290519081900360640190fd5b611da5816140d2565b6000546001600160a01b031681565b60408051808201909152602e546001600160a01b038116808352600160a01b90910463ffffffff16602090920182905291565b600080546001600160a01b0316331480611f1e5750602f5460408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b0390951694636b14daf894929360009391929190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015611ef157600080fd5b505afa158015611f05573d6000803e3d6000fd5b505050506040513d6020811015611f1b57600080fd5b50515b611f6f576040805162461bcd60e51b815260206004820152601d60248201527f4f6e6c79206f776e6572267265717565737465722063616e2063616c6c000000604482015290519081900360640190fd5b6040805160808082018352602b549081901b6001600160801b031916808352600160801b820464ffffffffff8116602080860191909152600160a81b840460ff90811686880152600160b01b90940463ffffffff9081166060808801919091528751948552600884901c909116918401919091529216818501529251919233927f3ea16a923ff4b1df6526e854c9e3a995c43385d70e73359e10623c74f0b52037929181900390910190a2806060015160010163ffffffff1691505090565b6004546001600160a01b031690565b6000806000806000612086336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b6120c3576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6120cc866144be565b939a9299509097509550909350915050565b6000546001600160a01b0316331461212b576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b82811461217f576040805162461bcd60e51b815260206004820181905260248201527f7472616e736d6974746572732e73697a6520213d207061796565732e73697a65604482015290519081900360640190fd5b60005b838110156122da57600085858381811061219857fe5b905060200201356001600160a01b0316905060008484848181106121b857fe5b6001600160a01b0385811660009081526007602090815260409091205492029390930135831693509091169050801580806122045750826001600160a01b0316826001600160a01b0316145b612249576040805162461bcd60e51b81526020600482015260116024820152701c185e595948185b1c9958591e481cd95d607a1b604482015290519081900360640190fd5b6001600160a01b03848116600090815260076020526040902080546001600160a01b031916858316908117909155908316146122ca57826001600160a01b0316826001600160a01b0316856001600160a01b03167f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b360405160405180910390a45b5050600190920191506121829050565b5050505050565b6000546001600160a01b0316331461232e576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b602f546001600160a01b03908116908216811461110457602f80546001600160a01b0319166001600160a01b03848116918217909255604080519284168352602083019190915280517f27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae6349281900390910190a15050565b6000546001600160a01b031633146123f2576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b611da5816145e2565b6001600160a01b03818116600090815260086020526040902054163314612469576040805162461bcd60e51b815260206004820152601f60248201527f6f6e6c792070726f706f736564207061796565732063616e2061636365707400604482015290519081900360640190fd5b6001600160a01b0381811660008181526007602090815260408083208054336001600160a01b031980831682179093556008909452828520805490921690915590519416939092849290917f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b39190a45050565b600061251f336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b61255c576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6119d88261465d565b60006125a8336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b6125e5576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6119d882614693565b6004546000546001600160a01b0391821691163314806126af575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b15801561268257600080fd5b505afa158015612696573d6000803e3d6000fd5b505050506040513d60208110156126ac57600080fd5b50515b612700576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722662696c6c696e6741646d696e2063616e2063616c6c604482015290519081900360640190fd5b612708613d20565b61271586868686866146d2565b505050505050565b6000546001600160a01b03163314806127de57506004805460408051630d629b5f60e31b8152339381018481526024820192835236604483018190526001600160a01b0390941694636b14daf8949093600093919291606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b1580156127b157600080fd5b505afa1580156127c5573d6000803e3d6000fd5b505050506040513d60208110156127db57600080fd5b50515b61282f576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722662696c6c696e6741646d696e2063616e2063616c6c604482015290519081900360640190fd5b60006128396147b5565b600354604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561288a57600080fd5b505afa15801561289e573d6000803e3d6000fd5b505050506040513d60208110156128b457600080fd5b5051905081811015612904576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6003546001600160a01b031663a9059cbb8561292285850387614969565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561296857600080fd5b505af115801561297c573d6000803e3d6000fd5b505050506040513d602081101561299257600080fd5b50516129da576040805162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b50505050565b60005a90506129f3888888888888614980565b3614612a42576040805162461bcd60e51b81526020600482015260196024820152787472616e736d6974206d65737361676520746f6f206c6f6e6760381b604482015290519081900360640190fd5b612a4a614ec0565b6040805160808082018352602b549081901b6001600160801b0319168252600160801b810464ffffffffff166020830152600160a81b810460ff1692820192909252600160b01b90910463ffffffff166060808301919091529082526000908a908a90811015612ab957600080fd5b813591602081013591810190606081016040820135600160201b811115612adf57600080fd5b820183602082011115612af157600080fd5b803590602001918460208302840111600160201b83111715612b1257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060408801525050506080840182905283515190925060589190911b906001600160801b0319808316911614612bb9576040805162461bcd60e51b81526020600482015260156024820152740c6dedcccd2ce88d2cecae6e840dad2e6dac2e8c6d605b1b604482015290519081900360640190fd5b608083015183516020015164ffffffffff808316911610612c10576040805162461bcd60e51b815260206004820152600c60248201526b1cdd185b19481c995c1bdc9d60a21b604482015290519081900360640190fd5b83516040015160ff168911612c64576040805162461bcd60e51b81526020600482015260156024820152746e6f7420656e6f756768207369676e61747572657360581b604482015290519081900360640190fd5b601f891115612cb0576040805162461bcd60e51b8152602060048201526013602482015272746f6f206d616e79207369676e61747572657360681b604482015290519081900360640190fd5b868914612d04576040805162461bcd60e51b815260206004820152601e60248201527f7369676e617475726573206f7574206f6620726567697374726174696f6e0000604482015290519081900360640190fd5b601f8460400151511115612d5f576040805162461bcd60e51b815260206004820152601e60248201527f6e756d206f62736572766174696f6e73206f7574206f6620626f756e64730000604482015290519081900360640190fd5b83600001516040015160020260ff1684604001515111612dc6576040805162461bcd60e51b815260206004820152601e60248201527f746f6f206665772076616c75657320746f207472757374206d656469616e0000604482015290519081900360640190fd5b886001600160401b0381118015612ddc57600080fd5b506040519080825280601f01601f191660200182016040528015612e07576020820181803683370190505b50606085015260005b60ff81168a1115612e6057868160ff1660208110612e2a57fe5b1a60f81b85606001518260ff1681518110612e4157fe5b60200101906001600160f81b031916908160001a905350600101612e10565b508360400151516001600160401b0381118015612e7c57600080fd5b506040519080825280601f01601f191660200182016040528015612ea7576020820181803683370190505b506020850152612eb5614ef4565b60005b8560400151518160ff161015612f9d576000858260ff1660208110612ed957fe5b1a90508281601f8110612ee857fe5b602002015115612f39576040805162461bcd60e51b81526020600482015260176024820152761bd89cd95c9d995c881a5b99195e081c995c19585d1959604a1b604482015290519081900360640190fd5b6001838260ff16601f8110612f4a57fe5b91151560209283029190910152869060ff8416908110612f6657fe5b1a60f81b87602001518360ff1681518110612f7d57fe5b60200101906001600160f81b031916908160001a90535050600101612eb8565b503360009081526028602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115612fdb57fe5b6002811115612fe657fe5b9052509050600281602001516002811115612ffd57fe5b1480156130315750602a816000015160ff168154811061301957fe5b6000918252602090912001546001600160a01b031633145b61307d576040805162461bcd60e51b81526020600482015260186024820152773ab730baba3437b934bd32b2103a3930b739b6b4ba3a32b960411b604482015290519081900360640190fd5b5050835164ffffffffff90911660209091015250506040516000908a908a9080838380828437604051920182900390912094506130be9350614ef492505050565b6130c6614f13565b60005b898110156132b6576000600185876060015184815181106130e657fe5b60209101015160f81c601b018e8e868181106130fe57fe5b905060200201358d8d8781811061311157fe5b9050602002013560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561316c573d6000803e3d6000fd5b505060408051601f198101516001600160a01b03811660009081526028602090815290849020838501909452835460ff808216855292965092945084019161010090041660028111156131bb57fe5b60028111156131c657fe5b90525092506001836020015160028111156131dd57fe5b1461322f576040805162461bcd60e51b815260206004820152601e60248201527f61646472657373206e6f7420617574686f72697a656420746f207369676e0000604482015290519081900360640190fd5b8251849060ff16601f811061324057fe5b60200201511561328e576040805162461bcd60e51b81526020600482015260146024820152736e6f6e2d756e69717565207369676e617475726560601b604482015290519081900360640190fd5b600184846000015160ff16601f81106132a357fe5b91151560209092020152506001016130c9565b5050505060005b600182604001515103811015613361576000826040015182600101815181106132e257fe5b602002602001015160170b836040015183815181106132fd57fe5b602002602001015160170b1315905080613358576040805162461bcd60e51b81526020600482015260176024820152761bd89cd95c9d985d1a5bdb9cc81b9bdd081cdbdc9d1959604a1b604482015290519081900360640190fd5b506001016132bd565b5060408101518051600091906002810490811061337a57fe5b602002602001015190508060170b7f000000000000000000000000000000000000000000000000000000000000000160170b131580156133e057507f00000000000000000000ffffffffffffffffffffffffffffffffffffffffffff60170b8160170b13155b613431576040805162461bcd60e51b815260206004820152601e60248201527f6d656469616e206973206f7574206f66206d696e2d6d61782072616e67650000604482015290519081900360640190fd5b81516060908101805163ffffffff60019091018116909152604080518082018252601785810b8083526001600160401b0342811660208086019182528a5189015188166000908152602c8252878120965187549351909416600160c01b029390950b6001600160c01b039081166001600160c01b03199093169290921790911691909117909355875186015184890151848a01516080808c015188519586523386890181905291860181905260a0988601898152845199870199909952835194909916997ff6a97944f31ea060dfde0566e4167c1a1082551e64b60ecb14d599a9d023d451998c999298949793969095909492939185019260c086019289820192909102908190849084905b8381101561355557818101518382015260200161353d565b50505050905001838103825285818151815260200191508051906020019080838360005b83811015613591578181015183820152602001613579565b50505050905090810190601f1680156135be5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a281516060015160408051428152905160009263ffffffff16917f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271919081900360200190a381600001516060015163ffffffff168160170b7f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f426040518082815260200191505060405180910390a36136738260000151606001518260170b614998565b5080518051602b8054602084015160408501516060909501516001600160801b031990921660809490941c9390931764ffffffffff60801b1916600160801b64ffffffffff909416939093029290921760ff60a81b1916600160a81b60ff909416939093029290921763ffffffff60b01b1916600160b01b63ffffffff9283160217909155821061370057fe5b61370e828260200151614a90565b505050505050505050565b600354604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561376957600080fd5b505afa15801561377d573d6000803e3d6000fd5b505050506040513d602081101561379357600080fd5b5051905060006137a16147b5565b90910391505090565b60315460ff1681565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff8082168452859484019161010090041660028111156137f557fe5b600281111561380057fe5b905250905060008160200151600281111561381757fe5b1415613827576000915050610db2565b60016005826000015160ff16601f811061383d57fe5b601091828204019190066002029054906101000a900461ffff1603915050919050565b6000808080803332146138b1576040805162461bcd60e51b81526020600482015260146024820152734f6e6c792063616c6c61626c6520627920454f4160601b604482015290519081900360640190fd5b5050602b5463ffffffff600160b01b820481166000908152602c6020526040902054608083901b96600160801b909304600881901c909216955064ffffffffff9091169350601781900b9250600160c01b90046001600160401b031690565b6003546001600160a01b031690565b6000546001600160a01b0316331461396c576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b60408051808201909152602e546001600160a01b03808216808452600160a01b90920463ffffffff16602084015284161415806139b957508163ffffffff16816020015163ffffffff1614155b15613a4b576040805180820182526001600160a01b0385811680835263ffffffff8681166020948501819052602e80546001600160a01b031916841763ffffffff60a01b1916600160a01b8302179055865187860151875193168352948201528451919493909216927fb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541928290030190a35b505050565b6001600160a01b03828116600090815260076020526040902054163314613abe576040805162461bcd60e51b815260206004820152601d60248201527f6f6e6c792063757272656e742070617965652063616e20757064617465000000604482015290519081900360640190fd5b336001600160a01b0382161415613b16576040805162461bcd60e51b815260206004820152601760248201527631b0b73737ba103a3930b739b332b9103a379039b2b63360491b604482015290519081900360640190fd5b6001600160a01b03808316600090815260086020526040902080548383166001600160a01b031982168117909255909116908114613a4b576040516001600160a01b038084169133918616907f84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e3836790600090a4505050565b6000546001600160a01b03163314613bda576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000546001600160a01b03163314613c78576040805162461bcd60e51b81526020600482015260166024820152600080516020615077833981519152604482015290519081900360640190fd5b611da581614cb8565b6000806000806000613cca336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b692505050565b613d07576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b613d0f614d2f565b945094509450945094509091929394565b6040805160a08101825260025463ffffffff8082168352600160201b820481166020840152600160401b8204811683850152600160601b820481166060840152600160801b90910416608082015260035482516103e081019384905291926001600160a01b0390911691600091600590601f908285855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411613d97575050604080516103e0810191829052959650600095945060099350601f9250905082845b815481526020019060010190808311613df157505050505090506000602a805480602002602001604051908101604052809291908181526020018280548015613e6357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613e45575b5050505050905060005b815181101561408d57600060018483601f8110613e8657fe5b6020020151039050600060018684601f8110613e9e57fe5b60200201510361ffff169050600082896060015163ffffffff168302633b9aca0002019050600081111561408257600060076000878781518110613ede57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03169050886001600160a01b031663a9059cbb82846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015613f7357600080fd5b505af1158015613f87573d6000803e3d6000fd5b505050506040513d6020811015613f9d57600080fd5b5051613fe5576040805162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b60018886601f8110613ff357fe5b61ffff909216602092909202015260018786601f811061400f57fe5b602002018181525050886001600160a01b0316816001600160a01b031687878151811061403857fe5b60200260200101516001600160a01b03167fd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c856040518082815260200191505060405180910390a4505b505050600101613e6d565b5061409b600584601f614f2a565b50612715600983601f614fc0565b602b54600160b01b900463ffffffff166000908152602c6020526040902054601790810b900b90565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561411857fe5b600281111561412357fe5b9052509050600061413383610c88565b90508015613a4b576001600160a01b03808416600090815260076020908152604080832054600354825163a9059cbb60e01b8152918616600483018190526024830188905292519295169363a9059cbb9360448084019491939192918390030190829087803b1580156141a557600080fd5b505af11580156141b9573d6000803e3d6000fd5b505050506040513d60208110156141cf57600080fd5b5051614217576040805162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b60016005846000015160ff16601f811061422d57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060016009846000015160ff16601f811061426857fe5b01556003546040805184815290516001600160a01b039283169284811692908816917fd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c9181900360200190a450505050565b60008a8a8a8a8a8a8a8a8a8a604051602001808b6001600160a01b031681526020018a6001600160401b0316815260200180602001806020018760ff168152602001866001600160401b031681526020018060200184810384528c8c82818152602001925060200280828437600083820152601f01601f191690910185810384528a8152602090810191508b908b0280828437600083820152601f01601f191690910185810383528681526020019050868680828437600081840152601f19601f8201169050808301925050509d50505050505050505050505050506040516020818303038152906040528051906020012090509a9950505050505050505050565b602b54600160b01b900463ffffffff1690565b6001600160a01b03821660009081526032602052604081205460ff16806119d557505060315460ff161592915050565b60308054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611c2f5780601f1061446057610100808354040283529160200191611c2f565b820191906000526020600020905b81548152906001019060200180831161446e57509395945050505050565b602b54600160b01b900463ffffffff166000908152602c6020526040902054600160c01b90046001600160401b031690565b600080600080600063ffffffff866001600160501b031611156040518060400160405280600f81526020016e139bc819185d18481c1c995cd95b9d608a1b815250906145885760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561454d578181015183820152602001614535565b50505050905090810190601f16801561457a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505063ffffffff83166000908152602c6020908152604091829020825180840190935254601781810b810b810b808552600160c01b9092046001600160401b031693909201839052949594900b939092508291508490565b6001600160a01b03811660009081526032602052604090205460ff16611da5576001600160a01b038116600081815260326020908152604091829020805460ff19166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b600063ffffffff82111561467357506000610db2565b5063ffffffff166000908152602c6020526040902054601790810b900b90565b600063ffffffff8211156146a957506000610db2565b5063ffffffff166000908152602c6020526040902054600160c01b90046001600160401b031690565b6040805160a0808201835263ffffffff88811680845288821660208086018290528984168688018190528985166060808901829052958a1660809889018190526002805463ffffffff1916871763ffffffff60201b1916600160201b87021763ffffffff60401b1916600160401b85021763ffffffff60601b1916600160601b84021763ffffffff60801b1916600160801b830217905589519586529285019390935283880152928201529283015291517fd0d9486a2c673e2a4b57fc82e4c8a556b3e2b82dd5db07e2c04a920ca0f469b6929181900390910190a15050505050565b604080516103e0810191829052600091829190600590601f908285855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116147d25790505050505050905060005b601f8110156148425760018282601f811061482b57fe5b60200201510361ffff169290920191600101614814565b506040805160a08101825260025463ffffffff8082168352600160201b82048116602080850191909152600160401b8304821684860152600160601b8304821660608501819052600160801b9093049091166080840152602a805485518184028101840190965280865296909202633b9aca00029592936000939092918301828280156148f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116148da575b5050604080516103e0810191829052949550600094935060099250601f915082845b81548152602001906001019080831161491a575050505050905060005b82518110156149615760018282601f811061494e57fe5b6020020151039590950194600101614937565b505050505090565b60008183101561497a5750816119d8565b50919050565b602083810286019082020160e4019695505050505050565b60408051808201909152602e546001600160a01b038116808352600160a01b90910463ffffffff1660208301526149cf5750611104565b600019830163ffffffff8181166000818152602c6020908152604080832054875188840151835163beed9b5160e01b81526004810197909752601792830b90920b602487018190528b88166044880152606487018b9052925192966001600160a01b039091169563beed9b51959290911693608480830194919391928390030190829088803b158015614a6157600080fd5b5087f193505050508015614a8757506040513d6020811015614a8257600080fd5b505160015b612715576122da565b3360009081526028602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115614acd57fe5b6002811115614ad857fe5b9052506040805160a08101825260025463ffffffff8082168352600160201b820481166020840152600160401b8204811683850152600160601b820481166060840152600160801b90910416608082015281516103e081019283905292935091614b8c91859190600590601f90826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411614b4a5790505050505050614d8a565b614b9a90600590601f614f2a565b50600282602001516002811115614bad57fe5b14614bff576040805162461bcd60e51b815260206004820181905260248201527f73656e7420627920756e64657369676e61746564207472616e736d6974746572604482015290519081900360640190fd5b6000614c26633b9aca003a04836020015163ffffffff16846000015163ffffffff16614dff565b90506010360260005a90506000614c458863ffffffff16858585614e25565b6001600160801b031690506000620f4240866040015163ffffffff16830281614c6a57fe5b049050856080015163ffffffff16633b9aca0002816009896000015160ff16601f8110614c9357fe5b015401016009886000015160ff16601f8110614cab57fe5b0155505050505050505050565b6004546001600160a01b03908116908216811461110457600480546001600160a01b0319166001600160a01b03848116918217909255604080519284168352602083019190915280517f793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d489129281900390910190a15050565b602b54600160b01b900463ffffffff166000818152602c6020908152604091829020825180840190935254601781810b810b810b808552600160c01b9092046001600160401b031693909201839052929392900b9181908490565b614d92614ef4565b60005b8351811015614df7576000848281518110614dac57fe5b016020015160f81c9050614dd18482601f8110614dc557fe5b60200201516001614ea8565b848260ff16601f8110614de057fe5b61ffff909216602092909202015250600101614d95565b509092915050565b60008383811015614e1257600285850304015b614e1c8184614969565b95945050505050565b600081851015614e7c576040805162461bcd60e51b815260206004820181905260248201527f6761734c6566742063616e6e6f742065786365656420696e697469616c476173604482015290519081900360640190fd5b818503830161179301633b9aca00858202026001600160801b038110614e9e57fe5b9695505050505050565b60006119d58261ffff168461ffff160161ffff614969565b6040518060a00160405280614ed3614fee565b81526060602082018190526040820181905280820152600060809091015290565b604051806103e00160405280601f906020820280368337509192915050565b604080518082019091526000808252602082015290565b600283019183908215614fb05791602002820160005b83821115614f8057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302614f40565b8015614fae5782816101000a81549061ffff0219169055600201602081600101049283019260010302614f80565b505b50614fbc929150615015565b5090565b82601f8101928215614fb0579160200282015b82811115614fb0578251825591602001919060010190614fd3565b60408051608081018252600080825260208201819052918101829052606081019190915290565b5b80821115614fbc576000815560010161501656fe416363657373436f6e74726f6c6c65644f6666636861696e41676772656761746f7220332e302e306f7261636c6520616464726573736573206f7574206f6620726567697374726174696f6e4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000a264697066735822122052ec884bb73b07df8765d45f7fd81f45893fdf5b3ac3f7893e7d9ae0e968d8e264736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000dff154d00000000000000000000000000000000000000000000000000000000007ad8b10000000000000000000000000000000000000000000000000000000002e11b59000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000000000000000000000000000000000000000000100000000000000000000ffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000f86056d00bcf39baef81bbed1786e6f32c1a5fe0000000000000000000000001f69648f1b985344cdeccd5d2a36255cd22aded700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a42555344202f2055534400000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _maximumGasPrice (uint32): 10
Arg [1] : _reasonableGasPrice (uint32): 1
Arg [2] : _microLinkPerEth (uint32): 234820941
Arg [3] : _linkGweiPerObservation (uint32): 8050865
Arg [4] : _linkGweiPerTransmission (uint32): 48307033
Arg [5] : _link (address): 0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6
Arg [6] : _minAnswer (int192): 1
Arg [7] : _maxAnswer (int192): 95780971304118053647396689196894323976171195136475135
Arg [8] : _billingAccessController (address): 0x0F86056d00bCf39BAEF81BbeD1786E6F32c1A5fe
Arg [9] : _requesterAccessController (address): 0x1F69648F1B985344cdeCcd5D2a36255Cd22ADEd7
Arg [10] : _decimals (uint8): 8
Arg [11] : description (string): BUSD / USD
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 000000000000000000000000000000000000000000000000000000000dff154d
Arg [3] : 00000000000000000000000000000000000000000000000000000000007ad8b1
Arg [4] : 0000000000000000000000000000000000000000000000000000000002e11b59
Arg [5] : 000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 00000000000000000000ffffffffffffffffffffffffffffffffffffffffffff
Arg [8] : 0000000000000000000000000f86056d00bcf39baef81bbed1786e6f32c1a5fe
Arg [9] : 0000000000000000000000001f69648f1b985344cdeccd5d2a36255cd22aded7
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [12] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [13] : 42555344202f2055534400000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
69581:3022:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67978:168;;;:::i;:::-;;19355:494;;;;;;;;;;;;;;;;-1:-1:-1;19355:494:0;-1:-1:-1;;;;;19355:494:0;;:::i;:::-;;;;;;;;;;;;;;;;70494:171;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38899:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;16976:489;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63512:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12858:805;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12858:805:0;;;;;;;;;;:::i;70756:144::-;;;:::i;63615:44::-;;;:::i;43257:2024::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43257:2024:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43257:2024:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43257:2024:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43257:2024:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43257:2024:0;;;;;;;;;;;;;;;-1:-1:-1;;;43257:2024:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43257:2024:0;;;;;;;;;;-1:-1:-1;43257:2024:0;;-1:-1:-1;43257:2024:0;-1:-1:-1;43257:2024:0;:::i;71139:143::-;;;:::i;69134:220::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69134:220:0;;;;;;;;;;;;;;;-1:-1:-1;;;69134:220:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69134:220:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69134:220:0;;-1:-1:-1;69134:220:0;;-1:-1:-1;;;;;69134:220:0:i;:::-;;;;;;;;;;;;;;;;;;39019:33;;;:::i;50268:152::-;;;:::i;:::-;;;;-1:-1:-1;;;;;50268:152:0;;;;;;;;;;;;;;71790:149;;;:::i;4422:264::-;;;:::i;67744:166::-;;;:::i;46577:118::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46132:254;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46132:254:0;;;;;;;;;;;;;;;70944:151;;;:::i;67494:184::-;;;;;;;;;;;;;;;;-1:-1:-1;67494:184:0;-1:-1:-1;;;;;67494:184:0;;:::i;19045:179::-;;;;;;;;;;;;;;;;-1:-1:-1;19045:179:0;-1:-1:-1;;;;;19045:179:0;;:::i;3762:28::-;;;:::i;47626:224::-;;;:::i;:::-;;;;-1:-1:-1;;;;;47626:224:0;;;;;;;;;;;;;;;;;;;;;;51389:474;;;:::i;:::-;;;;-1:-1:-1;;;;;51389:474:0;;;;;;;;;;;;;;18699:148;;;:::i;71983:294::-;;;;;;;;;;;;;;;;-1:-1:-1;71983:294:0;-1:-1:-1;;;;;71983:294:0;;:::i;:::-;;;;;-1:-1:-1;;;;;71983:294:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;71983:294:0;;;;;;;;;;;;;;;;;;;33813:705;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33813:705:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33813:705:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33813:705:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33813:705:0;;;;;;;;;;-1:-1:-1;33813:705:0;;-1:-1:-1;33813:705:0;-1:-1:-1;33813:705:0;:::i;50593:446::-;;;;;;;;;;;;;;;;-1:-1:-1;50593:446:0;-1:-1:-1;;;;;50593:446:0;;:::i;67121:92::-;;;;;;;;;;;;;;;;-1:-1:-1;67121:92:0;-1:-1:-1;;;;;67121:92:0;;:::i;35523:395::-;;;;;;;;;;;;;;;;-1:-1:-1;35523:395:0;-1:-1:-1;;;;;35523:395:0;;:::i;71326:162::-;;;;;;;;;;;;;;;;-1:-1:-1;71326:162:0;;:::i;71532:169::-;;;;;;;;;;;;;;;;-1:-1:-1;71532:169:0;;:::i;15847:562::-;;;;;;;;;;;;;;;;-1:-1:-1;15847:562:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26988:495::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26988:495:0;;;;;;;;:::i;56180:5508::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56180:5508:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56180:5508:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56180:5508:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56180:5508:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56180:5508:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56180:5508:0;;;;;;;;;;;;-1:-1:-1;56180:5508:0;-1:-1:-1;56180:5508:0;;:::i;29146:518::-;;;:::i;66450:24::-;;;:::i;29849:286::-;;;;;;;;;;;;;;;;-1:-1:-1;29849:286:0;-1:-1:-1;;;;;29849:286:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;53794:572;;;:::i;:::-;;;;-1:-1:-1;;;;;;53794:572:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53794:572:0;;;;;;;;;;;;;;13812:125;;;:::i;48099:508::-;;;;;;;;;;;;;;;;-1:-1:-1;48099:508:0;;-1:-1:-1;;;;;48099:508:0;;;;;;;;:::i;34777:514::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34777:514:0;;;;;;;;;;:::i;4171:157::-;;;;;;;;;;;;;;;;-1:-1:-1;4171:157:0;-1:-1:-1;;;;;4171:157:0;;:::i;18385:193::-;;;;;;;;;;;;;;;;-1:-1:-1;18385:193:0;-1:-1:-1;;;;;18385:193:0;;:::i;72321:277::-;;;:::i;67978:168::-;4826:5;;-1:-1:-1;;;;;4826:5:0;4812:10;:19;4804:54;;;;;-1:-1:-1;;;4804:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4804:54:0;;;;;;;;;;;;;;;68053:12:::1;::::0;::::1;;68049:92;;;68076:12;:20:::0;;-1:-1:-1;;68076:20:0::1;::::0;;68112:21:::1;::::0;::::1;::::0;68091:5:::1;::::0;68112:21:::1;68049:92;67978:168::o:0;19355:494::-;-1:-1:-1;;;;;19476:23:0;;19434:7;19476:23;;;:9;:23;;;;;;;;19453:46;;;;;;;;;;;;;;;;19434:7;;19453:46;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19453:46:0;-1:-1:-1;19525:10:0;19510:6;:11;;;:25;;;;;;;;;19506:44;;;19546:1;19539:8;;;;;19506:44;19556:34;;;;;;;;19581:9;19556:34;;;;;;;-1:-1:-1;;;19556:34:0;;;;;;;;-1:-1:-1;;;19556:34:0;;;;;;;;;;;-1:-1:-1;;;19556:34:0;;;;;;;;;;-1:-1:-1;;;19556:34:0;;;;;;;;;;19663:12;;19556:34;;:22;;:34;;19636:26;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;19628:53;;:102;19741:6;19628:120;19597:151;;19815:1;19772:26;19799:6;:12;;;19772:40;;;;;;;;;;;:44;19755:61;;-1:-1:-1;;;19355:494:0;;;;:::o;70494:171::-;70585:13;70610:49;;;;;;;;;;;;;;;;;;;70494:171;:::o;38899:33::-;;;:::o;16976:489::-;17226:34;;;;;;;;17251:9;17226:34;;;;;;;;-1:-1:-1;;;17226:34:0;;;;;;;;;;-1:-1:-1;;;17226:34:0;;;;;;;;;;-1:-1:-1;;;17226:34:0;;;;;;;;;;-1:-1:-1;;;17226:34:0;;;;;;;;;;;;;;;;;;16976:489::o;63512:40::-;;;:::o;12858:805::-;4826:5;;-1:-1:-1;;;;;4826:5:0;4812:10;:19;4804:54;;;;;-1:-1:-1;;;4804:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4804:54:0;;;;;;;;;;;;;;;13016:11:::1;::::0;-1:-1:-1;;;;;13016:11:0;;::::1;::::0;13038:26;::::1;::::0;::::1;13034:95;;;13115:7;;;13034:95;13229:35;::::0;;-1:-1:-1;;;13229:35:0;;13258:4:::1;13229:35;::::0;::::1;::::0;;;-1:-1:-1;;;;;13229:20:0;::::1;::::0;::::1;::::0;:35;;;;;::::1;::::0;;;;;;;;:20;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;13391:12:0::1;::::0;-1:-1:-1;13391:10:0::1;:12::i;:::-;13410:24;13437:12;-1:-1:-1::0;;;;;13437:22:0::1;;13468:4;13437:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;13437:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;13437:37:0;13489:51:::1;::::0;;-1:-1:-1;;;13489:51:0;;-1:-1:-1;;;;;13489:51:0;;::::1;;::::0;::::1;::::0;;;;;;;;;13437:37;;-1:-1:-1;13489:21:0;;::::1;::::0;::::1;::::0;:51;;;;;13437:37:::1;::::0;13489:51;;;;;;;;-1:-1:-1;13489:21:0;:51;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;13489:51:0;13481:95:::1;;;::::0;;-1:-1:-1;;;13481:95:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;13583:11;:24:::0;;-1:-1:-1;;;;;;13583:24:0::1;-1:-1:-1::0;;;;;13583:24:0;;::::1;::::0;;::::1;::::0;;;13619:38:::1;::::0;13583:24;;13619:38;::::1;::::0;::::1;::::0;-1:-1:-1;;13619:38:0::1;4865:1;;;12858:805:::0;;:::o;70756:144::-;70849:6;68258:31;68268:10;68280:8;;68258:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68258:9:0;;-1:-1:-1;;;68258:31:0:i;:::-;68250:53;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;;;;70874:20:::1;:18;:20::i;:::-;70867:27;;70756:144:::0;:::o;63615:44::-;63658:1;63615:44;:::o;43257:2024::-;43478:8;43495:13;42367:428;;;6768:2;42486:28;;;42478:57;;;;;-1:-1:-1;;;42478:57:0;;;;;;;;;;;;-1:-1:-1;;;42478:57:0;;;;;;;;;;;;;;;42563:1;42550:10;:14;42542:53;;;;;-1:-1:-1;;;42542:53:0;;;;;;;;;;;;-1:-1:-1;;;42542:53:0;;;;;;;;;;;;;;;42633:16;42618:11;:31;42602:101;;;;-1:-1:-1;;;42602:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42734:10;42732:1;:12;42718:11;:26;42710:71;;;;;-1:-1:-1;;;42710:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4826:5:::1;::::0;-1:-1:-1;;;;;4826:5:0::1;4812:10;:19;4804:54;;;::::0;;-1:-1:-1;;;4804:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;4804:54:0;;;;;;;;;;;;;::::1;;43563:9:::2;:16:::0;:21;43556:382:::2;;43657:9;:16:::0;;-1:-1:-1;;43657:20:0;;;43642:12:::2;::::0;43657:20;;43703:18;::::2;;;;;;::::0;;;::::2;::::0;;::::2;::::0;43752:14:::2;:23:::0;;-1:-1:-1;;;;;43703:18:0;;::::2;::::0;-1:-1:-1;43752:14:0;43767:7;;43752:23;::::2;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;43752:23:0::2;::::0;-1:-1:-1;43784:22:0::2;43752:23:::0;43784:9:::2;:22::i;:::-;-1:-1:-1::0;;;;;43822:17:0;;::::2;;::::0;;;:9:::2;:17;::::0;;;;;43815:24;;-1:-1:-1;;43815:24:0;;;;;;43855:22;;::::2;::::0;;;;43848:29;;;;;;;43886:9:::2;:15:::0;;;::::2;;;;;::::0;;;::::2;::::0;;;;-1:-1:-1;;43886:15:0;;;;;-1:-1:-1;;;;;;43886:15:0::2;::::0;;;;;43910:14:::2;:20:::0;;;::::2;;;;;::::0;;;::::2;::::0;;;;-1:-1:-1;;43910:20:0;;;;;-1:-1:-1;;;;;;43910:20:0::2;::::0;;;;;-1:-1:-1;43556:382:0::2;::::0;-1:-1:-1;;43556:382:0::2;;43951:6;43946:624;43963:19:::0;;::::2;43946:624;;;44087:10;44056:9;:22;44066:8;;44075:1;44066:11;;;;;;;;::::0;;::::2;::::0;;;::::2;;-1:-1:-1::0;;;;;44066:11:0::2;44056:22:::0;;-1:-1:-1;44056:22:0;::::2;::::0;;;;;;-1:-1:-1;44056:22:0;:27;::::2;::::0;::::2;;;:41;::::0;::::2;;;;;;;44038:104;;;::::0;;-1:-1:-1;;;44038:104:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44038:104:0;;;;;;;;;;;;;::::2;;44176:29;::::0;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;44193:11:::2;44176:29;::::0;::::2;::::0;44151:9:::2;-1:-1:-1::0;44161:8:0;;44176:29;44161:11;;::::2;;;;;;::::0;;::::2;::::0;;;::::2;;-1:-1:-1::0;;;;;44161:11:0::2;44151:22:::0;;-1:-1:-1;44151:22:0;;::::2;::::0;;;;;;-1:-1:-1;44151:22:0;:54;;;;-1:-1:-1;;44151:54:0::2;;::::0;;::::2;;::::0;;;;;::::2;::::0;:22;;;;-1:-1:-1;;44151:54:0::2;;::::0;::::2;::::0;::::2;;;;;;;;::::0;;-1:-1:-1;44260:1:0::2;::::0;-1:-1:-1;44222:8:0::2;::::0;-1:-1:-1;44260:1:0;44231:13;;44245:1;44231:16;;::::2;;;;;-1:-1:-1::0;;;;;44231:16:0::2;::::0;;::::2;::::0;;;::::2;;::::0;::::2;44222:26:::0;;;::::2;::::0;;;;;;;;-1:-1:-1;44222:26:0;;::::2;:40:::0;;;::::2;;::::0;-1:-1:-1;44214:70:0::2;;;::::0;;-1:-1:-1;;;44214:70:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44214:70:0;;;;;;;;;;;;;::::2;;44347:10;44311:9;:27;44321:13;;44335:1;44321:16;;;;;;;;::::0;;::::2;::::0;;;::::2;;-1:-1:-1::0;;;;;44321:16:0::2;44311:27:::0;;-1:-1:-1;44311:27:0;::::2;::::0;;;;;;-1:-1:-1;44311:27:0;:32;::::2;::::0;::::2;;;:46;::::0;::::2;;;;;;;44293:114;;;::::0;;-1:-1:-1;;;44293:114:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;44446:34;::::0;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;44463:16:::2;44446:34;::::0;::::2;::::0;44416:9:::2;-1:-1:-1::0;44426:13:0;;44446:34;44426:16;;::::2;;;;;;::::0;;::::2;::::0;;;::::2;;-1:-1:-1::0;;;;;44426:16:0::2;44416:27:::0;;-1:-1:-1;44416:27:0;;::::2;::::0;;;;;;-1:-1:-1;44416:27:0;:64;;;;-1:-1:-1;;44416:64:0::2;;::::0;;::::2;;::::0;;;;;::::2;::::0;:27;;;;-1:-1:-1;;44416:64:0::2;;::::0;::::2;::::0;::::2;;;;;;;;;;;;;;44489:9;44504:8;;44513:1;44504:11;;;;;;;44489:27:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;44489:27:0;;;44504:11:::2;44489:27:::0;;;;::::2;::::0;;-1:-1:-1;;;;;;44489:27:0::2;-1:-1:-1::0;;;;;44504:11:0;;;::::2;::::0;;;::::2;;::::0;;;::::2;44489:27:::0;;;::::2;::::0;;-1:-1:-1;44525:14:0::2;44545:13:::0;;44559:1;44545:16;;::::2;;;;;44525:37:::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;44525:37:0;;;44545:16:::2;44525:37:::0;;;;;;::::2;::::0;;-1:-1:-1;;;;;;44525:37:0::2;-1:-1:-1::0;;;;;44545:16:0;;;::::2;::::0;;;::::2;;::::0;;;::::2;44525:37;::::0;;;-1:-1:-1;43984:3:0::2;43946:624;;;-1:-1:-1::0;44576:9:0::2;:32:::0;;::::2;::::0;::::2;-1:-1:-1::0;;;44576:32:0::2;-1:-1:-1::0;;;;44576:32:0;;::::2;;::::0;;44650:25:::2;::::0;;44717:12:::2;44650:25;44682:48:::0;;::::2;-1:-1:-1::0;;;44682:48:0;;::::2;-1:-1:-1::0;;;;44682:48:0;::::2;;44737:18:::0;;::::2;-1:-1:-1::0;44737:18:0::2;::::0;::::2;-1:-1:-1::0;;44737:18:0;;::::2;;::::0;;;;44650:25;;::::2;::::0;::::2;::::0;44783:13:::2;44843:196;44888:4;44783:13:::0;44926:8;;44945:13;;44598:10;44990:21;45022:8;;44843:26:::2;:196::i;:::-;44812:9;:28;;;:227;;;;;-1:-1:-1::0;;;;;44812:227:0::2;;;;;;;;;;;;45080:1;45048:9;:29;;;:33;;;;;;;;;;;;;;;;;;45100:175;45118:25;45152:11;45172:8;;45189:13;;45211:10;45230:21;45260:8;;45100:175;;;;;;;;;;;-1:-1:-1::0;;;;;45100:175:0::2;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45100:175:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;::::2;;-1:-1:-1::0;;45100:175:0::2;::::0;;::::2;::::0;;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;-1:-1:-1;45100:175:0;;;::::2;::::0;;;::::2;;::::0;;::::2;::::0;::::2;;-1:-1:-1::0;;45100:175:0::2;::::0;;::::2;::::0;;::::2;::::0;;;;;::::2;;::::0;-1:-1:-1;45100:175:0;;;;;::::2;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;-1:-1:-1::0;;45100:175:0::2;::::0;;::::2;::::0;;::::2;::::0;-1:-1:-1;45100:175:0;;-1:-1:-1;;;;;;;;;;;;;;45100:175:0::2;4865:1;;43257:2024:::0;;;;;;;;;;;:::o;71139:143::-;71231:7;68258:31;68268:10;68280:8;;68258:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68258:9:0;;-1:-1:-1;;;68258:31:0:i;:::-;68250:53;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;;;;71257:19:::1;:17;:19::i;69134:220::-:0;69270:4;69293:33;69309:5;69316:9;69293:15;:33::i;:::-;:55;;;-1:-1:-1;;;;;;69330:18:0;;69339:9;69330:18;69293:55;69286:62;;69134:220;;;;;:::o;39019:33::-;;;:::o;50268:152::-;50387:27;;-1:-1:-1;;;;;50387:27:0;50268:152;:::o;71790:149::-;71882:13;68258:31;68268:10;68280:8;;68258:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68258:9:0;;-1:-1:-1;;;68258:31:0:i;:::-;68250:53;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;;;;71914:19:::1;:17;:19::i;4422:264::-:0;4495:12;;-1:-1:-1;;;;;4495:12:0;4481:10;:26;4473:61;;;;;-1:-1:-1;;;4473:61:0;;;;;;;;;;;;-1:-1:-1;;;4473:61:0;;;;;;;;;;;;;;;4543:16;4562:5;;4582:10;-1:-1:-1;;;;;;4574:18:0;;;;;;;-1:-1:-1;4599:25:0;;;;;;;4638:42;;-1:-1:-1;;;;;4562:5:0;;;;4582:10;;4562:5;;4638:42;;;4422:264;:::o;67744:166::-;4826:5;;-1:-1:-1;;;;;4826:5:0;4812:10;:19;4804:54;;;;;-1:-1:-1;;;4804:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4804:54:0;;;;;;;;;;;;;;;67819:12:::1;::::0;::::1;;67814:91;;67842:12;:19:::0;;-1:-1:-1;;67842:19:0::1;67857:4;67842:19;::::0;;67877:20:::1;::::0;::::1;::::0;67842:12:::1;::::0;67877:20:::1;67744:166::o:0;46577:118::-;46638:16;46675:14;46668:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46668:21:0;;;;;;;;;;;;;;;;;;;;;;;46577:118;:::o;46132:254::-;46309:13;;46351:9;:28;46309:13;;;;;-1:-1:-1;;;46324:25:0;;;;46351:28;;46132:254;;;:::o;70944:151::-;71040:7;68258:31;68268:10;68280:8;;68258:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68258:9:0;;-1:-1:-1;;;68258:31:0:i;:::-;68250:53;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;;;;71066:23:::1;:21;:23::i;67494:184::-:0;4826:5;;-1:-1:-1;;;;;4826:5:0;4812:10;:19;4804:54;;;;;-1:-1:-1;;;4804:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4804:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;67576:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;::::1;;67572:101;;;-1:-1:-1::0;;;;;67604:17:0;::::1;67624:5;67604:17:::0;;;:10:::1;:17;::::0;;;;;;;;:25;;-1:-1:-1;;67604:25:0::1;::::0;;67645:20;;;;;;;::::1;::::0;;;;;;;;::::1;67572:101;67494:184:::0;:::o;19045:179::-;-1:-1:-1;;;;;19138:22:0;;;;;;;:8;:22;;;;;;;19124:10;:36;19116:72;;;;;-1:-1:-1;;;19116:72:0;;;;;;;;;;;;-1:-1:-1;;;19116:72:0;;;;;;;;;;;;;;;19195:23;19205:12;19195:9;:23::i;3762:28::-;;;-1:-1:-1;;;;;3762:28:0;;:::o;47626:224::-;47758:45;;;;;;;;;47786:17;47758:45;-1:-1:-1;;;;;47758:45:0;;;;;-1:-1:-1;;;47758:45:0;;;;;;;;;;;;;47626:224::o;51389:474::-;51434:6;51471:5;;-1:-1:-1;;;;;51471:5:0;51457:10;:19;;:82;;-1:-1:-1;51480:27:0;;:59;;;-1:-1:-1;;;51480:59:0;;51518:10;51480:59;;;;;;;;;;;;51530:8;51480:59;;;;;;-1:-1:-1;;;;;51480:27:0;;;;:37;;51518:10;;51480:27;;51530:8;;51480:59;;;;:27;51530:8;;51480:27;:59;;;;;;;;;;;;;-1:-1:-1;;51480:59:0;;;;;-1:-1:-1;51480:59:0;;-1:-1:-1;51480:59:0;;-1:-1:-1;;;51480:59:0;;;;-1:-1:-1;51480:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51480:59:0;51457:82;51449:131;;;;;-1:-1:-1;;;51449:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51589:34;;;;;;;;;51614:9;51589:34;;;;;-1:-1:-1;;;;;;51589:34:0;;;;-1:-1:-1;;;51589:34:0;;;;;;;;;;;;;-1:-1:-1;;;51589:34:0;;;;;;;;;;-1:-1:-1;;;51589:34:0;;;;;;;;;;;;;;;51637:171;;;;;51754:1;51721:34;;;;;;51637:171;;;;;;;;;;;;;;;51589:34;;51660:10;;51637:171;;;;;;;;;;;51822:7;:31;;;51856:1;51822:35;51815:42;;;;;51389:474;:::o;18699:148::-;18816:25;;-1:-1:-1;;;;;18816:25:0;18699:148;:::o;71983:294::-;72099:14;72122:13;72144:17;72170;72196:22;68258:31;68268:10;68280:8;;68258:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68258:9:0;;-1:-1:-1;;;68258:31:0:i;:::-;68250:53;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;;;;72243:28:::1;72262:8;72243:18;:28::i;:::-;72236:35:::0;;;;-1:-1:-1;72236:35:0;;-1:-1:-1;72236:35:0;-1:-1:-1;72236:35:0;;-1:-1:-1;71983:294:0;-1:-1:-1;;71983:294:0:o;33813:705::-;4826:5;;-1:-1:-1;;;;;4826:5:0;4812:10;:19;4804:54;;;;;-1:-1:-1;;;4804:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4804:54:0;;;;;;;;;;;;;;;33958:38;;::::1;33950:83;;;::::0;;-1:-1:-1;;;33950:83:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;34047:6;34042:471;34059:24:::0;;::::1;34042:471;;;34099:19;34121:13;;34135:1;34121:16;;;;;;;;;;;;;-1:-1:-1::0;;;;;34121:16:0::1;34099:38;;34146:13;34162:7;;34170:1;34162:10;;;;;;;-1:-1:-1::0;;;;;34204:21:0;;::::1;34181:20;34204:21:::0;;;:8:::1;34162:10;34204:21:::0;;;;;;;;34162:10;::::1;::::0;;;::::1;;::::0;::::1;::::0;-1:-1:-1;34204:21:0;;::::1;::::0;-1:-1:-1;34251:26:0;;;;34294:34:::1;;;34323:5;-1:-1:-1::0;;;;;34307:21:0::1;:12;-1:-1:-1::0;;;;;34307:21:0::1;;34294:34;34286:64;;;::::0;;-1:-1:-1;;;34286:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34286:64:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34359:21:0;;::::1;;::::0;;;:8:::1;:21;::::0;;;;:29;;-1:-1:-1;;;;;;34359:29:0::1;::::0;;::::1;::::0;;::::1;::::0;;;34403:21;;::::1;;34399:107;;34490:5;-1:-1:-1::0;;;;;34442:54:0::1;34476:12;-1:-1:-1::0;;;;;34442:54:0::1;34463:11;-1:-1:-1::0;;;;;34442:54:0::1;;;;;;;;;;;34399:107;-1:-1:-1::0;;34085:3:0::1;::::0;;::::1;::::0;-1:-1:-1;34042:471:0::1;::::0;-1:-1:-1;34042:471:0::1;;;33813:705:::0;;;;:::o;50593:446::-;4826:5;;-1:-1:-1;;;;;4826:5:0;4812:10;:19;4804:54;;;;;-1:-1:-1;;;4804:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4804:54:0;;;;;;;;;;;;;;;50766:27:::1;::::0;-1:-1:-1;;;;;50766:27:0;;::::1;::::0;50804:43;::::1;::::0;::::1;50800:234;;50858:27;:83:::0;;-1:-1:-1;;;;;;50858:83:0::1;-1:-1:-1::0;;;;;50858:83:0;;::::1;::::0;;::::1;::::0;;;50955:71:::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;4865:1;50593:446:::0;:::o;67121:92::-;4826:5;;-1:-1:-1;;;;;4826:5:0;4812:10;:19;4804:54;;;;;-1:-1:-1;;;4804:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4804:54:0;;;;;;;;;;;;;;;67183:24:::1;67201:5;67183:17;:24::i;35523:395::-:0;-1:-1:-1;;;;;35626:30:0;;;;;;;:16;:30;;;;;;;35612:10;:44;35604:88;;;;;-1:-1:-1;;;35604:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35724:22:0;;;35701:20;35724:22;;;:8;:22;;;;;;;;;;35778:10;-1:-1:-1;;;;;;35753:35:0;;;;;;;;35795:16;:30;;;;;;:43;;;;;;;;35852:60;;35724:22;;;35778:10;;35724:22;;;;35852:60;;35701:20;35852:60;35523:395;;:::o;71326:162::-;71432:6;68258:31;68268:10;68280:8;;68258:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68258:9:0;;-1:-1:-1;;;68258:31:0:i;:::-;68250:53;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;;;;71457:25:::1;71473:8;71457:15;:25::i;71532:169::-:0;71641:7;68258:31;68268:10;68280:8;;68258:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68258:9:0;;-1:-1:-1;;;68258:31:0:i;:::-;68250:53;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;;;;71667:28:::1;71686:8;71667:18;:28::i;15847:562::-:0;16099:25;;16064:32;16153:5;-1:-1:-1;;;;;16099:25:0;;;;16153:5;16139:10;:19;;:61;;-1:-1:-1;16162:38:0;;;-1:-1:-1;;;16162:38:0;;16179:10;16162:38;;;;;;;;;;;;16191:8;16162:38;;;;;;-1:-1:-1;;;;;16162:16:0;;;;;16191:8;;16162:38;;;;16191:8;;;;16162:38;;;;;;;;;;;;;-1:-1:-1;;16162:38:0;;;;;-1:-1:-1;16162:38:0;;-1:-1:-1;16162:38:0;;-1:-1:-1;;;16162:38:0;;;;-1:-1:-1;16162:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16162:38:0;16139:61;16131:113;;;;;-1:-1:-1;;;16131:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16251:12;:10;:12::i;:::-;16270:133;16289:16;16307:19;16328:16;16353:23;16378:24;16270:18;:133::i;:::-;15847:562;;;;;;:::o;26988:495::-;27094:5;;-1:-1:-1;;;;;27094:5:0;27080:10;:19;;:80;;-1:-1:-1;27103:25:0;;;:57;;;-1:-1:-1;;;27103:57:0;;27139:10;27103:57;;;;;;;;;;;;27151:8;27103:57;;;;;;-1:-1:-1;;;;;27103:25:0;;;;:35;;27139:10;;27103:25;;27151:8;;27103:57;;;:25;27151:8;;27103:25;:57;;;;;;;;;;;;;-1:-1:-1;;27103:57:0;;;;;-1:-1:-1;27103:57:0;;-1:-1:-1;27103:57:0;;-1:-1:-1;;;27103:57:0;;;;-1:-1:-1;27103:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27103:57:0;27080:80;27072:132;;;;;-1:-1:-1;;;27072:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27211:15;27229:14;:12;:14::i;:::-;27272:11;;:36;;;-1:-1:-1;;;27272:36:0;;27302:4;27272:36;;;;;;27211:32;;-1:-1:-1;27250:19:0;;-1:-1:-1;;;;;27272:11:0;;;;:21;;:36;;;;;;;;;;;;;;;:11;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27272:36:0;;-1:-1:-1;27323:22:0;;;;27315:55;;;;;-1:-1:-1;;;27315:55:0;;;;;;;;;;;;-1:-1:-1;;;27315:55:0;;;;;;;;;;;;;;;27385:11;;-1:-1:-1;;;;;27385:11:0;:20;27406:10;27418:35;27422:21;;;27445:7;27418:3;:35::i;:::-;27385:69;;;;;;;;;;;;;-1:-1:-1;;;;;27385:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27385:69:0;27377:100;;;;;-1:-1:-1;;;27377:100:0;;;;;;;;;;;;-1:-1:-1;;;27377:100:0;;;;;;;;;;;;;;;26988:495;;;;:::o;56180:5508::-;56497:18;56518:9;56497:30;;57088:40;57110:7;;57119:3;;57124;;57088:21;:40::i;:::-;57069:8;:59;57061:104;;;;;-1:-1:-1;;;57061:104:0;;;;;;;;;;;;-1:-1:-1;;;57061:104:0;;;;;;;;;;;;;;;57172:19;;:::i;:::-;57234:21;;;;;;;;;57246:9;57234:21;;;;;-1:-1:-1;;;;;;57234:21:0;;;-1:-1:-1;;;57234:21:0;;;;;;;;-1:-1:-1;;;57234:21:0;;;;;;;;;;;-1:-1:-1;;;57234:21:0;;;;;;;;;;;;;;;;-1:-1:-1;;57396:7:0;;;;57375:67;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57375:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57375:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;57357:14:0;;;57322:120;-1:-1:-1;;;57323:18:0;;;57322:120;;;57686:9;;:28;57322:120;;-1:-1:-1;57656:2:0;57634:24;;;;;-1:-1:-1;;;;;;57686:44:0;;;;;;57668:105;;;;;-1:-1:-1;;;57668:105:0;;;;;;;;;;;;-1:-1:-1;;;57668:105:0;;;;;;;;;;;;;;;57822:18;;;;58149:9;;:29;;;:45;;;;;;;58141:70;;;;;-1:-1:-1;;;58141:70:0;;;;;;;;;;;;-1:-1:-1;;;58141:70:0;;;;;;;;;;;;;;;58243:9;;:19;;;58230:32;;;;58222:66;;;;;-1:-1:-1;;;58222:66:0;;;;;;;;;;;;-1:-1:-1;;;58222:66:0;;;;;;;;;;;;;;;6768:2;58305:27;;;58297:59;;;;;-1:-1:-1;;;58297:59:0;;;;;;;;;;;;-1:-1:-1;;;58297:59:0;;;;;;;;;;;;;;;58373:24;;;58365:67;;;;;-1:-1:-1;;;58365:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6768:2;58449:1;:14;;;:21;:38;;58441:96;;;;;-1:-1:-1;;;58441:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58582:1;:9;;;:19;;;58578:1;:23;58554:47;;:1;:14;;;:21;:47;58546:105;;;;;-1:-1:-1;;;58546:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58744:3;-1:-1:-1;;;;;58734:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58734:21:0;-1:-1:-1;58727:4:0;;;:28;58769:7;58764:79;58782:14;;;;-1:-1:-1;58764:79:0;;;58824:6;58831:1;58824:9;;;;;;;;;;;;58814:1;:4;;;58819:1;58814:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;58814:19:0;;;;;;;;-1:-1:-1;58798:3:0;;58764:79;;;;58957:1;:14;;;:21;-1:-1:-1;;;;;58947:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58947:32:0;-1:-1:-1;58933:11:0;;;:46;58988:31;;:::i;:::-;59033:7;59028:256;59050:1;:14;;;:21;59046:1;:25;;;59028:256;;;59089:17;59115:12;59128:1;59115:15;;;;;;;;;;;-1:-1:-1;59151:4:0;59115:15;59151:17;;;;;;;;;;;59150:18;59142:54;;;;;-1:-1:-1;;;59142:54:0;;;;;;;;;;;;-1:-1:-1;;;59142:54:0;;;;;;;;;;;;;;;59227:4;59207;59212:11;59207:17;;;;;;;;;:24;;;:17;;;;;;;;:24;59259:12;;:15;;;;;;;;;;;;;59242:1;:11;;;59254:1;59242:14;;;;;;;;;;;;;:32;-1:-1:-1;;;;;59242:32:0;;;;;;;;-1:-1:-1;;59073:3:0;;59028:256;;;-1:-1:-1;59332:10:0;59294:25;59322:21;;;:9;:21;;;;;;;;59294:49;;;;;;;;;;;;;;;;;;59322:21;;59294:49;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59294:49:0;-1:-1:-1;59435:16:0;59415:11;:16;;;:36;;;;;;;;;:96;;;;;59478:14;59493:11;:17;;;59478:33;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59478:33:0;59464:10;:47;59415:96;59352:205;;;;;-1:-1:-1;;;59352:205:0;;;;;;;;;;;;-1:-1:-1;;;59352:205:0;;;;;;;;;;;;;;;-1:-1:-1;;59725:9:0;;:45;;;;:29;;;;:45;-1:-1:-1;;59847:18:0;;59725:9;;59857:7;;;;59847:18;59857:7;;;;59847:18;;;;;;;;;;;;;-1:-1:-1;59874:33:0;;-1:-1:-1;59874:33:0;;-1:-1:-1;;;59874:33:0:i;:::-;59918:15;;:::i;:::-;59947:6;59942:323;59959:14;;;59942:323;;;59991:14;60008:47;60018:1;60027;:4;;;60032:1;60027:7;;;;;;;;;;;;;;;60036:2;60021:17;60040:3;;60044:1;60040:6;;;;;;;;;;;;;60048:3;;60052:1;60048:6;;;;;;;;;;;;;60008:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60008:47:0;;;-1:-1:-1;;60008:47:0;;;-1:-1:-1;;;;;60070:17:0;;;;;;:9;60008:47;60070:17;;;;;;;60066:21;;;;;;;;;;;;;;60008:47;;-1:-1:-1;60008:47:0;;-1:-1:-1;60066:21:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60066:21:0;-1:-1:-1;60116:11:0;60106:1;:6;;;:21;;;;;;;;;60098:64;;;;;-1:-1:-1;;;60098:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;60189:7;;60182:6;;:15;;;;;;;;;;;;;60181:16;60173:49;;;;;-1:-1:-1;;;60173:49:0;;;;;;;;;;;;-1:-1:-1;;;60173:49:0;;;;;;;;;;;;;;;60251:4;60233:6;60240:1;:7;;;60233:15;;;;;;;;;:22;;;:15;;;;;:22;-1:-1:-1;59975:3:0;;59942:323;;;;56180:5508;;;60346:6;60341:183;60386:1;60362;:14;;;:21;:25;60358:1;:29;60341:183;;;60405:12;60441:1;:14;;;60456:1;60458;60456:3;60441:19;;;;;;;;;;;;;;60420:40;;:1;:14;;;60435:1;60420:17;;;;;;;;;;;;;;:40;;;;60405:55;;60479:7;60471:43;;;;;-1:-1:-1;;;60471:43:0;;;;;;;;;;;;-1:-1:-1;;;60471:43:0;;;;;;;;;;;;;;;-1:-1:-1;60389:3:0;;60341:183;;;-1:-1:-1;60550:14:0;;;;60565:21;;60534:13;;60550:14;60587:1;60565:23;;;60550:39;;;;;;;;;;;;60534:55;;60619:6;60606:19;;:9;:19;;;;:42;;;;;60639:9;60629:19;;:6;:19;;;;60606:42;60598:85;;;;;-1:-1:-1;;;60598:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;60692:9;;:33;;;;:35;;;;;;;;;;;;60798:45;;;;;;;;;;;;;;;-1:-1:-1;;;;;60826:15:0;60798:45;;-1:-1:-1;60798:45:0;;;;;;60752:9;;:33;;;60736:50;;60692:9;60736:50;;;:15;:50;;;;;:107;;;;;;;;;-1:-1:-1;;;60736:107:0;;;;;-1:-1:-1;;;;;60736:107:0;;;-1:-1:-1;;;;;;60736:107:0;;;;;;;;;;;;;;;;;60885:9;;:33;;;60967:14;;;;60992:11;;;;61014:18;;;;;60859:182;;;;;60946:10;60859:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60811:6;;60946:10;;60967:14;;60992:11;;61014:18;;60859:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61189:9;;:33;;;61170:184;;;61330:15;61170:184;;;;61241:3;;61170:184;;;;;;;;;;;;;61409:1;:9;;;:33;;;61368:109;;61392:6;61368:109;;;61453:15;61368:109;;;;;;;;;;;;;;;;;;61488:57;61503:1;:9;;;:33;;;61538:6;61488:57;;:14;:57::i;:::-;-1:-1:-1;61571:9:0;;61559:21;;:9;:21;;;;;;;;;;;;;;;-1:-1:-1;;;;;;61559:21:0;;;;;;;;;;;;-1:-1:-1;;;;61559:21:0;-1:-1:-1;;;61559:21:0;;;;;;;;;;;;-1:-1:-1;;;;61559:21:0;-1:-1:-1;;;61559:21:0;;;;;;;;;;;;-1:-1:-1;;;;61559:21:0;-1:-1:-1;;;61559:21:0;;;;;;;;;61594:22;;61587:30;;;;61624:58;61657:10;61670:1;:11;;;61624:25;:58::i;:::-;56180:5508;;;;;;;;;:::o;29146:518::-;29343:11;;:36;;;-1:-1:-1;;;29343:36:0;;29373:4;29343:36;;;;;;29219:23;;;;-1:-1:-1;;;;;29343:11:0;;;;:21;;:36;;;;;;;;;;;;;;;:11;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29343:36:0;;-1:-1:-1;29528:10:0;29548:14;:12;:14::i;:::-;29629:29;;;;-1:-1:-1;;29146:518:0;:::o;66450:24::-;;;;;;:::o;29849:286::-;-1:-1:-1;;;;;29990:31:0;;29949:6;29990:31;;;:9;:31;;;;;;;;29967:54;;;;;;;;;;;;;;;;29949:6;;29967:54;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29967:54:0;-1:-1:-1;30047:10:0;30032:6;:11;;;:25;;;;;;;;;30028:44;;;30068:1;30061:8;;;;;30028:44;30128:1;30085:26;30112:6;:12;;;30085:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;30078:51;;;29849:286;;;:::o;53794:572::-;53877:20;;;;;54023:10;54037:9;54023:23;54015:56;;;;;-1:-1:-1;;;54015:56:0;;;;;;;;;;;;-1:-1:-1;;;54015:56:0;;;;;;;;;;;;;;;-1:-1:-1;;54094:9:0;:28;54138:34;-1:-1:-1;;;54243:33:0;;;;54094:28;54227:50;;;:15;:50;;;;;:57;54094:28;;;;;-1:-1:-1;;;54138:29:0;;;54171:1;54138:34;;;;;;;-1:-1:-1;54138:29:0;;;;;-1:-1:-1;54227:57:0;;;;;-1:-1:-1;;;;54293:60:0;;-1:-1:-1;;;;;54293:60:0;;53794:572::o;13812:125::-;13920:11;;-1:-1:-1;;;;;13920:11:0;13812:125;:::o;48099:508::-;4826:5;;-1:-1:-1;;;;;4826:5:0;4812:10;:19;4804:54;;;;;-1:-1:-1;;;4804:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4804:54:0;;;;;;;;;;;;;;;48231:51:::1;::::0;;;;::::1;::::0;;;48265:17:::1;48231:51:::0;-1:-1:-1;;;;;48231:51:0;;::::1;::::0;;;-1:-1:-1;;;48231:51:0;;::::1;;;;::::0;::::1;::::0;48295:35;::::1;;;::::0;:72:::1;;;48355:12;48334:33;;:8;:17;;;:33;;;;48295:72;48291:311;;;48398:94;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;48398:94:0;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;48378:17:::1;:114:::0;;-1:-1:-1;;;;;;48378:114:0::1;::::0;::::1;-1:-1:-1::0;;;;48378:114:0::1;-1:-1:-1::0;;;48378:114:0;::::1;;::::0;;48527:18;;48547:17;;::::1;::::0;48508:86;;;::::1;::::0;;;;::::1;::::0;;;48398:94;;48508:86;;;::::1;::::0;::::1;::::0;;;;;;::::1;48291:311;4865:1;48099:508:::0;;:::o;34777:514::-;-1:-1:-1;;;;;34908:22:0;;;;;;;:8;:22;;;;;;;34894:10;:36;34886:78;;;;;-1:-1:-1;;;34886:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34981:10;-1:-1:-1;;;;;34981:23:0;;;;34973:59;;;;;-1:-1:-1;;;34973:59:0;;;;;;;;;;;;-1:-1:-1;;;34973:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35070:30:0;;;35043:24;35070:30;;;:16;:30;;;;;;;35109:42;;;-1:-1:-1;;;;;;35109:42:0;;;;;;;35070:30;;;;35166:29;;35162:124;;35213:63;;-1:-1:-1;;;;;35213:63:0;;;;35254:10;;35213:63;;;;;;;;34777:514;;;:::o;4171:157::-;4826:5;;-1:-1:-1;;;;;4826:5:0;4812:10;:19;4804:54;;;;;-1:-1:-1;;;4804:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4804:54:0;;;;;;;;;;;;;;;4252:12:::1;:18:::0;;-1:-1:-1;;;;;;4252:18:0::1;-1:-1:-1::0;;;;;4252:18:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;4311:5:0;;4284:38:::1;::::0;4252:18;;4311:5:::1;::::0;4284:38:::1;::::0;-1:-1:-1;4284:38:0::1;4171:157:::0;:::o;18385:193::-;4826:5;;-1:-1:-1;;;;;4826:5:0;4812:10;:19;4804:54;;;;;-1:-1:-1;;;4804:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4804:54:0;;;;;;;;;;;;;;;18512:60:::1;18547:24;18512:34;:60::i;72321:277::-:0;72425:14;72448:13;72470:17;72496;72522:22;68258:31;68268:10;68280:8;;68258:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68258:9:0;;-1:-1:-1;;;68258:31:0:i;:::-;68250:53;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;-1:-1:-1;;;68250:53:0;;;;;;;;;;;;;;;72569:23:::1;:21;:23::i;:::-;72562:30;;;;;;;;;;72321:277:::0;;;;;:::o;21316:1469::-;21362:34;;;;;;;;21387:9;21362:34;;;;;;;-1:-1:-1;;;21362:34:0;;;;;;;;-1:-1:-1;;;21362:34:0;;;;;;;;-1:-1:-1;;;21362:34:0;;;;;;;;-1:-1:-1;;;21362:34:0;;;;;;;;21434:11;;21452:76;;;;;;;;;21362:34;;-1:-1:-1;;;;;21434:11:0;;;;-1:-1:-1;;21502:26:0;;21452:76;;21502:26;-1:-1:-1;21452:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21535:90:0;;;;;;;;;;21452:76;;-1:-1:-1;;;21535:90:0;-1:-1:-1;21599:26:0;;-1:-1:-1;21535:90:0;;-1:-1:-1;21535:90:0;-1:-1:-1;21599:26:0;21535:90;;;;;;;;;;;;;;;;;;;;;;;;21632:29;21664:14;21632:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21632:46:0;;;;;;;;;;;;;;;;;;;;;;;21690:19;21685:933;21732:12;:19;21715:14;:36;21685:933;;;21780:34;21860:1;21817:24;21842:14;21817:40;;;;;;;;;;;:44;21780:81;;21870:16;21926:1;21889:18;21908:14;21889:34;;;;;;;;;;;:38;21870:57;;;;21936:21;22033:26;21988:7;:30;;;21980:39;;21969:8;:50;22023:6;21969:61;:90;21936:123;;22088:1;22072:13;:17;22068:543;;;22104:13;22120:8;:38;22129:12;22142:14;22129:28;;;;;;;;;;;;;;-1:-1:-1;;;;;22120:38:0;-1:-1:-1;;;;;22120:38:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22120:38:0;22104:54;;22287:9;-1:-1:-1;;;;;22287:18:0;;22306:5;22313:13;22287:40;;;;;;;;;;;;;-1:-1:-1;;;;;22287:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22287:40:0;22279:71;;;;;-1:-1:-1;;;22279:71:0;;;;;;;;;;;;-1:-1:-1;;;22279:71:0;;;;;;;;;;;;;;;22400:1;22363:18;22382:14;22363:34;;;;;;;:38;;;;:34;;;;;;:38;22485:1;22442:24;22467:14;22442:40;;;;;;;;;;:44;;;;;22589:9;-1:-1:-1;;;;;22526:73:0;22567:5;-1:-1:-1;;;;;22526:73:0;22537:12;22550:14;22537:28;;;;;;;;;;;;;;-1:-1:-1;;;;;22526:73:0;;22574:13;22526:73;;;;;;;;;;;;;;;;;;22068:543;;-1:-1:-1;;;21753:16:0;;21685:933;;;-1:-1:-1;22672:47:0;:26;22701:18;22672:47;;:::i;:::-;-1:-1:-1;22726:53:0;:26;22755:24;22726:53;;:::i;61802:175::-;61930:9;:33;-1:-1:-1;;;61930:33:0;;;;61889:6;61914:50;;;:15;:50;;;;;:57;;;;;61907:64;;;61802:175::o;20418:702::-;-1:-1:-1;;;;;20506:23:0;;20483:20;20506:23;;;:9;:23;;;;;;;;20483:46;;;;;;;;;;;;;;;;;;20506:23;;20483:46;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20483:46:0;-1:-1:-1;20536:21:0;20560:25;20572:12;20560:11;:25::i;:::-;20536:49;-1:-1:-1;20596:17:0;;20592:523;;-1:-1:-1;;;;;20640:22:0;;;20624:13;20640:22;;;:8;:22;;;;;;;;;20779:11;;:42;;-1:-1:-1;;;20779:42:0;;20640:22;;;20779:42;;;;;;;;;;;;;;20640:22;;20779:11;;:20;;:42;;;;;20640:22;;20779:42;;;;;;;;;;:11;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20779:42:0;20771:73;;;;;-1:-1:-1;;;20771:73:0;;;;;;;;;;;;-1:-1:-1;;;20771:73:0;;;;;;;;;;;;;;;20896:1;20853:26;20880:6;:12;;;20853:40;;;;;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;20991:1;20948:26;20975:6;:12;;;20948:40;;;;;;;;;;:44;21095:11;;21048:59;;;;;;;;-1:-1:-1;;;;;21095:11:0;;;;21048:59;;;;;;;;;;;;;;;;;20592:523;20418:702;;;:::o;45287:468::-;45575:7;45627:16;45645:12;45666:8;;45676:13;;45691:10;45703:21;45726:14;;45616:131;;;;;;-1:-1:-1;;;;;45616:131:0;;;;;;-1:-1:-1;;;;;45616:131:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45616:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45616:131:0;;;;;;;;;;;;;;;;;-1:-1:-1;45616:131:0;;;;;;;;;;;;;;;-1:-1:-1;;45616:131:0;;;;;;;;;;;;;;;-1:-1:-1;45616:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45606:142;;;;;;45591:158;;45287:468;;;;;;;;;;;;:::o;62353:151::-;62465:9;:33;-1:-1:-1;;;62465:33:0;;;;;62353:151::o;66825:189::-;-1:-1:-1;;;;;66974:17:0;;66951:4;66974:17;;;:10;:17;;;;;;;;;:34;;-1:-1:-1;;66996:12:0;;;;66995:13;;66825:189;-1:-1:-1;;66825:189:0:o;63801:137::-;63919:13;63912:20;;;;;;;;-1:-1:-1;;63912:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63887:13;;63912:20;;63919:13;;63912:20;;63919:13;63912:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63912:20:0;;63801:137;-1:-1:-1;;;;;63801:137:0:o;62067:182::-;62199:9;:33;-1:-1:-1;;;62199:33:0;;;;62157:7;62183:50;;;:15;:50;;;;;:60;-1:-1:-1;;;62183:60:0;;-1:-1:-1;;;;;62183:60:0;;62067:182::o;64411:522::-;64521:14;64544:13;64566:17;64592;64618:22;64678:10;64666:8;-1:-1:-1;;;;;64666:22:0;;;64690:16;;;;;;;;;;;;;-1:-1:-1;;;64690:16:0;;;64658:49;;;;;-1:-1:-1;;;64658:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;64749:33:0;;;64714:32;64749:33;;;:15;:33;;;;;;;;;64714:68;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64714:68:0;;;-1:-1:-1;;;;;64714:68:0;;;;;;;;64749:33;;64789:138;;;;64714:68;;-1:-1:-1;64714:68:0;;-1:-1:-1;64749:33:0;;64411:522::o;67219:160::-;-1:-1:-1;;;;;67282:17:0;;;;;;:10;:17;;;;;;;;67277:97;;-1:-1:-1;;;;;67310:17:0;;;;;;:10;:17;;;;;;;;;:24;;-1:-1:-1;;67310:24:0;67330:4;67310:24;;;67348:18;;;;;;;;;;;;;;;;;67219:160;:::o;62663:217::-;62763:6;62796:10;62785:8;:21;62781:40;;;-1:-1:-1;62817:1:0;62810:8;;62781:40;-1:-1:-1;62834:33:0;;;;;;:15;:33;;;;;:40;;;;;62827:47;;;62663:217::o;63065:224::-;63168:7;63202:10;63191:8;:21;63187:40;;;-1:-1:-1;63223:1:0;63216:8;;63187:40;-1:-1:-1;63240:33:0;;;;;;:15;:33;;;;;:43;-1:-1:-1;;;63240:43:0;;-1:-1:-1;;;;;63240:43:0;;63065:224::o;14711:502::-;14948:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14936:9;:134;;-1:-1:-1;;14936:134:0;;;-1:-1:-1;;;;14936:134:0;-1:-1:-1;;;14936:134:0;;;-1:-1:-1;;;;14936:134:0;-1:-1:-1;;;14936:134:0;;;-1:-1:-1;;;;14936:134:0;-1:-1:-1;;;14936:134:0;;;-1:-1:-1;;;;14936:134:0;-1:-1:-1;;;14936:134:0;;;;;15082:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14711:502;;;;;:::o;27543:1373::-;28190:75;;;;;;;;;;-1:-1:-1;;;;28190:75:0;28239:26;;28190:75;;28239:26;-1:-1:-1;28190:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28277:6;28272:142;6768:2;28289:1;:17;28272:142;;;28356:1;28333:17;28351:1;28333:20;;;;;;;;;;;:24;28322:35;;;;;;;28308:3;;28272:142;;;-1:-1:-1;28420:34:0;;;;;;;;28445:9;28420:34;;;;;;;-1:-1:-1;;;28420:34:0;;;;;;;;;;;;-1:-1:-1;;;28420:34:0;;;;;;;;-1:-1:-1;;;28420:34:0;;;;;;;;;;-1:-1:-1;;;28420:34:0;;;;;;;;;;28631:14;28599:46;;;;;;;;;;;;;;;;;28531:61;;;;28585:6;28531:61;;28420:34;;:22;;28599:46;;28631:14;28599:46;;28631:14;28599:46;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28599:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;28652:90:0;;;;;;;;;;28599:46;;-1:-1:-1;;;28652:90:0;-1:-1:-1;28716:26:0;;-1:-1:-1;28652:90:0;;-1:-1:-1;28716:26:0;28652:90;;;;;;;;;;;;;;;;;;;;;;;;28754:6;28749:162;28770:12;:19;28766:1;:23;28749:162;;;28852:1;28824:24;28849:1;28824:27;;;;;;;;;;;:29;28805:49;;;;;28791:3;;28749:162;;;;27543:1373;;;;;:::o;36135:136::-;36208:7;36235:1;36231;:5;36227:24;;;-1:-1:-1;36247:1:0;36240:8;;36227:24;-1:-1:-1;36264:1:0;36135:136;-1:-1:-1;36135:136:0:o;55071:481::-;55489:2;55422:15;;;55303:134;;55476:15;;;55303:188;54653:396;55303:188;55071:481;;;;;;;;:::o;48613:687::-;48718:45;;;;;;;;;48746:17;48718:45;-1:-1:-1;;;;;48718:45:0;;;;;-1:-1:-1;;;48718:45:0;;;;;;;;;48772:64;;48822:7;;;48772:64;-1:-1:-1;;48875:22:0;;48939:38;;;;48844:28;48939:38;;;:15;:38;;;;;;;;:45;49130:12;;49157:11;;;;49130:153;;-1:-1:-1;;;49130:153:0;;;;;;;;;48939:45;;;;48904:80;;;49130:153;;;;;;;;;;;;;;;;;;;;;48904:80;;-1:-1:-1;;;;;49130:21:0;;;;;;:153;;;;;;;;;;48939:38;;49130:153;;;;;;;;;:21;:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49130:153:0;;;49126:169;;;;30143:2403;30295:10;30260:22;30285:21;;;:9;:21;;;;;;;;30260:46;;;;;;;;;;;;;;;;;;30285:21;;30260:46;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30313:34:0;;;;;;;;30338:9;30313:34;;;;;;;-1:-1:-1;;;30313:34:0;;;;;;;;-1:-1:-1;;;30313:34:0;;;;;;;;-1:-1:-1;;;30313:34:0;;;;;;;;-1:-1:-1;;;30313:34:0;;;;;;;;30537:52;;;;;;;;;30260:46;;-1:-1:-1;30313:34:0;30537:52;;30551:9;;30537:52;30562:26;;30537:52;;30562:26;-1:-1:-1;30537:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:52::i;:::-;30501:88;;:26;;:88;;:::i;:::-;-1:-1:-1;30679:16:0;30662:8;:13;;;:33;;;;;;;;;30654:91;;;;;-1:-1:-1;;;30654:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30752:16;30771:149;30810:6;30795:11;:22;30855:7;:26;;;30771:149;;30890:7;:23;;;30771:149;;:15;:149::i;:::-;30752:168;-1:-1:-1;31110:2:0;31115:8;31110:20;31084:23;31263:9;31245:27;;31279:21;31303:116;31344:10;31336:19;;31364:8;31381:15;31405:7;31303:24;:116::i;:::-;-1:-1:-1;;;;;31279:140:0;;;31806:22;31874:3;31848:7;:23;;;31832:39;;:13;:39;31831:46;;;;;;31806:71;;32227:7;:31;;;32219:40;;32263:6;32219:51;32195:14;32150:26;32177:8;:14;;;32150:42;;;;;;;;;;;:59;:120;32098:26;32125:8;:14;;;32098:42;;;;;;;;;;:172;-1:-1:-1;;;;;;;;;30143:2403:0:o;17780:423::-;17942:25;;-1:-1:-1;;;;;17942:25:0;;;;17978:41;;;;17974:224;;18030:25;:52;;-1:-1:-1;;;;;;18030:52:0;-1:-1:-1;;;;;18030:52:0;;;;;;;;;18096:94;;;;;;;;;;;;;;;;;;;;;;;;;;;17780:423;;:::o;65344:657::-;65589:9;:33;-1:-1:-1;;;65589:33:0;;;;65442:14;65820:32;;;:15;:32;;;;;;;;;65785:67;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65785:67:0;;;-1:-1:-1;;;;;65785:67:0;;;;;;;;65589:33;;65859:136;;;;65785:67;;65589:33;;65344:657::o;22791:477::-;22934:28;;:::i;:::-;23045:11;23040:197;23071:9;:16;23062:6;:25;23040:197;;;23108:14;23131:9;23141:6;23131:17;;;;;;;;;;;;;;;-1:-1:-1;23183:46:0;23203:12;23131:17;23203:22;;;;;;;;;;;23227:1;23183:19;:46::i;:::-;23158:12;23171:8;23158:22;;;;;;;;;:71;;;;:22;;;;;;:71;-1:-1:-1;23089:8:0;;23040:197;;;-1:-1:-1;23250:12:0;;22791:477;-1:-1:-1;;22791:477:0:o;24873:848::-;25107:7;25399:10;25420:31;;;25416:192;;;25599:1;25564:31;;;25563:37;25551:49;25416:192;25685:30;25689:8;25699:15;25685:3;:30::i;:::-;25678:37;24873:848;-1:-1:-1;;;;;24873:848:0:o;25888:748::-;26097:21;26152:7;26138:10;:21;;26130:66;;;;;-1:-1:-1;;;26130:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26241:20;;;:64;;24523:4;26241:84;26492:6;26470:18;;;:29;-1:-1:-1;;;;;26513:30:0;;26506:38;;;;26612:17;25888:748;-1:-1:-1;;;;;;25888:748:0:o;35962:167::-;36051:6;36083:39;36107:2;36099:11;;36095:2;36087:11;;:23;10886:13;36083:3;:39::i;-1:-1:-1:-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://52ec884bb73b07df8765d45f7fd81f45893fdf5b3ac3f7893e7d9ae0e968d8e2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.