Contract 0xa47f3fac2273d138295aef7b4326630f301a3ab2

Contract Overview

Balance:
0 AVAX

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x709df38274f7116213e94d027dd8867e6a2fa1fdd3bc6a7725f0c2499d244427Transmit166894172022-12-08 9:57:1113 hrs 7 mins ago0xf23d812bb3a57478d681d6ccbc50469ca237c05e IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.0034232726.5
0x1bb336d4336c2fbf54eddd11e9f7a833e3ddbdc052e5d65f78ba1c2c5a7d29d4Transmit166518492022-12-07 9:56:391 day 13 hrs ago0xa8be5f4effd6b3e69c777acfd3d4eb6a45894ed8 IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.00080273727
0xb8dadbbe06a6b1573d020f73e5591c47b255a9b7cae77dcc08afc35cd599636aTransmit166518492022-12-07 9:56:391 day 13 hrs ago0x77ea71fdc9c2d6e345d41d87bfee5a73d02cfbac IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.00348688827
0x915217de6f976270992b78c70c364816ba848bcffe41707ef49ec4a9700531fdTransmit166147002022-12-06 9:55:372 days 13 hrs ago0x77ea71fdc9c2d6e345d41d87bfee5a73d02cfbac IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.00080370927
0xafaaf80913f78b20acd72e8ad4473c3a1d58008d6dba0d35180459c35522c7b2Transmit166146992022-12-06 9:55:352 days 13 hrs ago0xa8be5f4effd6b3e69c777acfd3d4eb6a45894ed8 IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.0034878627
0xf84965a822904ae434d1f799482ee5cd914f0af877a2a36beaf0e70c1886c64dTransmit165748852022-12-05 9:54:043 days 13 hrs ago0xa8be5f4effd6b3e69c777acfd3d4eb6a45894ed8 IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.0038746830
0xdc2652e2780292eb52b23006d33b42517dd31b7b84d1be8e953810982e73003eTransmit165382482022-12-04 9:54:014 days 13 hrs ago0x77ea71fdc9c2d6e345d41d87bfee5a73d02cfbac IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.0038746830
0xdfbabf70fa45cf339f396ce8b76d0c4b9ca4fcb58f6958f06781542bc52c232aTransmit165015942022-12-03 9:53:585 days 13 hrs ago0xf23d812bb3a57478d681d6ccbc50469ca237c05e IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.0035524527.5
0x8ee017ffbc3dca8582e6ed0009b23622b438970955a99a6995742d8591546eb1Transmit164635812022-12-02 9:53:566 days 13 hrs ago0xa8be5f4effd6b3e69c777acfd3d4eb6a45894ed8 IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.00342231626.5
0x700233fa52909a025ecfbae2d9de02e48d2bd20622d7e3fb1939bb73841e69cdTransmit164234002022-12-01 9:53:547 days 13 hrs ago0xf23d812bb3a57478d681d6ccbc50469ca237c05e IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.000817602527.5
0x65176415d4b3b6775da6083f4eab9ede550f2a814cc6f45bf1b64a4dbb3a2046Transmit164234002022-12-01 9:53:547 days 13 hrs ago0x77ea71fdc9c2d6e345d41d87bfee5a73d02cfbac IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.0035514627.5
0x75cf13e1a9968a460b3ff12cfabf7c508ec9e413bc5f37e87742e2bea5b5d4e4Transmit163836252022-11-30 9:52:368 days 13 hrs ago0xf23d812bb3a57478d681d6ccbc50469ca237c05e IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.000817602527.5
0x1771ee46a07deb5108d1452cfa40d7af9b1c0c0e77c8a99688cbb625150262b8Transmit163836252022-11-30 9:52:368 days 13 hrs ago0x77ea71fdc9c2d6e345d41d87bfee5a73d02cfbac IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.0035514627.5
0x634238e44c20e4d93286c1418559238a4f467fe343e414a9cd48acf5a4289569Transmit163450442022-11-29 9:51:039 days 13 hrs ago0xa8be5f4effd6b3e69c777acfd3d4eb6a45894ed8 IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.00351475219527.213232025
0x6619e90800cbcf749e552b59693db4c55c0c2dcad3bf65a9615838b9374e63d5Transmit163078672022-11-28 9:50:5510 days 13 hrs ago0xf23d812bb3a57478d681d6ccbc50469ca237c05e IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.00348721227
0x03f5fcfe8810a50e864ade33804053d3fc0fe1a55f3ad714af407e0b618f689aTransmit162711862022-11-27 9:50:2311 days 13 hrs ago0xa8be5f4effd6b3e69c777acfd3d4eb6a45894ed8 IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.003855664829.85
0xeab1bc2cf262c440db29db149e012efc910b460e5bf6b9caa2e1434fb0713c55Transmit162337942022-11-26 9:49:5212 days 13 hrs ago0x77ea71fdc9c2d6e345d41d87bfee5a73d02cfbac IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.00381828596929.563365
0x35c508499e40946172e9768539f0758b8b484135ee4ed09a882f1290c1af49e7Transmit161957812022-11-25 9:49:1913 days 13 hrs ago0xf23d812bb3a57478d681d6ccbc50469ca237c05e IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.0008885449529.85
0x0d057d2acb725830f9fa26046f455e3f01e4cb167a55bc12bad72093ceb68401Transmit161957812022-11-25 9:49:1913 days 13 hrs ago0x77ea71fdc9c2d6e345d41d87bfee5a73d02cfbac IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.00385602329.85
0x44dbc0341779cbc0f7f1463e4a60abf594a198fc4b38b8bb690e915c37607c45Transmit161890752022-11-25 5:44:4913 days 17 hrs ago0xf23d812bb3a57478d681d6ccbc50469ca237c05e IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.00381828596929.563365
0x8861510dfde855150a63a5580c294a4e03004e8a11e683f53a938842815dfbeeTransmit161496882022-11-24 5:44:2814 days 17 hrs ago0xa8be5f4effd6b3e69c777acfd3d4eb6a45894ed8 IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.00348753627
0x5adc83b6a8bb930f7565f1ce060ed60ac0c9acaf01adb0559d666f85f8ca1172Transmit161120932022-11-23 5:44:2515 days 17 hrs ago0xf23d812bb3a57478d681d6ccbc50469ca237c05e IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.0038750430
0x2de447113250120e9d085ddd3c9ef316d5b29f01c4fa8ddf84412ed94fa3e754Transmit160742282022-11-22 5:43:5416 days 17 hrs ago0x77ea71fdc9c2d6e345d41d87bfee5a73d02cfbac IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.0038750430
0x6fbc12131d8660545357609137b5fb3bdf4c7a7403ec05a5152b6e351fa1e35cTransmit160376532022-11-21 5:43:2317 days 17 hrs ago0x77ea71fdc9c2d6e345d41d87bfee5a73d02cfbac IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.0038746830
0xed44d5a5dbc0249c3dd5872fb09ad0fcdba0b1d6d5cdd0b4b498c06a90004782Transmit160003312022-11-20 5:42:5018 days 17 hrs ago0xa8be5f4effd6b3e69c777acfd3d4eb6a45894ed8 IN  0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX0.00353303542827.35225
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x9e879cbd5b5b61d5f89bb76e50100ade5742e32b8441f11fe0aa2aed43f8fdb0167002762022-12-08 16:22:136 hrs 42 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x9e879cbd5b5b61d5f89bb76e50100ade5742e32b8441f11fe0aa2aed43f8fdb0167002762022-12-08 16:22:136 hrs 42 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x9e879cbd5b5b61d5f89bb76e50100ade5742e32b8441f11fe0aa2aed43f8fdb0167002762022-12-08 16:22:136 hrs 42 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x8aefbc56df8d1d190ff38e1567ff3699f43c7d5632961e758d683efb0eacc5aa166967772022-12-08 14:16:398 hrs 48 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x2299865af26c425fd6dc0e44141572e2879a02b5da02e02308dc9e30300240b0166967772022-12-08 14:16:398 hrs 48 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x2299865af26c425fd6dc0e44141572e2879a02b5da02e02308dc9e30300240b0166967772022-12-08 14:16:398 hrs 48 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x976bcc042f1a313b65b89e1b926063c9e806cb9eb19479dd924dcae59003d1d4166948472022-12-08 13:08:589 hrs 56 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x976bcc042f1a313b65b89e1b926063c9e806cb9eb19479dd924dcae59003d1d4166948472022-12-08 13:08:589 hrs 56 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x976bcc042f1a313b65b89e1b926063c9e806cb9eb19479dd924dcae59003d1d4166948472022-12-08 13:08:589 hrs 56 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x69e5f5411239e78eafd69723b3d127a1548be3c5dfa97c6ff7fc71e2ed36a87c166931392022-12-08 12:08:4210 hrs 56 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x69e5f5411239e78eafd69723b3d127a1548be3c5dfa97c6ff7fc71e2ed36a87c166931392022-12-08 12:08:4210 hrs 56 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x69e5f5411239e78eafd69723b3d127a1548be3c5dfa97c6ff7fc71e2ed36a87c166931392022-12-08 12:08:4210 hrs 56 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x69e5f5411239e78eafd69723b3d127a1548be3c5dfa97c6ff7fc71e2ed36a87c166931392022-12-08 12:08:4210 hrs 56 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x709df38274f7116213e94d027dd8867e6a2fa1fdd3bc6a7725f0c2499d244427166894172022-12-08 9:57:1113 hrs 7 mins ago 0xa47f3fac2273d138295aef7b4326630f301a3ab20x00000000000000000000000000000000000000010 AVAX
0x709df38274f7116213e94d027dd8867e6a2fa1fdd3bc6a7725f0c2499d244427166894172022-12-08 9:57:1113 hrs 7 mins ago 0xa47f3fac2273d138295aef7b4326630f301a3ab20x00000000000000000000000000000000000000010 AVAX
0x78a543d6f5b8da92e4eac3587a3b07eb4992623e8e2d055669dc8d75c0e8c5e4166881222022-12-08 9:12:4213 hrs 52 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x78a543d6f5b8da92e4eac3587a3b07eb4992623e8e2d055669dc8d75c0e8c5e4166881222022-12-08 9:12:4213 hrs 52 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x78a543d6f5b8da92e4eac3587a3b07eb4992623e8e2d055669dc8d75c0e8c5e4166881222022-12-08 9:12:4213 hrs 52 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x8e7bb50f37967b290fe3c16e1c6b5a42d7f8e65343d5186398b9de929fa743ac166881132022-12-08 9:12:2413 hrs 52 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x8e7bb50f37967b290fe3c16e1c6b5a42d7f8e65343d5186398b9de929fa743ac166881132022-12-08 9:12:2413 hrs 52 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x8e7bb50f37967b290fe3c16e1c6b5a42d7f8e65343d5186398b9de929fa743ac166881132022-12-08 9:12:2413 hrs 52 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0xb5daba5598a30c2bdfff42cf405b05d510062ee0c42aa31eed40808a887a8a1e166878572022-12-08 9:03:2814 hrs 1 min ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0xb5daba5598a30c2bdfff42cf405b05d510062ee0c42aa31eed40808a887a8a1e166878572022-12-08 9:03:2814 hrs 1 min ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0xb5daba5598a30c2bdfff42cf405b05d510062ee0c42aa31eed40808a887a8a1e166878572022-12-08 9:03:2814 hrs 1 min ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0xe87b34c40e076dd3e8c28b83aed03eaf7bbcf7e621a2b9915be729a900b7963f166875492022-12-08 8:52:3414 hrs 12 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xEC95B4b38245689EDcF3E2e48B098257D06eAbBc

Contract Name:
AccessControlledOffchainAggregator

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 17 : AccessControlledOffchainAggregator.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.1;

import "./OffchainAggregator.sol";
import "./SimpleReadAccessController.sol";

/**
 * @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,
    address _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 2.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();
  }

}

File 2 of 17 : OffchainAggregator.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

import "./AccessControllerInterface.sol";
import "./AggregatorV2V3Interface.sol";
import "./AggregatorValidatorInterface.sol";
import "./LinkTokenInterface.sol";
import "./Owned.sol";
import "./OffchainAggregatorBilling.sol";
import "./TypeAndVersionInterface.sol";

/**
  * @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,
    address _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 2.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 3 of 17 : SimpleReadAccessController.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.1;

import "./SimpleWriteAccessController.sol";

/**
 * @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 4 of 17 : 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 5 of 17 : AggregatorV2V3Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

import "./AggregatorInterface.sol";
import "./AggregatorV3Interface.sol";

interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface
{
}

File 6 of 17 : AggregatorValidatorInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

interface AggregatorValidatorInterface {
  function validate(
    uint256 previousRoundId,
    int256 previousAnswer,
    uint256 currentRoundId,
    int256 currentAnswer
  ) external returns (bool);
}

File 7 of 17 : LinkTokenInterface.sol
// SPDX-License-Identifier: MIT
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 8 of 17 : Owned.sol
// SPDX-License-Identifier: MIT
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 9 of 17 : OffchainAggregatorBilling.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

import "./AccessControllerInterface.sol";
import "./LinkTokenInterface.sol";
import "./Owned.sol";

/**
 * @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;

  /**
  * @return LINK token contract used for billing
  */
  LinkTokenInterface immutable public LINK;

  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,
    address _link,
    AccessControllerInterface _billingAccessController
  )
  {
    setBillingInternal(_maximumGasPrice, _reasonableGasPrice, _microLinkPerEth,
      _linkGweiPerObservation, _linkGweiPerTransmission);
    setBillingAccessControllerInternal(_billingAccessController);
    LINK = LinkTokenInterface(_link);
    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 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
   */
  event OraclePaid(address transmitter, address payee, uint256 amount);

  // 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(LINK.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);
    }
  }

  // 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;
    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(LINK.transfer(payee, linkWeiAmount), "insufficient funds");
          observationsCounts[transmitteridx] = 1;       // "zero" the counts.
          gasReimbursementsLinkWei[transmitteridx] = 1; // "zero" the counts.
          emit OraclePaid(transmitters[transmitteridx], payee, linkWeiAmount);
        }
    }
    // "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 = LINK.balanceOf(address(this));
    require(linkBalance >= linkDue, "insufficient balance");
    require(LINK.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(LINK.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 10 of 17 : TypeAndVersionInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

abstract contract TypeAndVersionInterface{
  function typeAndVersion()
    external
    pure
    virtual
    returns (string memory);
}

File 11 of 17 : AggregatorInterface.sol
// SPDX-License-Identifier: MIT
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 12 of 17 : AggregatorV3Interface.sol
// SPDX-License-Identifier: MIT
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 13 of 17 : SimpleWriteAccessController.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

import "./Owned.sol";
import "./AccessControllerInterface.sol";

/**
 * @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 14 of 17 : TestOffchainAggregator.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

import "./AccessControlledOffchainAggregator.sol";
import "./AccessControlTestHelper.sol";

contract TestOffchainAggregator is AccessControlledOffchainAggregator {
  function testDecodeReport(
    bytes memory report
  ) public pure returns (bytes32, bytes32, int192[] memory)
  {
    return decodeReport(report);
  }

  constructor(
    uint32 _maximumGasPrice,
    uint32 _reasonableGasPrice,
    uint32 _microLinkPerEth,
    uint32 _linkGweiPerObservation,
    uint32 _linkGweiPerTransmission,
    address _link,
    int192 _minAnswer, int192 _maxAnswer,
    AccessControllerInterface _billingAccessController,
    AccessControllerInterface _requesterAdminAccessController
  )
    AccessControlledOffchainAggregator(_maximumGasPrice, _reasonableGasPrice, _microLinkPerEth,
      _linkGweiPerObservation, _linkGweiPerTransmission, _link,
      _minAnswer, _maxAnswer, _billingAccessController, _requesterAdminAccessController, 0, "TEST"
    )
  {}

  function testPayee(
    address _transmitter
  )
    external
    view
    returns (address)
  {
    return s_payees[_transmitter];
  }

  function getConfigDigest() public view returns (bytes16) {
    return s_hotVars.latestConfigDigest;
  }

  function testSaturatingAddUint16(uint16 _x, uint16 _y)
    external pure returns (uint16)
  {
    return saturatingAddUint16(_x, _y);
  }

  function testImpliedGasPrice(uint256 txGasPrice, uint256 reasonableGasPrice,
    uint256 maximumGasPrice
  ) external pure returns (uint256) {
    return impliedGasPrice(txGasPrice, reasonableGasPrice, maximumGasPrice);
  }

  function testTransmitterGasCostEthWei(uint256 initialGas, uint256 gasPrice,
    uint256 callDataCost, uint256 gasLeft
  ) external pure returns (uint128) {
    return transmitterGasCostEthWei(
      initialGas, gasPrice, callDataCost, gasLeft
    );
  }

  function testSetOracleObservationCount(address _oracle, uint16 _amount) external {
    s_oracleObservationsCounts[s_oracles[_oracle].index] = _amount + 1;
  }

  function testTotalLinkDue()
    external view returns (uint256 linkDue)
  {
    return totalLINKDue();
  }

  function billingData() external view returns (
    uint16[maxNumOracles] memory observationsCounts,
    uint256[maxNumOracles] memory gasReimbursements,
    uint32 maximumGasPrice,
    uint32 reasonableGasPrice,
    uint32 microLinkPerEth,
    uint32 linkGweiPerObservation,
    uint32 linkGweiPerTransmission
  ) {
    Billing memory b = s_billing;
    return (s_oracleObservationsCounts, s_gasReimbursementsLinkWei,
      b.maximumGasPrice, b.reasonableGasPrice, b.microLinkPerEth,
      b.linkGweiPerObservation, b.linkGweiPerTransmission);
  }

  function testSetGasReimbursements(address _transmitterOrSigner, uint256 _amountLinkWei)
    external
  {
    require(s_oracles[_transmitterOrSigner].role != Role.Unset, "address unknown");
    s_gasReimbursementsLinkWei[s_oracles[_transmitterOrSigner].index] = _amountLinkWei + 1;
  }

  function testAccountingGasCost() public pure returns (uint256) {
    return accountingGasCost;
  }

  function testBurnLINK(uint256 amount) public {
      LINK.transfer(address(1), amount);
  }
}

File 15 of 17 : AccessControlTestHelper.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.1;

import "./AccessControlledOffchainAggregator.sol";

contract AccessControlTestHelper {

  event Dummy(); // Used to silence warning that these methods are pure

  function readGetRoundData(address _aggregator, uint80 _roundID)
    external
  {
    AccessControlledOffchainAggregator(_aggregator).getRoundData(_roundID);
    emit Dummy();
  }

  function readLatestRoundData(address _aggregator)
    external
  {
    AccessControlledOffchainAggregator(_aggregator).latestRoundData();
    emit Dummy();
  }

  function readLatestAnswer(address _aggregator)
    external
  {
    AccessControlledOffchainAggregator(_aggregator).latestAnswer();
    emit Dummy();
  }

  function readLatestTimestamp(address _aggregator)
    external
  {
    AccessControlledOffchainAggregator(_aggregator).latestTimestamp();
    emit Dummy();
  }

  function readLatestRound(address _aggregator)
    external
  {
    AccessControlledOffchainAggregator(_aggregator).latestRound();
    emit Dummy();
  }

  function readGetAnswer(address _aggregator, uint256 _roundID)
    external
  {
    AccessControlledOffchainAggregator(_aggregator).getAnswer(_roundID);
    emit Dummy();
  }

  function readGetTimestamp(address _aggregator, uint256 _roundID)
    external
  {
    AccessControlledOffchainAggregator(_aggregator).getTimestamp(_roundID);
    emit Dummy();
  }

  function testLatestTransmissionDetails(address _aggregator) external view {
      OffchainAggregator(_aggregator).latestTransmissionDetails();
  }
}

File 16 of 17 : ExposedOffchainAggregator.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

import "./OffchainAggregator.sol";

// ExposedOffchainAggregator exposes certain internal OffchainAggregator
// methods/structures so that golang code can access them, and we get
// reliable type checking on their usage
contract ExposedOffchainAggregator is OffchainAggregator {

  constructor()
    OffchainAggregator(
      0, 0, 0, 0, 0, address(0), 0, 0, AccessControllerInterface(address(0)), AccessControllerInterface(address(0)), 0, ""
    )
    {}

  function exposedConfigDigestFromConfigData(
    address _contractAddress,
    uint64 _configCount,
    address[] calldata _signers,
    address[] calldata _transmitters,
    uint8 _threshold,
    uint64 _encodedConfigVersion,
    bytes calldata _encodedConfig
  ) external pure returns (bytes16) {
    return configDigestFromConfigData(_contractAddress, _configCount,
      _signers, _transmitters, _threshold, _encodedConfigVersion,
      _encodedConfig);
  }
}

File 17 of 17 : TestValidator.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

import "./AggregatorValidatorInterface.sol";

contract TestValidator is AggregatorValidatorInterface {
  uint32 s_minGasUse;
  uint256 s_latestRoundId;

  event Validated(
    uint256 previousRoundId,
    int256 previousAnswer,
    uint256 currentRoundId,
    int256 currentAnswer,
    uint256 initialGas
  );

  function validate(
    uint256 previousRoundId,
    int256 previousAnswer,
    uint256 currentRoundId,
    int256 currentAnswer
  ) external override returns (bool) {
    uint256 initialGas = gasleft();

    emit Validated(
      previousRoundId,
      previousAnswer,
      currentRoundId,
      currentAnswer,
      initialGas
    );
    s_latestRoundId = currentRoundId;

    uint256 minGasUse = s_minGasUse;
    while (initialGas - gasleft() < minGasUse) {}

    return true;
  }

  function setMinGasUse(uint32 minGasUse) external {
    s_minGasUse = minGasUse;
  }

  function latestRoundId() external view returns (uint256) {
    return s_latestRoundId;
  }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 20000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  }
}

Contract ABI

[{"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":"address","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":"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":false,"internalType":"address","name":"transmitter","type":"address"},{"indexed":false,"internalType":"address","name":"payee","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"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":"LINK","outputs":[{"internalType":"contract LinkTokenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":[{"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":"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"}]

6101006040523480156200001257600080fd5b50604051620062cb380380620062cb83398181016040526101808110156200003957600080fd5b815160208301516040808501516060860151608087015160a088015160c089015160e08a01516101008b01516101208c01516101408d01516101608e0180519a519c9e9b9d999c989b979a969995989497939692959194939182019284640100000000821115620000a957600080fd5b908301906020820185811115620000bf57600080fd5b8251640100000000811182820188101715620000da57600080fd5b82525081516020918201929091019080838360005b8381101562000109578181015183820152602001620000ef565b50505050905090810190601f168015620001375780820380516001836020036101000a031916815260200191505b506040525050600080546001600160a01b03191633179055508b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b89620001728787878787620002b9565b6200017d81620003ab565b6001600160601b0319606083901b166080526200019962000642565b620001a362000642565b60005b601f8160ff161015620001f3576001838260ff16601f8110620001c557fe5b61ffff909216602092909202015260018260ff8316601f8110620001e557fe5b6020020152600101620001a6565b5062000203600483601f62000661565b5062000213600882601f620006fe565b505050505060f887901b7fff000000000000000000000000000000000000000000000000000000000000001660e052505083516200025c9350602f92506020850191506200072f565b50620002688362000424565b62000275600080620004fc565b50505050601791820b820b604090811b60a05290820b90910b901b60c05250506030805460ff1916600117905550620007c89e505050505050505050505050505050565b6040805160a0808201835263ffffffff88811680845288821660208086018290528984168688018190528985166060808901829052958a1660809889018190526002805463ffffffff1916871763ffffffff60201b191664010000000087021763ffffffff60401b19166801000000000000000085021763ffffffff60601b19166c0100000000000000000000000084021763ffffffff60801b1916600160801b830217905589519586529285019390935283880152928201529283015291517fd0d9486a2c673e2a4b57fc82e4c8a556b3e2b82dd5db07e2c04a920ca0f469b6929181900390910190a15050505050565b6003546001600160a01b0390811690821681146200042057600380546001600160a01b0319166001600160a01b03848116918217909255604080519284168352602083019190915280517f793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d489129281900390910190a15b5050565b6000546001600160a01b0316331462000484576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b602e546001600160a01b0390811690821681146200042057602e80546001600160a01b0319166001600160a01b03848116918217909255604080519284168352602083019190915280517f27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae6349281900390910190a15050565b6000546001600160a01b031633146200055c576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60408051808201909152602d546001600160a01b03808216808452600160a01b90920463ffffffff1660208401528416141580620005aa57508163ffffffff16816020015163ffffffff1614155b156200063d576040805180820182526001600160a01b0385811680835263ffffffff8681166020948501819052602d80546001600160a01b031916841763ffffffff60a01b1916600160a01b8302179055865187860151875193168352948201528451919493909216927fb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541928290030190a35b505050565b604051806103e00160405280601f906020820280368337509192915050565b600283019183908215620006ec5791602002820160005b83821115620006ba57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000678565b8015620006ea5782816101000a81549061ffff0219169055600201602081600101049283019260010302620006ba565b505b50620006fa929150620007b1565b5090565b82601f8101928215620006ec579160200282015b82811115620006ec57825182559160200191906001019062000712565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620007675760008555620006ec565b82601f106200078257805160ff1916838001178555620006ec565b82800160010185558215620006ec5791820182811115620006ec57825182559160200191906001019062000712565b5b80821115620006fa5760008155600101620007b2565b60805160601c60a05160401c60c05160401c60e05160f81c615a9e6200082d60003980610fc1525080611b2a52806138c6525080610f205280613899525080610efc5280612bff5280612cef5280613d0052806145225280614da15250615a9e6000f3fe608060405234801561001057600080fd5b50600436106102ff5760003560e01c80638da5cb5b1161019c578063bd824706116100ee578063e5fe457711610097578063f2fde38b11610071578063f2fde38b14610c7d578063fbffd2c114610ca3578063feaf968c14610cc9576102ff565b8063e5fe457714610bb3578063eb45716314610c1d578063eb5dcd6c14610c4f576102ff565b8063d09dc339116100c8578063d09dc33914610b66578063dc7f012414610b6e578063e4902f8214610b76576102ff565b8063bd824706146109e1578063c107532914610a26578063c980753914610a52576102ff565b80639c849b3011610150578063b121e1471161012a578063b121e14714610981578063b5ab58dc146109a7578063b633620c146109c4576102ff565b80639c849b30146108735780639e3ceeab14610935578063a118f2491461095b576102ff565b806398e5b12a1161018157806398e5b12a146107d1578063996e8298146107f85780639a6fc8f514610800576102ff565b80638da5cb5b146107995780638e0566de146107a1576102ff565b80636b14daf8116102555780638038e4a1116102095780638205bf6a116101e35780638205bf6a146107455780638823da6c1461074d5780638ac28d5a14610773576102ff565b80638038e4a114610694578063814118341461069c57806381ff7048146106f4576102ff565b806370efdf2d1161023a57806370efdf2d1461067c5780637284e4161461068457806379ba50971461068c576102ff565b80636b14daf8146105aa57806370da2f6714610674576102ff565b806329937268116102b757806354fd4d501161029157806354fd4d501461046d578063585aa7de14610475578063668a0f02146105a2576102ff565b80632993726814610406578063313ce5671461044757806350d25bcd14610465576102ff565b8063181f5a77116102e8578063181f5a77146103465780631b6b6d23146103c357806322adbc78146103e7576102ff565b80630a756983146103045780630eafb25b1461030e575b600080fd5b61030c610cd1565b005b6103346004803603602081101561032457600080fd5b50356001600160a01b0316610d8f565b60408051918252519081900360200190f35b61034e610eda565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610388578181015183820152602001610370565b50505050905090810190601f1680156103b55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103cb610efa565b604080516001600160a01b039092168252519081900360200190f35b6103ef610f1e565b6040805160179290920b8252519081900360200190f35b61040e610f42565b6040805163ffffffff96871681529486166020860152928516848401529084166060840152909216608082015290519081900360a00190f35b61044f610fbf565b6040805160ff9092168252519081900360200190f35b610334610fe3565b610334611084565b61030c600480360360a081101561048b57600080fd5b8101906020810181356401000000008111156104a657600080fd5b8201836020820111156104b857600080fd5b803590602001918460208302840111640100000000831117156104da57600080fd5b9193909290916020810190356401000000008111156104f857600080fd5b82018360208201111561050a57600080fd5b8035906020019184602083028401116401000000008311171561052c57600080fd5b9193909260ff8335169267ffffffffffffffff60208201351692919060608101906040013564010000000081111561056357600080fd5b82018360208201111561057557600080fd5b8035906020019184600183028401116401000000008311171561059757600080fd5b509092509050611089565b610334611a64565b610660600480360360408110156105c057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156105eb57600080fd5b8201836020820111156105fd57600080fd5b8035906020019184600183028401116401000000008311171561061f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b00945050505050565b604080519115158252519081900360200190f35b6103ef611b28565b6103cb611b4c565b61034e611b5b565b61030c611bf7565b61030c611cc5565b6106a4611d84565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106e05781810151838201526020016106c8565b505050509050019250505060405180910390f35b6106fc611de6565b6040805163ffffffff94851681529290931660208301527fffffffffffffffffffffffffffffffff00000000000000000000000000000000168183015290519081900360600190f35b610334611e07565b61030c6004803603602081101561076357600080fd5b50356001600160a01b0316611ea3565b61030c6004803603602081101561078957600080fd5b50356001600160a01b0316611f9a565b6103cb612011565b6107a9612020565b604080516001600160a01b03909316835263ffffffff90911660208301528051918290030190f35b6107d9612064565b6040805169ffffffffffffffffffff9092168252519081900360200190f35b6103cb6122b8565b6108296004803603602081101561081657600080fd5b503569ffffffffffffffffffff166122c7565b604051808669ffffffffffffffffffff1681526020018581526020018481526020018381526020018269ffffffffffffffffffff1681526020019550505050505060405180910390f35b61030c6004803603604081101561088957600080fd5b8101906020810181356401000000008111156108a457600080fd5b8201836020820111156108b657600080fd5b803590602001918460208302840111640100000000831117156108d857600080fd5b9193909290916020810190356401000000008111156108f657600080fd5b82018360208201111561090857600080fd5b8035906020019184602083028401116401000000008311171561092a57600080fd5b50909250905061237c565b61030c6004803603602081101561094b57600080fd5b50356001600160a01b03166125b5565b61030c6004803603602081101561097157600080fd5b50356001600160a01b03166126a4565b61030c6004803603602081101561099757600080fd5b50356001600160a01b031661270c565b610334600480360360208110156109bd57600080fd5b5035612805565b610334600480360360208110156109da57600080fd5b50356128a2565b61030c600480360360a08110156109f757600080fd5b5063ffffffff81358116916020810135821691604082013581169160608101358216916080909101351661293f565b61030c60048036036040811015610a3c57600080fd5b506001600160a01b038135169060200135612aa5565b61030c60048036036080811015610a6857600080fd5b810190602081018135640100000000811115610a8357600080fd5b820183602082011115610a9557600080fd5b80359060200191846001830284011164010000000083111715610ab757600080fd5b919390929091602081019035640100000000811115610ad557600080fd5b820183602082011115610ae757600080fd5b80359060200191846020830284011164010000000083111715610b0957600080fd5b919390929091602081019035640100000000811115610b2757600080fd5b820183602082011115610b3957600080fd5b80359060200191846020830284011164010000000083111715610b5b57600080fd5b919350915035612df2565b610334613cfb565b610660613dac565b610b9c60048036036020811015610b8c57600080fd5b50356001600160a01b0316613db5565b6040805161ffff9092168252519081900360200190f35b610bbb613e62565b604080517fffffffffffffffffffffffffffffffff00000000000000000000000000000000909616865263ffffffff909416602086015260ff9092168484015260170b606084015267ffffffffffffffff166080830152519081900360a00190f35b61030c60048036036040811015610c3357600080fd5b5080356001600160a01b0316906020013563ffffffff16613f51565b61030c60048036036040811015610c6557600080fd5b506001600160a01b03813581169160200135166140e6565b61030c60048036036020811015610c9357600080fd5b50356001600160a01b0316614241565b61030c60048036036020811015610cb957600080fd5b50356001600160a01b0316614309565b610829614371565b6000546001600160a01b03163314610d30576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60305460ff1615610d8d57603080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a15b565b6001600160a01b03811660009081526027602090815260408083208151808301909252805460ff808216845285948401916101009004166002811115610dd157fe5b6002811115610ddc57fe5b9052509050600081602001516002811115610df357fe5b1415610e03576000915050610ed5565b6040805160a08101825260025463ffffffff80821683526401000000008204811660208401526801000000000000000082048116938301939093526c01000000000000000000000000810483166060830181905270010000000000000000000000000000000090910490921660808201528251909160009160019060049060ff16601f8110610e8e57fe5b601091828204019190066002029054906101000a900461ffff160361ffff1602633b9aca0002905060016008846000015160ff16601f8110610ecc57fe5b01540301925050505b919050565b6060604051806060016040528060288152602001615a4160289139905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040805160a08101825260025463ffffffff808216808452640100000000830482166020850181905268010000000000000000840483169585018690526c01000000000000000000000000840483166060860181905270010000000000000000000000000000000090940490921660809094018490529490939290565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611026336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b0092505050565b611077576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61107f614424565b905090565b600481565b868560ff8616601f8311156110e5576040805162461bcd60e51b815260206004820152601060248201527f746f6f206d616e79207369676e65727300000000000000000000000000000000604482015290519081900360640190fd5b6000811161113a576040805162461bcd60e51b815260206004820152601a60248201527f7468726573686f6c64206d75737420626520706f736974697665000000000000604482015290519081900360640190fd5b8183146111785760405162461bcd60e51b8152600401808060200182810382526024815260200180615a1d6024913960400191505060405180910390fd5b8060030283116111cf576040805162461bcd60e51b815260206004820181905260248201527f6661756c74792d6f7261636c65207468726573686f6c6420746f6f2068696768604482015290519081900360640190fd5b6000546001600160a01b0316331461122e576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b602854156113d257602880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101916000918390811061126b57fe5b6000918252602082200154602980546001600160a01b039092169350908490811061129257fe5b6000918252602090912001546001600160a01b031690506112b281614460565b6001600160a01b0380831660009081526027602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009081169091559284168252902080549091169055602880548061130e57fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055602980548061137157fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555061122e915050565b60005b8a8110156117e0576000602760008e8e858181106113ef57fe5b602090810292909201356001600160a01b031683525081019190915260400160002054610100900460ff16600281111561142557fe5b14611477576040805162461bcd60e51b815260206004820152601760248201527f7265706561746564207369676e65722061646472657373000000000000000000604482015290519081900360640190fd5b6040805180820190915260ff8216815260016020820152602760008e8e8581811061149e57fe5b602090810292909201356001600160a01b031683525081810192909252604001600020825181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9091161780825591830151909182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010083600281111561152957fe5b02179055506000915060069050818c8c8581811061154357fe5b6001600160a01b03602091820293909301358316845283019390935260409091016000205416919091141590506115c1576040805162461bcd60e51b815260206004820152601160248201527f7061796565206d75737420626520736574000000000000000000000000000000604482015290519081900360640190fd5b6000602760008c8c858181106115d357fe5b602090810292909201356001600160a01b031683525081019190915260400160002054610100900460ff16600281111561160957fe5b1461165b576040805162461bcd60e51b815260206004820152601c60248201527f7265706561746564207472616e736d6974746572206164647265737300000000604482015290519081900360640190fd5b6040805180820190915260ff8216815260026020820152602760008c8c8581811061168257fe5b602090810292909201356001600160a01b031683525081810192909252604001600020825181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9091161780825591830151909182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010083600281111561170d57fe5b021790555090505060288c8c8381811061172357fe5b835460018101855560009485526020948590200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03959092029390930135939093169290921790555060298a8a8381811061178557fe5b835460018181018655600095865260209586902090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03969093029490940135949094161790915550016113d5565b50602a805460ff89167501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909116179055602c80544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff84161780831660010183167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161793849055909104811691166118ac30828f8f8f8f8f8f8f8f61468a565b602a60000160006101000a8154816fffffffffffffffffffffffffffffffff021916908360801c02179055506000602a60000160106101000a81548164ffffffffff021916908364ffffffffff1602179055507f25d719d88a4512dd76c7442b910a83360845505894eb444ef299409e180f8fb982828f8f8f8f8f8f8f8f604051808b63ffffffff1681526020018a67ffffffffffffffff16815260200180602001806020018760ff1681526020018667ffffffffffffffff1681526020018060200184810384528c8c82818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810384528a8152602090810191508b908b0280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810383528681526020019050868680828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039f50909d5050505050505050505050505050a150505050505050505050505050565b6000611aa7336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b0092505050565b611af8576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61107f6147ca565b6000611b0c83836147f0565b80611b1f57506001600160a01b03831632145b90505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b602e546001600160a01b031690565b6060611b9e336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b0092505050565b611bef576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61107f614820565b6001546001600160a01b03163314611c56576040805162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000546001600160a01b03163314611d24576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60305460ff16610d8d57603080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b60606029805480602002602001604051908101604052809291908181526020018280548015611ddc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611dbe575b5050505050905090565b602c54602a5463ffffffff808316926401000000009004169060801b909192565b6000611e4a336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b0092505050565b611e9b576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61107f6148cb565b6000546001600160a01b03163314611f02576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526031602052604090205460ff1615611f97576001600160a01b03811660008181526031602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a15b50565b6001600160a01b03818116600090815260066020526040902054163314612008576040805162461bcd60e51b815260206004820152601760248201527f4f6e6c792070617965652063616e207769746864726177000000000000000000604482015290519081900360640190fd5b611f9781614460565b6000546001600160a01b031681565b60408051808201909152602d546001600160a01b0381168083527401000000000000000000000000000000000000000090910463ffffffff16602090920182905291565b600080546001600160a01b031633148061215e5750602e54604080517f6b14daf800000000000000000000000000000000000000000000000000000000815233600482018181526024830193845236604484018190526001600160a01b0390951694636b14daf894929360009391929190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561213157600080fd5b505afa158015612145573d6000803e3d6000fd5b505050506040513d602081101561215b57600080fd5b50515b6121af576040805162461bcd60e51b815260206004820152601d60248201527f4f6e6c79206f776e6572267265717565737465722063616e2063616c6c000000604482015290519081900360640190fd5b6040805160808082018352602a549081901b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000016808352700100000000000000000000000000000000820464ffffffffff81166020808601919091527501000000000000000000000000000000000000000000840460ff9081168688015276010000000000000000000000000000000000000000000090940463ffffffff9081166060808801919091528751948552600884901c909116918401919091529216818501529251919233927f3ea16a923ff4b1df6526e854c9e3a995c43385d70e73359e10623c74f0b52037929181900390910190a2806060015160010163ffffffff1691505090565b6003546001600160a01b031690565b6000806000806000612310336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b0092505050565b612361576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61236a86614926565b939a9299509097509550909350915050565b6000546001600160a01b031633146123db576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b82811461242f576040805162461bcd60e51b815260206004820181905260248201527f7472616e736d6974746572732e73697a6520213d207061796565732e73697a65604482015290519081900360640190fd5b60005b838110156125ae57600085858381811061244857fe5b905060200201356001600160a01b03169050600084848481811061246857fe5b6001600160a01b0385811660009081526006602090815260409091205492029390930135831693509091169050801580806124b45750826001600160a01b0316826001600160a01b0316145b612505576040805162461bcd60e51b815260206004820152601160248201527f706179656520616c726561647920736574000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03848116600090815260066020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168583169081179091559083161461259e57826001600160a01b0316826001600160a01b0316856001600160a01b03167f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b360405160405180910390a45b5050600190920191506124329050565b5050505050565b6000546001600160a01b03163314612614576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b602e546001600160a01b0390811690821681146126a057602e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03848116918217909255604080519284168352602083019190915280517f27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae6349281900390910190a15b5050565b6000546001600160a01b03163314612703576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b611f9781614a71565b6001600160a01b0381811660009081526007602052604090205416331461277a576040805162461bcd60e51b815260206004820152601f60248201527f6f6e6c792070726f706f736564207061796565732063616e2061636365707400604482015290519081900360640190fd5b6001600160a01b0381811660008181526006602090815260408083208054337fffffffffffffffffffffffff000000000000000000000000000000000000000080831682179093556007909452828520805490921690915590519416939092849290917f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b39190a45050565b6000612848336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b0092505050565b612899576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611b2282614b0a565b60006128e5336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b0092505050565b612936576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611b2282614b40565b6003546000546001600160a01b039182169116331480612a375750604080517f6b14daf800000000000000000000000000000000000000000000000000000000815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015612a0a57600080fd5b505afa158015612a1e573d6000803e3d6000fd5b505050506040513d6020811015612a3457600080fd5b50515b612a88576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722662696c6c696e6741646d696e2063616e2063616c6c604482015290519081900360640190fd5b612a90614b95565b612a9d8686868686614f5a565b505050505050565b6000546001600160a01b0316331480612b9e5750600354604080517f6b14daf800000000000000000000000000000000000000000000000000000000815233600482018181526024830193845236604484018190526001600160a01b0390951694636b14daf894929360009391929190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015612b7157600080fd5b505afa158015612b85573d6000803e3d6000fd5b505050506040513d6020811015612b9b57600080fd5b50515b612bef576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722662696c6c696e6741646d696e2063616e2063616c6c604482015290519081900360640190fd5b6000612bf96150d4565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612c6a57600080fd5b505afa158015612c7e573d6000803e3d6000fd5b505050506040513d6020811015612c9457600080fd5b5051905081811015612ced576040805162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e6365000000000000000000000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb85612d29858503876152a4565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612d6f57600080fd5b505af1158015612d83573d6000803e3d6000fd5b505050506040513d6020811015612d9957600080fd5b5051612dec576040805162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b50505050565b60005a9050612e058888888888886152bb565b3614612e58576040805162461bcd60e51b815260206004820152601960248201527f7472616e736d6974206d65737361676520746f6f206c6f6e6700000000000000604482015290519081900360640190fd5b612e606158b2565b6040805160808082018352602a549081901b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000168252700100000000000000000000000000000000810464ffffffffff1660208301527501000000000000000000000000000000000000000000810460ff169282019290925276010000000000000000000000000000000000000000000090910463ffffffff166060808301919091529082526000908a908a90811015612f1957600080fd5b813591602081013591810190606081016040820135640100000000811115612f4057600080fd5b820183602082011115612f5257600080fd5b80359060200191846020830284011164010000000083111715612f7457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060408801525050506080840182905283515190925060589190911b907fffffffffffffffffffffffffffffffff0000000000000000000000000000000080831691161461303b576040805162461bcd60e51b815260206004820152601560248201527f636f6e666967446967657374206d69736d617463680000000000000000000000604482015290519081900360640190fd5b608083015183516020015164ffffffffff8083169116106130a3576040805162461bcd60e51b815260206004820152600c60248201527f7374616c65207265706f72740000000000000000000000000000000000000000604482015290519081900360640190fd5b83516040015160ff1689116130ff576040805162461bcd60e51b815260206004820152601560248201527f6e6f7420656e6f756768207369676e6174757265730000000000000000000000604482015290519081900360640190fd5b601f891115613155576040805162461bcd60e51b815260206004820152601360248201527f746f6f206d616e79207369676e61747572657300000000000000000000000000604482015290519081900360640190fd5b8689146131a9576040805162461bcd60e51b815260206004820152601e60248201527f7369676e617475726573206f7574206f6620726567697374726174696f6e0000604482015290519081900360640190fd5b601f8460400151511115613204576040805162461bcd60e51b815260206004820152601e60248201527f6e756d206f62736572766174696f6e73206f7574206f6620626f756e64730000604482015290519081900360640190fd5b83600001516040015160020260ff168460400151511161326b576040805162461bcd60e51b815260206004820152601e60248201527f746f6f206665772076616c75657320746f207472757374206d656469616e0000604482015290519081900360640190fd5b8867ffffffffffffffff8111801561328257600080fd5b506040519080825280601f01601f1916602001820160405280156132ad576020820181803683370190505b50606085015260005b60ff81168a111561331e57868160ff16602081106132d057fe5b1a60f81b85606001518260ff16815181106132e757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016132b6565b5083604001515167ffffffffffffffff8111801561333b57600080fd5b506040519080825280601f01601f191660200182016040528015613366576020820181803683370190505b5060208501526133746158e6565b60005b8560400151518160ff16101561347a576000858260ff166020811061339857fe5b1a90508281601f81106133a757fe5b6020020151156133fe576040805162461bcd60e51b815260206004820152601760248201527f6f6273657276657220696e646578207265706561746564000000000000000000604482015290519081900360640190fd5b6001838260ff16601f811061340f57fe5b91151560209283029190910152869060ff841690811061342b57fe5b1a60f81b87602001518360ff168151811061344257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050600101613377565b503360009081526027602090815260408083208151808301909252805460ff808216845292939192918401916101009091041660028111156134b857fe5b60028111156134c357fe5b90525090506002816020015160028111156134da57fe5b14801561350e57506029816000015160ff16815481106134f657fe5b6000918252602090912001546001600160a01b031633145b61355f576040805162461bcd60e51b815260206004820152601860248201527f756e617574686f72697a6564207472616e736d69747465720000000000000000604482015290519081900360640190fd5b5050835164ffffffffff90911660209091015250506040516000908a908a9080838380828437604051920182900390912094506135a093506158e692505050565b6135a8615905565b60005b898110156137bf576000600185876060015184815181106135c857fe5b60209101015160f81c601b018e8e868181106135e057fe5b905060200201358d8d878181106135f357fe5b9050602002013560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561364e573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101516001600160a01b03811660009081526027602090815290849020838501909452835460ff808216855292965092945084019161010090041660028111156136bb57fe5b60028111156136c657fe5b90525092506001836020015160028111156136dd57fe5b1461372f576040805162461bcd60e51b815260206004820152601e60248201527f61646472657373206e6f7420617574686f72697a656420746f207369676e0000604482015290519081900360640190fd5b8251849060ff16601f811061374057fe5b602002015115613797576040805162461bcd60e51b815260206004820152601460248201527f6e6f6e2d756e69717565207369676e6174757265000000000000000000000000604482015290519081900360640190fd5b600184846000015160ff16601f81106137ac57fe5b91151560209092020152506001016135ab565b5050505060005b600182604001515103811015613870576000826040015182600101815181106137eb57fe5b602002602001015160170b8360400151838151811061380657fe5b602002602001015160170b1315905080613867576040805162461bcd60e51b815260206004820152601760248201527f6f62736572766174696f6e73206e6f7420736f72746564000000000000000000604482015290519081900360640190fd5b506001016137c6565b5060408101518051600091906002810490811061388957fe5b602002602001015190508060170b7f000000000000000000000000000000000000000000000000000000000000000060170b131580156138ef57507f000000000000000000000000000000000000000000000000000000000000000060170b8160170b13155b613940576040805162461bcd60e51b815260206004820152601e60248201527f6d656469616e206973206f7574206f66206d696e2d6d61782072616e67650000604482015290519081900360640190fd5b81516060908101805163ffffffff60019091018116909152604080518082018252601785810b80835267ffffffffffffffff42811660208086019182528a5189015188166000908152602b82528781209651875493519094167801000000000000000000000000000000000000000000000000029390950b77ffffffffffffffffffffffffffffffffffffffffffffffff9081167fffffffffffffffff0000000000000000000000000000000000000000000000009093169290921790911691909117909355875186015184890151848a01516080808c015188519586523386890181905291860181905260a0988601898152845199870199909952835194909916997ff6a97944f31ea060dfde0566e4167c1a1082551e64b60ecb14d599a9d023d451998c999298949793969095909492939185019260c086019289820192909102908190849084905b83811015613aa3578181015183820152602001613a8b565b50505050905001838103825285818151815260200191508051906020019080838360005b83811015613adf578181015183820152602001613ac7565b50505050905090810190601f168015613b0c5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a281516060015160408051428152905160009263ffffffff16917f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271919081900360200190a381600001516060015163ffffffff168160170b7f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f426040518082815260200191505060405180910390a3613bc18260000151606001518260170b6152d3565b5080518051602a8054602084015160408501516060909501517fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921660809490941c939093177fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000064ffffffffff90941693909302929092177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff90941693909302929092177fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000063ffffffff92831602179091558210613ce257fe5b613cf0828260200151615413565b505050505050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613d6b57600080fd5b505afa158015613d7f573d6000803e3d6000fd5b505050506040513d6020811015613d9557600080fd5b505190506000613da36150d4565b90910391505090565b60305460ff1681565b6001600160a01b03811660009081526027602090815260408083208151808301909252805460ff808216845285948401916101009004166002811115613df757fe5b6002811115613e0257fe5b9052509050600081602001516002811115613e1957fe5b1415613e29576000915050610ed5565b60016004826000015160ff16601f8110613e3f57fe5b601091828204019190066002029054906101000a900461ffff1603915050919050565b600080808080333214613ebc576040805162461bcd60e51b815260206004820152601460248201527f4f6e6c792063616c6c61626c6520627920454f41000000000000000000000000604482015290519081900360640190fd5b5050602a5463ffffffff760100000000000000000000000000000000000000000000820481166000908152602b6020526040902054608083901b96700100000000000000000000000000000000909304600881901c909216955064ffffffffff9091169350601781900b92507801000000000000000000000000000000000000000000000000900467ffffffffffffffff1690565b6000546001600160a01b03163314613fb0576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60408051808201909152602d546001600160a01b038082168084527401000000000000000000000000000000000000000090920463ffffffff166020840152841614158061400e57508163ffffffff16816020015163ffffffff1614155b156140e1576040805180820182526001600160a01b0385811680835263ffffffff8681166020948501819052602d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001684177fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000008302179055865187860151875193168352948201528451919493909216927fb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541928290030190a35b505050565b6001600160a01b03828116600090815260066020526040902054163314614154576040805162461bcd60e51b815260206004820152601d60248201527f6f6e6c792063757272656e742070617965652063616e20757064617465000000604482015290519081900360640190fd5b336001600160a01b03821614156141b2576040805162461bcd60e51b815260206004820152601760248201527f63616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b6001600160a01b03808316600090815260076020526040902080548383167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559091169081146140e1576040516001600160a01b038084169133918616907f84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e3836790600090a4505050565b6000546001600160a01b031633146142a0576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000546001600160a01b03163314614368576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b611f9781615660565b60008060008060006143ba336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b0092505050565b61440b576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6144136156ef565b945094509450945094509091929394565b602a54760100000000000000000000000000000000000000000000900463ffffffff166000908152602b6020526040902054601790810b900b90565b6001600160a01b03811660009081526027602090815260408083208151808301909252805460ff808216845292939192918401916101009091041660028111156144a657fe5b60028111156144b157fe5b905250905060006144c183610d8f565b905080156140e1576001600160a01b0380841660009081526006602090815260408083205481517fa9059cbb0000000000000000000000000000000000000000000000000000000081529085166004820181905260248201879052915191947f0000000000000000000000000000000000000000000000000000000000000000169363a9059cbb9360448084019491939192918390030190829087803b15801561456a57600080fd5b505af115801561457e573d6000803e3d6000fd5b505050506040513d602081101561459457600080fd5b50516145e7576040805162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b60016004846000015160ff16601f81106145fd57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060016008846000015160ff16601f811061463857fe5b0155604080516001600160a01b0380871682528316602082015280820184905290517fe8ec50e5150ae28ae37e493ff389ffab7ffaec2dc4dccfca03f12a3de29d12b29181900360600190a150505050565b60008a8a8a8a8a8a8a8a8a8a604051602001808b6001600160a01b031681526020018a67ffffffffffffffff16815260200180602001806020018760ff1681526020018667ffffffffffffffff1681526020018060200184810384528c8c82818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810384528a8152602090810191508b908b0280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810383528681526020019050868680828437600081840152601f19601f8201169050808301925050509d50505050505050505050505050506040516020818303038152906040528051906020012090509a9950505050505050505050565b602a54760100000000000000000000000000000000000000000000900463ffffffff1690565b6001600160a01b03821660009081526031602052604081205460ff1680611b1f57505060305460ff161592915050565b602f8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611ddc5780601f1061489f57610100808354040283529160200191611ddc565b820191906000526020600020905b8154815290600101906020018083116148ad57509395945050505050565b602a54760100000000000000000000000000000000000000000000900463ffffffff166000908152602b60205260409020547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1690565b600080600080600063ffffffff8669ffffffffffffffffffff1611156040518060400160405280600f81526020017f4e6f20646174612070726573656e74000000000000000000000000000000000081525090614a015760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156149c65781810151838201526020016149ae565b50505050905090810190601f1680156149f35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505063ffffffff83166000908152602b6020908152604091829020825180840190935254601781810b810b810b808552780100000000000000000000000000000000000000000000000090920467ffffffffffffffff1693909201839052949594900b939092508291508490565b6001600160a01b03811660009081526031602052604090205460ff16611f97576001600160a01b03811660008181526031602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b600063ffffffff821115614b2057506000610ed5565b5063ffffffff166000908152602b6020526040902054601790810b900b90565b600063ffffffff821115614b5657506000610ed5565b5063ffffffff166000908152602b60205260409020547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1690565b6040805160a08101825260025463ffffffff80821683526401000000008204811660208401526801000000000000000082048116838501526c0100000000000000000000000082048116606084015270010000000000000000000000000000000090910416608082015281516103e0810192839052909160009190600490601f908285855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411614c1a575050604080516103e0810191829052959650600095945060089350601f9250905082845b815481526020019060010190808311614c74575050505050905060006029805480602002602001604051908101604052809291908181526020018280548015614ce657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614cc8575b5050505050905060005b8151811015614f3e57600060018483601f8110614d0957fe5b6020020151039050600060018684601f8110614d2157fe5b60200201510361ffff169050600082886060015163ffffffff168302633b9aca00020190506000811115614f3357600060066000878781518110614d6157fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b031690507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015614e1657600080fd5b505af1158015614e2a573d6000803e3d6000fd5b505050506040513d6020811015614e4057600080fd5b5051614e93576040805162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b60018886601f8110614ea157fe5b61ffff909216602092909202015260018786601f8110614ebd57fe5b602002015285517fe8ec50e5150ae28ae37e493ff389ffab7ffaec2dc4dccfca03f12a3de29d12b290879087908110614ef257fe5b6020026020010151828460405180846001600160a01b03168152602001836001600160a01b03168152602001828152602001935050505060405180910390a1505b505050600101614cf0565b50614f4c600484601f61591c565b506125ae600883601f6159b2565b6040805160a0808201835263ffffffff88811680845288821660208086018290528984168688018190528985166060808901829052958a166080988901819052600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001687177fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff166401000000008702177fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff16680100000000000000008502177fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c010000000000000000000000008402177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000830217905589519586529285019390935283880152928201529283015291517fd0d9486a2c673e2a4b57fc82e4c8a556b3e2b82dd5db07e2c04a920ca0f469b6929181900390910190a15050505050565b604080516103e0810191829052600091829190600490601f908285855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116150f15790505050505050905060005b601f8110156151615760018282601f811061514a57fe5b60200201510361ffff169290920191600101615133565b506040805160a08101825260025463ffffffff8082168352640100000000820481166020808501919091526801000000000000000083048216848601526c01000000000000000000000000830482166060850181905270010000000000000000000000000000000090930490911660808401526029805485518184028101840190965280865296909202633b9aca000295929360009390929183018282801561523357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311615215575b5050604080516103e0810191829052949550600094935060089250601f915082845b815481526020019060010190808311615255575050505050905060005b825181101561529c5760018282601f811061528957fe5b6020020151039590950194600101615272565b505050505090565b6000818310156152b5575081611b22565b50919050565b602083810286019082020160e4019695505050505050565b60408051808201909152602d546001600160a01b0381168083527401000000000000000000000000000000000000000090910463ffffffff16602083015261531b57506126a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830163ffffffff8181166000818152602b602090815260408083205487518884015183517fbeed9b510000000000000000000000000000000000000000000000000000000081526004810197909752601792830b90920b602487018190528b88166044880152606487018b9052925192966001600160a01b039091169563beed9b51959290911693608480830194919391928390030190829088803b1580156153e457600080fd5b5087f19350505050801561540a57506040513d602081101561540557600080fd5b505160015b612a9d576125ae565b3360009081526027602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561545057fe5b600281111561545b57fe5b9052506040805160a08101825260025463ffffffff80821683526401000000008204811660208401526801000000000000000082048116838501526c0100000000000000000000000082048116606084015270010000000000000000000000000000000090910416608082015281516103e08101928390529293509161552b91859190600490601f90826000855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116154e95790505050505050615773565b61553990600490601f61591c565b5060028260200151600281111561554c57fe5b1461559e576040805162461bcd60e51b815260206004820181905260248201527f73656e7420627920756e64657369676e61746564207472616e736d6974746572604482015290519081900360640190fd5b60006155c5633b9aca003a04836020015163ffffffff16846000015163ffffffff166157e8565b90506010360260005a905060006155e48863ffffffff1685858561580e565b6fffffffffffffffffffffffffffffffff1690506000620f4240866040015163ffffffff1683028161561257fe5b049050856080015163ffffffff16633b9aca0002816008896000015160ff16601f811061563b57fe5b015401016008886000015160ff16601f811061565357fe5b0155505050505050505050565b6003546001600160a01b0390811690821681146126a057600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03848116918217909255604080519284168352602083019190915280517f793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d489129281900390910190a15050565b602a54760100000000000000000000000000000000000000000000900463ffffffff166000818152602b6020908152604091829020825180840190935254601781810b810b810b808552780100000000000000000000000000000000000000000000000090920467ffffffffffffffff1693909201839052929392900b9181908490565b61577b6158e6565b60005b83518110156157e057600084828151811061579557fe5b016020015160f81c90506157ba8482601f81106157ae57fe5b6020020151600161589a565b848260ff16601f81106157c957fe5b61ffff90921660209290920201525060010161577e565b509092915050565b600083838110156157fb57600285850304015b61580581846152a4565b95945050505050565b600081851015615865576040805162461bcd60e51b815260206004820181905260248201527f6761734c6566742063616e6e6f742065786365656420696e697469616c476173604482015290519081900360640190fd5b818503830161179301633b9aca00858202026fffffffffffffffffffffffffffffffff811061589057fe5b9695505050505050565b6000611b1f8261ffff168461ffff160161ffff6152a4565b6040518060a001604052806158c56159e0565b81526060602082018190526040820181905280820152600060809091015290565b604051806103e00160405280601f906020820280368337509192915050565b604080518082019091526000808252602082015290565b6002830191839082156159a25791602002820160005b8382111561597257835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302615932565b80156159a05782816101000a81549061ffff0219169055600201602081600101049283019260010302615972565b505b506159ae929150615a07565b5090565b82601f81019282156159a2579160200282015b828111156159a25782518255916020019190600101906159c5565b60408051608081018252600080825260208201819052918101829052606081019190915290565b5b808211156159ae5760008155600101615a0856fe6f7261636c6520616464726573736573206f7574206f6620726567697374726174696f6e416363657373436f6e74726f6c6c65644f6666636861696e41676772656761746f7220322e302e30a2646970667358221220ecb65e2069c65f54ce04dfa871092389f10ea3417b6b718ee60553278f7cca8a64736f6c6343000706003300000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000007285f800000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000005b8d800000000000000000000000000b9d5d9136855f6fec3c0993fee6e9ce8a29784600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001431e0fae6d7217ca9fffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641b698ad1c6e503470520b0eecb472c0589dfe6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000009425443202f205553440000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

242:2856:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1904:159:13;;;:::i;:::-;;12053:480:10;;;;;;;;;;;;;;;;-1:-1:-1;12053:480:10;-1:-1:-1;;;;;12053:480:10;;:::i;:::-;;;;;;;;;;;;;;;;1108:163:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2593:40:10;;;:::i;:::-;;;;-1:-1:-1;;;;;2593:40:10;;;;;;;;;;;;;;2556:33:9;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;9755:470:10;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26460:40:9;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1354:136:1;;;:::i;26558:44:9:-;;;:::i;6799:1961::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6799:1961:9;;-1:-1:-1;6799:1961:9;-1:-1:-1;6799:1961:9;:::i;1715:135:1:-;;;:::i;796:209:12:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;796:209:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;796:209:12;;-1:-1:-1;796:209:12;;-1:-1:-1;;;;;796:209:12:i;:::-;;;;;;;;;;;;;;;;;;2674:33:9;;;:::i;13588:146::-;;;:::i;2329:141:1:-;;;:::i;807:254:11:-;;;:::i;1684:157:13:-;;;:::i;10016:112:9:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9588:244;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1531:143:1;;;:::i;1448:175:13:-;;;;;;;;;;;;;;;;-1:-1:-1;1448:175:13;-1:-1:-1;;;;;1448:175:13;;:::i;11754:174:10:-;;;;;;;;;;;;;;;;-1:-1:-1;11754:174:10;-1:-1:-1;;;;;11754:174:10;;:::i;179:28:11:-;;;:::i;11027:217:9:-;;;:::i;:::-;;;;-1:-1:-1;;;;;11027:217:9;;;;;;;;;;;;;;;;;;;;;;14680:461;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11421:142:10;;;:::i;2511:280:1:-;;;;;;;;;;;;;;;;-1:-1:-1;2511:280:1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25928:684:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25928:684:10;;-1:-1:-1;25928:684:10;-1:-1:-1;25928:684:10;:::i;13901:437:9:-;;;;;;;;;;;;;;;;-1:-1:-1;13901:437:9;-1:-1:-1;;;;;13901:437:9;;:::i;1090:90:13:-;;;;;;;;;;;;;;;;-1:-1:-1;1090:90:13;-1:-1:-1;;;;;1090:90:13;;:::i;27587:383:10:-;;;;;;;;;;;;;;;;-1:-1:-1;27587:383:10;-1:-1:-1;;;;;27587:383:10;;:::i;1891:154:1:-;;;;;;;;;;;;;;;;-1:-1:-1;1891:154:1;;:::i;2086:161::-;;;;;;;;;;;;;;;;-1:-1:-1;2086:161:1;;:::i;8651:547:10:-;;;;;;;;;;;;;;;;-1:-1:-1;8651:547:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19287:472::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19287:472:10;;;;;;;;:::i;19348:5372:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19348:5372:9;-1:-1:-1;19348:5372:9;;:::i;21386:499:10:-;;;:::i;453:24:13:-;;;:::i;22064:278:10:-;;;;;;;;;;;;;;;;-1:-1:-1;22064:278:10;-1:-1:-1;;;;;22064:278:10;;:::i;:::-;;;;;;;;;;;;;;;;;;;17016:553:9;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11485:494;;;;;;;;;;;;;;;;-1:-1:-1;11485:494:9;;-1:-1:-1;;;;;11485:494:9;;;;;;;;:::i;26863:499:10:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26863:499:10;;;;;;;;;;:::i;568:150:11:-;;;;;;;;;;;;;;;;-1:-1:-1;568:150:11;-1:-1:-1;;;;;568:150:11;;:::i;11118:188:10:-;;;;;;;;;;;;;;;;-1:-1:-1;11118:188:10;-1:-1:-1;;;;;11118:188:10;;:::i;2832:263:1:-;;;:::i;1904:159:13:-;1195:5:11;;-1:-1:-1;;;;;1195:5:11;1181:10;:19;1173:54;;;;;-1:-1:-1;;;1173:54:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;1975:12:13::1;::::0;::::1;;1971:88;;;1997:12;:20:::0;;;::::1;::::0;;2031:21:::1;::::0;::::1;::::0;2012:5:::1;::::0;2031:21:::1;1971:88;1904:159::o:0;12053:480:10:-;-1:-1:-1;;;;;12169:23:10;;12129:7;12169:23;;;:9;:23;;;;;;;;12146:46;;;;;;;;;;;;;;;;12129:7;;12146:46;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12146:46:10;-1:-1:-1;12217:10:10;12202:6;:11;;;:25;;;;;;;;;12198:44;;;12238:1;12231:8;;;;;12198:44;12247:34;;;;;;;;12272:9;12247:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12352:12;;12247:34;;:22;;:34;;;;12325:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;12317:53;;:101;12428:6;12317:118;12287:148;;12501:1;12458:26;12485:6;:12;;;12458:40;;;;;;;;;;;:44;12441:61;;-1:-1:-1;;;12053:480:10;;;;:::o;1108:163:1:-;1194:13;1217:49;;;;;;;;;;;;;;;;;;;1108:163;:::o;2593:40:10:-;;;:::o;2556:33:9:-;;;:::o;9755:470:10:-;9994:34;;;;;;;;10019:9;9994:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9755:470::o;26460:40:9:-;;;:::o;1354:136:1:-;1442:6;2169:31:13;2179:10;2191:8;;2169:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2169:9:13;;-1:-1:-1;;;2169:31:13:i;:::-;2161:53;;;;;-1:-1:-1;;;2161:53:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;1465:20:1::1;:18;:20::i;:::-;1458:27;;1354:136:::0;:::o;26558:44:9:-;26601:1;26558:44;:::o;6799:1961::-;7012:8;7029:13;5930:417;;;1905:2:10;6046:28:9;;;6038:57;;;;;-1:-1:-1;;;6038:57:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;6122:1;6109:10;:14;6101:53;;;;;-1:-1:-1;;;6101:53:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;6190:16;6175:11;:31;6160:98;;;;-1:-1:-1;;;6160:98:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6288:10;6286:1;:12;6272:11;:26;6264:71;;;;;-1:-1:-1;;;6264:71:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1195:5:11::1;::::0;-1:-1:-1;;;;;1195:5:11::1;1181:10;:19;1173:54;;;::::0;;-1:-1:-1;;;1173:54:11;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;7094:9:9::2;:16:::0;:21;7087:373:::2;;7187:9;:16:::0;;:20;;;;7172:12:::2;::::0;7187:20;;7232:18;::::2;;;;;;::::0;;;::::2;::::0;;::::2;::::0;7280:14:::2;:23:::0;;-1:-1:-1;;;;;7232:18:9;;::::2;::::0;-1:-1:-1;7280:14:9;7295:7;;7280:23;::::2;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;7280:23:9::2;::::0;-1:-1:-1;7311:22:9::2;7280:23:::0;7311:9:::2;:22::i;:::-;-1:-1:-1::0;;;;;7348:17:9;;::::2;;::::0;;;:9:::2;:17;::::0;;;;;7341:24;;;;;;;;;7380:22;;::::2;::::0;;;;7373:29;;;;;;;7410:9:::2;:15:::0;;;::::2;;;;;::::0;;;::::2;::::0;;;;;;;;;;;::::2;::::0;;;;;7433:14:::2;:20:::0;;;::::2;;;;;::::0;;;::::2;::::0;;;;;;;;;;;::::2;::::0;;;;;-1:-1:-1;7087:373:9::2;::::0;-1:-1:-1;;7087:373:9::2;;7471:6;7466:610;7483:19:::0;;::::2;7466:610;;;7605:10;7574:9;:22;7584:8;;7593:1;7584:11;;;;;;;;::::0;;::::2;::::0;;;::::2;;-1:-1:-1::0;;;;;7584:11:9::2;7574:22:::0;;-1:-1:-1;7574:22:9;::::2;::::0;;;;;;-1:-1:-1;7574:22:9;:27;::::2;::::0;::::2;;;:41;::::0;::::2;;;;;;;7557:101;;;::::0;;-1:-1:-1;;;7557:101:9;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;7691:29;::::0;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;7708:11:::2;7691:29;::::0;::::2;::::0;7666:9:::2;-1:-1:-1::0;7676:8:9;;7691:29;7676:11;;::::2;;;;;;::::0;;::::2;::::0;;;::::2;;-1:-1:-1::0;;;;;7676:11:9::2;7666:22:::0;;-1:-1:-1;7666:22:9;;::::2;::::0;;;;;;-1:-1:-1;7666:22:9;:54;;;;;::::2;;::::0;;::::2;;::::0;;;;;::::2;::::0;:22;;;;:54;::::2;;::::0;::::2;::::0;::::2;;;;;;;;::::0;;-1:-1:-1;7774:1:9::2;::::0;-1:-1:-1;7736:8:9::2;::::0;-1:-1:-1;7774:1:9;7745:13;;7759:1;7745:16;;::::2;;;;;-1:-1:-1::0;;;;;7745:16:9::2;::::0;;::::2;::::0;;;::::2;;::::0;::::2;7736:26:::0;;;::::2;::::0;;;;;;;;-1:-1:-1;7736:26:9;;::::2;:40:::0;;;::::2;;::::0;-1:-1:-1;7728:70:9::2;;;::::0;;-1:-1:-1;;;7728:70:9;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;7859:10;7823:9;:27;7833:13;;7847:1;7833:16;;;;;;;;::::0;;::::2;::::0;;;::::2;;-1:-1:-1::0;;;;;7833:16:9::2;7823:27:::0;;-1:-1:-1;7823:27:9;::::2;::::0;;;;;;-1:-1:-1;7823:27:9;:32;::::2;::::0;::::2;;;:46;::::0;::::2;;;;;;;7806:111;;;::::0;;-1:-1:-1;;;7806:111:9;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;7955:34;::::0;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;7972:16:::2;7955:34;::::0;::::2;::::0;7925:9:::2;-1:-1:-1::0;7935:13:9;;7955:34;7935:16;;::::2;;;;;;::::0;;::::2;::::0;;;::::2;;-1:-1:-1::0;;;;;7935:16:9::2;7925:27:::0;;-1:-1:-1;7925:27:9;;::::2;::::0;;;;;;-1:-1:-1;7925:27:9;:64;;;;;::::2;;::::0;;::::2;;::::0;;;;;::::2;::::0;:27;;;;:64;::::2;;::::0;::::2;::::0;::::2;;;;;;;;;;;;;;7997:9;8012:8;;8021:1;8012:11;;;;;;;7997:27:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;7997:27:9;;;8012:11:::2;7997:27:::0;;;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;;8012:11:9;;;::::2;::::0;;;::::2;;::::0;;;::::2;7997:27:::0;;;::::2;::::0;;-1:-1:-1;8032:14:9::2;8052:13:::0;;8066:1;8052:16;;::::2;;;;;8032:37:::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;8032:37:9;;;8052:16:::2;8032:37:::0;;;;;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;;8052:16:9;;;::::2;::::0;;;::::2;;::::0;;;::::2;8032:37;::::0;;;-1:-1:-1;7504:3:9::2;7466:610;;;-1:-1:-1::0;8081:9:9::2;:32:::0;;::::2;::::0;::::2;::::0;::::2;::::0;;;::::2;;::::0;;8154:25:::2;::::0;;8220:12:::2;8154:25;8185:48:::0;;::::2;8154:25:::0;8185:48;;::::2;::::0;;::::2;;8239:18:::0;;::::2;-1:-1:-1::0;8239:18:9::2;::::0;::::2;::::0;;;::::2;;::::0;;;;8154:25;;::::2;::::0;::::2;::::0;8284:13:::2;8342:188;8386:4;8284:13:::0;8422:8;;8440:13;;8103:10;8483:21;8514:8;;8342:26:::2;:188::i;:::-;8311:9;:28;;;:219;;;;;;;;;;;;;;;;;;8570:1;8538:9;:29;;;:33;;;;;;;;;;;;;;;;;;8588:167;8605:25;8638:11;8657:8;;8673:13;;8694:10;8712:21;8741:8;;8588:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;::::2;;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;-1:-1:-1;8588:167:9;;;::::2;::::0;;;::::2;;::::0;;::::2;::::0;::::2;;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;::::2;;::::0;-1:-1:-1;8588:167:9;;;;;::::2;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;-1:-1:-1;8588:167:9;;-1:-1:-1;;;;;;;;;;;;;;8588:167:9::2;1233:1:11;;6799:1961:9::0;;;;;;;;;;;:::o;1715:135:1:-;1802:7;2169:31:13;2179:10;2191:8;;2169:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2169:9:13;;-1:-1:-1;;;2169:31:13:i;:::-;2161:53;;;;;-1:-1:-1;;;2161:53:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;1826:19:1::1;:17;:19::i;796:209:12:-:0;924:4;945:33;961:5;968:9;945:15;:33::i;:::-;:55;;;-1:-1:-1;;;;;;982:18:12;;991:9;982:18;945:55;938:62;;796:209;;;;;:::o;2674:33:9:-;;;:::o;13588:146::-;13702:27;;-1:-1:-1;;;;;13702:27:9;13588:146;:::o;2329:141:1:-;2416:13;2169:31:13;2179:10;2191:8;;2169:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2169:9:13;;-1:-1:-1;;;2169:31:13:i;:::-;2161:53;;;;;-1:-1:-1;;;2161:53:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;2446:19:1::1;:17;:19::i;807:254:11:-:0;877:12;;-1:-1:-1;;;;;877:12:11;863:10;:26;855:61;;;;;-1:-1:-1;;;855:61:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;923:16;942:5;;961:10;953:18;;;;;;;;-1:-1:-1;977:25:11;;;;;;;1014:42;;-1:-1:-1;;;;;942:5:11;;;;961:10;;942:5;;1014:42;;;807:254;:::o;1684:157:13:-;1195:5:11;;-1:-1:-1;;;;;1195:5:11;1181:10;:19;1173:54;;;;;-1:-1:-1;;;1173:54:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;1755:12:13::1;::::0;::::1;;1750:87;;1777:12;:19:::0;;;::::1;1792:4;1777:19;::::0;;1810:20:::1;::::0;::::1;::::0;1777:12:::1;::::0;1810:20:::1;1684:157::o:0;10016:112:9:-;10074:16;10109:14;10102:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10102:21:9;;;;;;;;;;;;;;;;;;;;;;;10016:112;:::o;9588:244::-;9756:13;;9798:9;:28;9756:13;;;;;9771:25;;;;;9798:28;;9588:244;;;:::o;1531:143:1:-;1622:7;2169:31:13;2179:10;2191:8;;2169:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2169:9:13;;-1:-1:-1;;;2169:31:13:i;:::-;2161:53;;;;;-1:-1:-1;;;2161:53:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;1646:23:1::1;:21;:23::i;1448:175:13:-:0;1195:5:11;;-1:-1:-1;;;;;1195:5:11;1181:10;:19;1173:54;;;;;-1:-1:-1;;;1173:54:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1526:17:13;::::1;;::::0;;;:10:::1;:17;::::0;;;;;::::1;;1522:97;;;-1:-1:-1::0;;;;;1553:17:13;::::1;1573:5;1553:17:::0;;;:10:::1;:17;::::0;;;;;;;;:25;;;::::1;::::0;;1592:20;;;;;;;::::1;::::0;;;;;;;;::::1;1522:97;1448:175:::0;:::o;11754:174:10:-;-1:-1:-1;;;;;11844:22:10;;;;;;;:8;:22;;;;;;;11830:10;:36;11822:72;;;;;-1:-1:-1;;;11822:72:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;11900:23;11910:12;11900:9;:23::i;179:28:11:-;;;-1:-1:-1;;;;;179:28:11;;:::o;11027:217:9:-;11154:45;;;;;;;;;11182:17;11154:45;-1:-1:-1;;;;;11154:45:9;;;;;;;;;;;;;;;;;;;11027:217::o;14680:461::-;14725:6;14761:5;;-1:-1:-1;;;;;14761:5:9;14747:10;:19;;:82;;-1:-1:-1;14770:27:9;;:59;;;;;;14808:10;14770:59;;;;;;;;;;;;14820:8;14770:59;;;;;;-1:-1:-1;;;;;14770:27:9;;;;:37;;14808:10;;14770:27;;14820:8;;14770:59;;;;:27;14820:8;;14770:27;:59;;;;;;;;;;;;;;;;;;;-1:-1:-1;14770:59:9;;-1:-1:-1;14770:59:9;;-1:-1:-1;;;14770:59:9;;;;-1:-1:-1;14770:59:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14770:59:9;14747:82;14739:130;;;;;-1:-1:-1;;;14739:130:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;14876:34;;;;;;;;;14901:9;14876:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14922:166;;;;;15036:1;15003:34;;;;;;14922:166;;;;;;;;;;;;;;;14876:34;;14944:10;;14922:166;;;;;;;;;;;15101:7;:31;;;15135:1;15101:35;15094:42;;;;;14680:461;:::o;11421:142:10:-;11533:25;;-1:-1:-1;;;;;11533:25:10;11421:142;:::o;2511:280:1:-;2621:14;2643:13;2664:17;2689;2714:22;2169:31:13;2179:10;2191:8;;2169:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2169:9:13;;-1:-1:-1;;;2169:31:13:i;:::-;2161:53;;;;;-1:-1:-1;;;2161:53:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;2758:28:1::1;2777:8;2758:18;:28::i;:::-;2751:35:::0;;;;-1:-1:-1;2751:35:1;;-1:-1:-1;2751:35:1;-1:-1:-1;2751:35:1;;-1:-1:-1;2511:280:1;-1:-1:-1;;2511:280:1:o;25928:684:10:-;1195:5:11;;-1:-1:-1;;;;;1195:5:11;1181:10;:19;1173:54;;;;;-1:-1:-1;;;1173:54:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;26066:38:10;;::::1;26058:83;;;::::0;;-1:-1:-1;;;26058:83:10;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26153:6;26148:460;26165:24:::0;;::::1;26148:460;;;26204:19;26226:13;;26240:1;26226:16;;;;;;;;;;;;;-1:-1:-1::0;;;;;26226:16:10::1;26204:38;;26250:13;26266:7;;26274:1;26266:10;;;;;;;-1:-1:-1::0;;;;;26307:21:10;;::::1;26284:20;26307:21:::0;;;:8:::1;26266:10;26307:21:::0;;;;;;;;26266:10;::::1;::::0;;;::::1;;::::0;::::1;::::0;-1:-1:-1;26307:21:10;;::::1;::::0;-1:-1:-1;26353:26:10;;;;26395:34:::1;;;26424:5;-1:-1:-1::0;;;;;26408:21:10::1;:12;-1:-1:-1::0;;;;;26408:21:10::1;;26395:34;26387:64;;;::::0;;-1:-1:-1;;;26387:64:10;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;26459:21:10;;::::1;;::::0;;;:8:::1;:21;::::0;;;;:29;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;26501:21;;::::1;;26497:105;;26587:5;-1:-1:-1::0;;;;;26539:54:10::1;26573:12;-1:-1:-1::0;;;;;26539:54:10::1;26560:11;-1:-1:-1::0;;;;;26539:54:10::1;;;;;;;;;;;26497:105;-1:-1:-1::0;;26191:3:10::1;::::0;;::::1;::::0;-1:-1:-1;26148:460:10::1;::::0;-1:-1:-1;26148:460:10::1;;;25928:684:::0;;;;:::o;13901:437:9:-;1195:5:11;;-1:-1:-1;;;;;1195:5:11;1181:10;:19;1173:54;;;;;-1:-1:-1;;;1173:54:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;14070:27:9::1;::::0;-1:-1:-1;;;;;14070:27:9;;::::1;::::0;14107:43;::::1;::::0;::::1;14103:231;;14160:27;:83:::0;;;::::1;-1:-1:-1::0;;;;;14160:83:9;;::::1;::::0;;::::1;::::0;;;14256:71:::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;14103:231;1233:1:11;13901:437:9::0;:::o;1090:90:13:-;1195:5:11;;-1:-1:-1;;;;;1195:5:11;1181:10;:19;1173:54;;;;;-1:-1:-1;;;1173:54:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;1151:24:13::1;1169:5;1151:17;:24::i;27587:383:10:-:0;-1:-1:-1;;;;;27685:30:10;;;;;;;:16;:30;;;;;;;27671:10;:44;27663:88;;;;;-1:-1:-1;;;27663:88:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27781:22:10;;;27758:20;27781:22;;;:8;:22;;;;;;;;;;27834:10;27809:35;;;;;;;;;27850:16;:30;;;;;;:43;;;;;;;;27905:60;;27781:22;;;27834:10;;27781:22;;;;27905:60;;27758:20;27905:60;27587:383;;:::o;1891:154:1:-;1992:6;2169:31:13;2179:10;2191:8;;2169:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2169:9:13;;-1:-1:-1;;;2169:31:13:i;:::-;2161:53;;;;;-1:-1:-1;;;2161:53:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;2015:25:1::1;2031:8;2015:15;:25::i;2086:161::-:0;2190:7;2169:31:13;2179:10;2191:8;;2169:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2169:9:13;;-1:-1:-1;;;2169:31:13:i;:::-;2161:53;;;;;-1:-1:-1;;;2161:53:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;2214:28:1::1;2233:8;2214:18;:28::i;8651:547:10:-:0;8894:25;;8859:32;8947:5;-1:-1:-1;;;;;8894:25:10;;;;8947:5;8933:10;:19;;:61;;-1:-1:-1;8956:38:10;;;;;;8973:10;8956:38;;;;;;;;;;;;8985:8;8956:38;;;;;;-1:-1:-1;;;;;8956:16:10;;;;;8985:8;;8956:38;;;;8985:8;;;;8956:38;;;;;;;;;;;;;;;;;;;-1:-1:-1;8956:38:10;;-1:-1:-1;8956:38:10;;-1:-1:-1;;;8956:38:10;;;;-1:-1:-1;8956:38:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8956:38:10;8933:61;8925:112;;;;;-1:-1:-1;;;8925:112:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9043:12;:10;:12::i;:::-;9061:132;9080:16;9098:19;9119:16;9143:23;9168:24;9061:18;:132::i;:::-;8651:547;;;;;;:::o;19287:472::-;19390:5;;-1:-1:-1;;;;;19390:5:10;19376:10;:19;;:80;;-1:-1:-1;19399:25:10;;:57;;;;;;19435:10;19399:57;;;;;;;;;;;;19447:8;19399:57;;;;;;-1:-1:-1;;;;;19399:25:10;;;;:35;;19435:10;;19399:25;;19447:8;;19399:57;;;;:25;19447:8;;19399:25;:57;;;;;;;;;;;;;;;;;;;-1:-1:-1;19399:57:10;;-1:-1:-1;19399:57:10;;-1:-1:-1;;;19399:57:10;;;;-1:-1:-1;19399:57:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19399:57:10;19376:80;19368:131;;;;;-1:-1:-1;;;19368:131:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19505:15;19523:14;:12;:14::i;:::-;19505:32;;19543:19;19565:4;-1:-1:-1;;;;;19565:14:10;;19588:4;19565:29;;;;;;;;;;;;;-1:-1:-1;;;;;19565:29:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19565:29:10;;-1:-1:-1;19608:22:10;;;;19600:55;;;;;-1:-1:-1;;;19600:55:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;19669:4;-1:-1:-1;;;;;19669:13:10;;19683:10;19695:35;19713:7;19699:11;:21;19722:7;19695:3;:35::i;:::-;19669:62;;;;;;;;;;;;;-1:-1:-1;;;;;19669:62:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19669:62:10;19661:93;;;;;-1:-1:-1;;;19661:93:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;19287:472;;;;:::o;19348:5372:9:-;19657:18;19678:9;19657:30;;20240:40;20262:7;;20271:3;;20276;;20240:21;:40::i;:::-;20221:8;:59;20213:103;;;;;-1:-1:-1;;;20213:103:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;20322:19;;:::i;:::-;20382:21;;;;;;;;;20394:9;20382:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20540:7:9;;;;20520:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;20502:14:9;;;20467:118;-1:-1:-1;;;20468:18:9;;;20467:118;;;20819:9;;:28;20467:118;;-1:-1:-1;20791:2:9;20769:24;;;;;20819:44;;;;;;;20802:102;;;;;-1:-1:-1;;;20802:102:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;20951:18;;;;21270:9;;:29;;;:45;;;;;;;21262:70;;;;;-1:-1:-1;;;21262:70:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;21362:9;;:19;;;21349:32;;;;21341:66;;;;;-1:-1:-1;;;21341:66:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;1905:2:10;21423:27:9;;;21415:59;;;;;-1:-1:-1;;;21415:59:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;21490:24;;;21482:67;;;;;-1:-1:-1;;;21482:67:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;1905:2:10;21565:1:9;:14;;;:21;:38;;21557:95;;;;;-1:-1:-1;;;21557:95:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;21696:1;:9;;;:19;;;21692:1;:23;21668:47;;:1;:14;;;:21;:47;21660:104;;;;;-1:-1:-1;;;21660:104:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;21854:3;21844:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21844:21:9;-1:-1:-1;21837:4:9;;;:28;21878:7;21873:77;21891:14;;;;-1:-1:-1;21873:77:9;;;21932:6;21939:1;21932:9;;;;;;;;;;;;21922:1;:4;;;21927:1;21922:7;;;;;;;;;;;;;:19;;;;;;;;;;-1:-1:-1;21907:3:9;;21873:77;;;;22061:1;:14;;;:21;22051:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22051:32:9;-1:-1:-1;22037:11:9;;;:46;22091:31;;:::i;:::-;22135:7;22130:251;22152:1;:14;;;:21;22148:1;:25;;;22130:251;;;22190:17;22216:12;22229:1;22216:15;;;;;;;;;;;-1:-1:-1;22251:4:9;22216:15;22251:17;;;;;;;;;;;22250:18;22242:54;;;;;-1:-1:-1;;;22242:54:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;22326:4;22306;22311:11;22306:17;;;;;;;;;:24;;;:17;;;;;;;;:24;22357:12;;:15;;;;;;;;;;;;;22340:1;:11;;;22352:1;22340:14;;;;;;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;22175:3:9;;22130:251;;;-1:-1:-1;22427:10:9;22389:25;22417:21;;;:9;:21;;;;;;;;22389:49;;;;;;;;;;;;;;;;;;22417:21;;22389:49;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22389:49:9;-1:-1:-1;22528:16:9;22508:11;:16;;;:36;;;;;;;;;:95;;;;;22570:14;22585:11;:17;;;22570:33;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22570:33:9;22556:10;:47;22508:95;22446:201;;;;;-1:-1:-1;;;22446:201:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22812:9:9;;:45;;;;:29;;;;:45;-1:-1:-1;;22930:18:9;;22812:9;;22940:7;;;;22930:18;22940:7;;;;22930:18;;;;;;;;;;;;;-1:-1:-1;22956:33:9;;-1:-1:-1;22956:33:9;;-1:-1:-1;;;22956:33:9:i;:::-;22998:15;;:::i;:::-;23026:6;23021:317;23038:14;;;23021:317;;;23069:14;23086:47;23096:1;23105;:4;;;23110:1;23105:7;;;;;;;;;;;;;;;23114:2;23099:17;23118:3;;23122:1;23118:6;;;;;;;;;;;;;23126:3;;23130:1;23126:6;;;;;;;;;;;;;23086:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23086:47:9;;;;;;;-1:-1:-1;;;;;23147:17:9;;;;;;:9;23086:47;23147:17;;;;;;;23143:21;;;;;;;;;;;;;;23086:47;;-1:-1:-1;23086:47:9;;-1:-1:-1;23143:21:9;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23143:21:9;-1:-1:-1;23192:11:9;23182:1;:6;;;:21;;;;;;;;;23174:64;;;;;-1:-1:-1;;;23174:64:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;23264:7;;23257:6;;:15;;;;;;;;;;;;;23256:16;23248:49;;;;;-1:-1:-1;;;23248:49:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;23325:4;23307:6;23314:1;:7;;;23307:15;;;;;;;;;:22;;;:15;;;;;:22;-1:-1:-1;23054:3:9;;23021:317;;;;19348:5372;;;23415:6;23410:180;23455:1;23431;:14;;;:21;:25;23427:1;:29;23410:180;;;23473:12;23509:1;:14;;;23524:1;23526;23524:3;23509:19;;;;;;;;;;;;;;23488:40;;:1;:14;;;23503:1;23488:17;;;;;;;;;;;;;;:40;;;;23473:55;;23546:7;23538:43;;;;;-1:-1:-1;;;23538:43:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23458:3:9;;23410:180;;;-1:-1:-1;23614:14:9;;;;23629:21;;23598:13;;23614:14;23651:1;23629:23;;;23614:39;;;;;;;;;;;;23598:55;;23682:6;23669:19;;:9;:19;;;;:42;;;;;23702:9;23692:19;;:6;:19;;;;23669:42;23661:85;;;;;-1:-1:-1;;;23661:85:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;23754:9;;:33;;;;:35;;;;;;;;;;;;23858:45;;;;;;;;;;;;;;;;23886:15;23858:45;;-1:-1:-1;23858:45:9;;;;;;23813:9;;:33;;;23797:50;;23754:9;23797:50;;;:15;:50;;;;;:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23942:9;;:33;;;24021:14;;;;24045:11;;;;24066:18;;;;;23917:175;;;;;24001:10;23917:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23871:6;;24001:10;;24021:14;;24045:11;;24066:18;;23917:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24236:9;;:33;;;24218:180;;;24375:15;24218:180;;;;24287:3;;24218:180;;;;;;;;;;;;;24450:1;:9;;;:33;;;24411:105;;24434:6;24411:105;;;24493:15;24411:105;;;;;;;;;;;;;;;;;;24525:57;24540:1;:9;;;:33;;;24575:6;24525:57;;:14;:57::i;:::-;-1:-1:-1;24606:9:9;;24594:21;;:9;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24628:22;;24621:30;;;;24657:58;24690:10;24703:1;:11;;;24657:25;:58::i;:::-;19348:5372;;;;;;;;;:::o;21386:499:10:-;21456:23;21553:14;21577:4;-1:-1:-1;;;;;21577:14:10;;21600:4;21577:29;;;;;;;;;;;;;-1:-1:-1;;;;;21577:29:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21577:29:10;;-1:-1:-1;21752:10:10;21772:14;:12;:14::i;:::-;21851:29;;;;-1:-1:-1;;21386:499:10;:::o;453:24:13:-;;;;;;:::o;22064:278:10:-;-1:-1:-1;;;;;22200:31:10;;22161:6;22200:31;;;:9;:31;;;;;;;;22177:54;;;;;;;;;;;;;;;;22161:6;;22177:54;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22177:54:10;-1:-1:-1;22256:10:10;22241:6;:11;;;:25;;;;;;;;;22237:44;;;22277:1;22270:8;;;;;22237:44;22336:1;22293:26;22320:6;:12;;;22293:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;22286:51;;;22064:278;;;:::o;17016:553:9:-;17095:20;;;;;17234:10;17248:9;17234:23;17226:56;;;;;-1:-1:-1;;;17226:56:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17303:9:9;:28;17346:34;17449:33;;;;;17303:28;17433:50;;;:15;:50;;;;;:57;17303:28;;;;;17346:29;;;;17379:1;17346:34;;;;;;;-1:-1:-1;17346:29:9;;;;;-1:-1:-1;17433:57:9;;;;;-1:-1:-1;17498:60:9;;;;;;17016:553::o;11485:494::-;1195:5:11;;-1:-1:-1;;;;;1195:5:11;1181:10;:19;1173:54;;;;;-1:-1:-1;;;1173:54:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;11613:51:9::1;::::0;;;;::::1;::::0;;;11647:17:::1;11613:51:::0;-1:-1:-1;;;;;11613:51:9;;::::1;::::0;;;;;;::::1;;;;::::0;::::1;::::0;11675:35;::::1;;;::::0;:72:::1;;;11735:12;11714:33;;:8;:17;;;:33;;;;11675:72;11671:304;;;11777:91;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;11777:91:9;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;11757:17:::1;:111:::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;::::0;;11901:18;;11921:17;;::::1;::::0;11882:86;;;::::1;::::0;;;;::::1;::::0;;;11777:91;;11882:86;;;::::1;::::0;::::1;::::0;;;;;;::::1;11671:304;1233:1:11;11485:494:9::0;;:::o;26863:499:10:-;-1:-1:-1;;;;;26988:22:10;;;;;;;:8;:22;;;;;;;26974:10;:36;26966:78;;;;;-1:-1:-1;;;26966:78:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;27060:10;-1:-1:-1;;;;;27060:23:10;;;;27052:59;;;;;-1:-1:-1;;;27052:59:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27147:30:10;;;27120:24;27147:30;;;:16;:30;;;;;;;27185:42;;;;;;;;;;;27147:30;;;;27240:29;;27236:122;;27286:63;;-1:-1:-1;;;;;27286:63:10;;;;27327:10;;27286:63;;;;;;;;26863:499;;;:::o;568:150:11:-;1195:5;;-1:-1:-1;;;;;1195:5:11;1181:10;:19;1173:54;;;;;-1:-1:-1;;;1173:54:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;645:12:::1;:18:::0;;;::::1;-1:-1:-1::0;;;;;645:18:11;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;702:5:11;;675:38:::1;::::0;645:18;;702:5:::1;::::0;675:38:::1;::::0;-1:-1:-1;675:38:11::1;568:150:::0;:::o;11118:188:10:-;1195:5:11;;-1:-1:-1;;;;;1195:5:11;1181:10;:19;1173:54;;;;;-1:-1:-1;;;1173:54:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;11241:60:10::1;11276:24;11241:34;:60::i;2832:263:1:-:0;2930:14;2952:13;2973:17;2998;3023:22;2169:31:13;2179:10;2191:8;;2169:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2169:9:13;;-1:-1:-1;;;2169:31:13:i;:::-;2161:53;;;;;-1:-1:-1;;;2161:53:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;3067:23:1::1;:21;:23::i;:::-;3060:30;;;;;;;;;;2832:263:::0;;;;;:::o;24825:167:9:-;24946:9;:33;;;;;;24907:6;24930:50;;;:15;:50;;;;;:57;;;;;24923:64;;;24825:167::o;12954:668:10:-;-1:-1:-1;;;;;13039:23:10;;13016:20;13039:23;;;:9;:23;;;;;;;;13016:46;;;;;;;;;;;;;;;;;;13039:23;;13016:46;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13016:46:10;-1:-1:-1;13068:21:10;13092:25;13104:12;13092:11;:25::i;:::-;13068:49;-1:-1:-1;13127:17:10;;13123:495;;-1:-1:-1;;;;;13170:22:10;;;13154:13;13170:22;;;:8;:22;;;;;;;;;13306:35;;;;;13170:22;;;13306:35;;;;;;;;;;;;;;13170:22;;13306:4;:13;;;;:35;;;;;13170:22;;13306:35;;;;;;;;;;:13;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13306:35:10;13298:66;;;;;-1:-1:-1;;;13298:66:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;13415:1;13372:26;13399:6;:12;;;13372:40;;;;;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;13509:1;13466:26;13493:6;:12;;;13466:40;;;;;;;;;;:44;13565:46;;;-1:-1:-1;;;;;13565:46:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;13123:495;12954:668;;;:::o;8764:456:9:-;9044:7;9095:16;9113:12;9133:8;;9143:13;;9158:10;9170:21;9193:14;;9084:129;;;;;;-1:-1:-1;;;;;9084:129:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9084:129:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9084:129:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9074:140;;;;;;9059:156;;8764:456;;;;;;;;;;;;:::o;25350:143::-;25455:9;:33;;;;;;;25350:143::o;811:178:13:-;-1:-1:-1;;;;;950:17:13;;929:4;950:17;;;:10;:17;;;;;;;;;:34;;-1:-1:-1;;972:12:13;;;;971:13;;811:178;-1:-1:-1;;811:178:13:o;26737:129:9:-;26848:13;26841:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26818:13;;26841:20;;26848:13;;26841:20;;26848:13;26841:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26841:20:9;;26737:129;-1:-1:-1;;;;;26737:129:9:o;25077:174::-;25202:9;:33;;;;;;25162:7;25186:50;;;:15;:50;;;;;:60;;;;;;;25077:174::o;27328:500::-;27432:14;27454:13;27475:17;27500;27525:22;27582:10;27570:8;:22;;;;27594:16;;;;;;;;;;;;;;;;;27562:49;;;;;-1:-1:-1;;;27562:49:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;27652:33:9;;;27617:32;27652:33;;;:15;:33;;;;;;;;;27617:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27652:33;;27691:132;;;;27617:68;;-1:-1:-1;27617:68:9;;-1:-1:-1;27652:33:9;;27328:500::o;1184:155:13:-;-1:-1:-1;;;;;1246:17:13;;;;;;:10;:17;;;;;;;;1241:94;;-1:-1:-1;;;;;1273:17:13;;;;;;:10;:17;;;;;;;;;:24;;;;1293:4;1273:24;;;1310:18;;;;;;;;;;;;;;;;;1184:155;:::o;25646:208:9:-;25741:6;25772:10;25761:8;:21;25757:40;;;-1:-1:-1;25793:1:9;25786:8;;25757:40;-1:-1:-1;25809:33:9;;;;;;:15;:33;;;;;:40;;;;;25802:47;;;25646:208::o;26033:215::-;26131:7;26163:10;26152:8;:21;26148:40;;;-1:-1:-1;26184:1:9;26177:8;;26148:40;-1:-1:-1;26200:33:9;;;;;;:15;:33;;;;;:43;;;;;;;26033:215::o;13812:1378:10:-;13855:34;;;;;;;;13880:9;13855:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13895:76;;;;;;;;;13855:34;;-1:-1:-1;;13895:76:10;13855:34;;13895:76;;13855:34;-1:-1:-1;13895:76:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13977:89:10;;;;;;;;;;13895:76;;-1:-1:-1;;;13977:89:10;-1:-1:-1;14040:26:10;;-1:-1:-1;13977:89:10;;-1:-1:-1;13977:89:10;-1:-1:-1;14040:26:10;13977:89;;;;;;;;;;;;;;;;;;;;;;;;14072:29;14104:14;14072:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14072:46:10;;;;;;;;;;;;;;;;;;;;;;;14129:19;14124:903;14171:12;:19;14154:14;:36;14124:903;;;14218:34;14298:1;14255:24;14280:14;14255:40;;;;;;;;;;;:44;14218:81;;14307:16;14363:1;14326:18;14345:14;14326:34;;;;;;;;;;;:38;14307:57;;;;14372:21;14468:26;14423:7;:30;;;14415:39;;14404:8;:50;14458:6;14404:61;:90;14372:122;;14522:1;14506:13;:17;14502:519;;;14537:13;14553:8;:38;14562:12;14575:14;14562:28;;;;;;;;;;;;;;-1:-1:-1;;;;;14553:38:10;-1:-1:-1;;;;;14553:38:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14553:38:10;14537:54;;14717:4;-1:-1:-1;;;;;14717:13:10;;14731:5;14738:13;14717:35;;;;;;;;;;;;;-1:-1:-1;;;;;14717:35:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14717:35:10;14709:66;;;;;-1:-1:-1;;;14709:66:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;14824:1;14787:18;14806:14;14787:34;;;;;;;:38;;;;:34;;;;;;:38;14908:1;14865:24;14890:14;14865:40;;;;;;;;;;:44;14959:28;;14948:62;;14959:12;;14972:14;;14959:28;;;;;;;;;;;;14989:5;14996:13;14948:62;;;;-1:-1:-1;;;;;14948:62:10;;;;;;-1:-1:-1;;;;;14948:62:10;;;;;;;;;;;;;;;;;;;;;;14502:519;;-1:-1:-1;;;14192:16:10;;14124:903;;;-1:-1:-1;15079:47:10;:26;15108:18;15079:47;;:::i;:::-;-1:-1:-1;15132:53:10;:26;15161:24;15132:53;;:::i;7539:489::-;7767:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7755:9;:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7899:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7539:489;;;;;:::o;19816:1346::-;20449:75;;;;;;;;;;-1:-1:-1;;;;20449:75:10;20498:26;;20449:75;;20498:26;-1:-1:-1;20449:75:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20535:6;20530:140;1905:2;20547:1;:17;20530:140;;;20613:1;20590:17;20608:1;20590:20;;;;;;;;;;;:24;20579:35;;;;;;;20566:3;;20530:140;;;-1:-1:-1;20675:34:10;;;;;;;;20700:9;20675:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20883:14;20851:46;;;;;;;;;;;;;;;;;20784:61;;;;20838:6;20784:61;;20675:34;;:22;;20851:46;;20883:14;20851:46;;20883:14;20851:46;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20851:46:10;;;;;;;;;;;;;;;;-1:-1:-1;;20903:89:10;;;;;;;;;;20851:46;;-1:-1:-1;;;20903:89:10;-1:-1:-1;20966:26:10;;-1:-1:-1;20903:89:10;;-1:-1:-1;20966:26:10;20903:89;;;;;;;;;;;;;;;;;;;;;;;;21003:6;20998:160;21019:12;:19;21015:1;:23;20998:160;;;21100:1;21072:24;21097:1;21072:27;;;;;;;;;;;:29;21053:49;;;;;21040:3;;20998:160;;;;19816:1346;;;;;:::o;28173:129::-;28243:7;28268:1;28264;:5;28260:24;;;-1:-1:-1;28280:1:10;28273:8;;28260:24;-1:-1:-1;28296:1:10;28173:129;-1:-1:-1;28173:129:10:o;18258:471:9:-;18668:2;18602:15;;;18485:132;;18655:15;;;18485:185;17850:388;18485:185;18258:471;;;;;;;;:::o;11983:665::-;12082:45;;;;;;;;;12110:17;12082:45;-1:-1:-1;;;;;12082:45:9;;;;;;;;;;;;;;;12134:62;;12183:7;;;12134:62;12233:22;;;12296:38;;;;12202:28;12296:38;;;:15;:38;;;;;;;;:45;12484:12;;12511:11;;;;12484:148;;;;;;;;;;;;12296:45;;;;12261:80;;;12484:148;;;;;;;;;;;;;;;;;;;;;12261:80;;-1:-1:-1;;;;;12484:21:9;;;;;;:148;;;;;;;;;;12296:38;;12484:148;;;;;;;;;:21;:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12484:148:9;;;12480:164;;;;22347:2350:10;22493:10;22458:22;22483:21;;;:9;:21;;;;;;;;22458:46;;;;;;;;;;;;;;;;;;22483:21;;22458:46;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22510:34:10;;;;;;;;22535:9;22510:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22730:52;;;;;;;;;22458:46;;-1:-1:-1;22510:34:10;22730:52;;22744:9;;22730:52;22510:34;;22730:52;;22510:34;-1:-1:-1;22730:52:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:52::i;:::-;22695:87;;:26;;:87;;:::i;:::-;-1:-1:-1;22870:16:10;22853:8;:13;;;:33;;;;;;;;;22845:89;;;;;-1:-1:-1;;;22845:89:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22940:16;22959:145;22997:6;22982:11;:22;23041:7;:26;;;22959:145;;23075:7;:23;;;22959:145;;:15;:145::i;:::-;22940:164;-1:-1:-1;23291:2:10;23296:8;23291:20;23265:23;23441:9;23423:27;;23456:21;23480:111;23520:10;23512:19;;23539:8;23555:15;23578:7;23480:24;:111::i;:::-;23456:135;;;;23970:22;24038:3;24012:7;:23;;;23996:39;;:13;:39;23995:46;;;;;;23970:71;;24384:7;:31;;;24376:40;;24420:6;24376:51;24353:14;24308:26;24335:8;:14;;;24308:42;;;;;;;;;;;:59;:119;24257:26;24284:8;:14;;;24257:42;;;;;;;;;;:170;-1:-1:-1;;;;;;;;;22347:2350:10:o;10531:412::-;10690:25;;-1:-1:-1;;;;;10690:25:10;;;;10725:41;;;;10721:218;;10776:25;:52;;;;-1:-1:-1;;;;;10776:52:10;;;;;;;;;10841:91;;;;;;;;;;;;;;;;;;;;;;;;;;;10531:412;;:::o;28229:631:9:-;28461:9;:33;;;;;;28321:14;28687:32;;;:15;:32;;;;;;;;;28652:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28461:33;;28725:130;;;;28652:67;;28461:33;;28229:631::o;15194:463:10:-;15331:28;;:::i;:::-;15439:11;15434:194;15465:9;:16;15456:6;:25;15434:194;;;15501:14;15524:9;15534:6;15524:17;;;;;;;;;;;;;;;-1:-1:-1;15575:46:10;15595:12;15524:17;15595:22;;;;;;;;;;;15619:1;15575:19;:46::i;:::-;15550:12;15563:8;15550:22;;;;;;;;;:71;;;;:22;;;;;;:71;-1:-1:-1;15483:8:10;;15434:194;;;-1:-1:-1;15640:12:10;;15194:463;-1:-1:-1;;15194:463:10:o;17224:828::-;17451:7;17737:10;17757:31;;;17753:189;;;17934:1;17899:31;;;17898:37;17886:49;17753:189;18017:30;18021:8;18031:15;18017:3;:30::i;:::-;18010:37;17224:828;-1:-1:-1;;;;;17224:828:10:o;18213:730::-;18414:21;18467:7;18453:10;:21;;18445:66;;;;;-1:-1:-1;;;18445:66:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18554:20;;;:63;;16883:4;18554:83;18802:6;18780:18;;;:29;5920:14;18822:30;;18815:38;;;;18920:17;18213:730;-1:-1:-1;;;;;;18213:730:10:o;28008:161::-;28094:6;28124:39;28148:2;28140:11;;28136:2;28128:11;;:23;5864:13;28124:3;:39::i;-1:-1:-1:-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://ecb65e2069c65f54ce04dfa871092389f10ea3417b6b718ee60553278f7cca8a
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading