Contract 0x4a90a56525257133d4dda089a78990d1b1d82620

Contract Overview

Balance:
0 AVAX

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fbAllocate Seignio...41635592021-12-28 21:31:45397 days 5 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0116605225 27.5
0x4e82fae166b9b0cbdffb3ebc3beb639a929e9d64af19bdbdf1f32c3e2e056900Allocate Seignio...41528572021-12-28 15:31:49397 days 11 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0116605225 27.5
0xf82822a732cdca7b62b1d0bcc0e06fe2d4745e10d513af95c873e3bcddc51eb4Allocate Seignio...41427362021-12-28 9:31:43397 days 17 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0114295225 27.5
0xe493cc5bfa46458515637a0fc24855394a3f349d100587a8631fb7e8c2ff78eeAllocate Seignio...41326682021-12-28 3:31:42397 days 23 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0114295225 27.5
0xa091e45bcfcd41d6a5723b7233bf6975f1fc1afb3dce3a575b36901f5b97c1ceAllocate Seignio...41234952021-12-27 21:31:44398 days 5 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0114295225 27.5
0xdb03d094c9c5da2081f6759d15c23e90bbe8c36cd92b0f004cec80391ccc4573Allocate Seignio...41164862021-12-27 18:24:39398 days 8 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.010392415 27.5
0x2fd0a4c8becc7210fa3ce12c998a04e5767ff718dc29ff5be11667f356f0b32cAllocate Seignio...41164152021-12-27 18:23:10398 days 8 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.010392415 27.5
0x76223d4d098aaab50b28b6a0fa1b85090502f9859dac70e8801b221e8961eaa2Allocate Seignio...41083812021-12-27 15:31:45398 days 11 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0116990225 27.5
0x487a397e5d2bde82accb0b02d636c1d456fe8ba3cd64331596e6b89354dedca0Allocate Seignio...40831872021-12-26 21:52:14399 days 4 hrs ago0x878ecdd898336dccc076ce0e16dabbf8f507ab9d IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0007138 25
0xeb0bcf9c135a3b81d987c87e2f766818a97751b732db82d30b2d26000f385806Allocate Seignio...40831862021-12-26 21:52:10399 days 4 hrs ago0x878ecdd898336dccc076ce0e16dabbf8f507ab9d IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.00944765 25
0x74822fa70c7539dafdb75f6ec59cb0b619620205490cfc6e96d08a1e243e61cdAllocate Seignio...40831832021-12-26 21:52:04399 days 4 hrs ago0x878ecdd898336dccc076ce0e16dabbf8f507ab9d IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.00944765 25
0x80789e691c199c9510a9519d2c05421e78549dca0b17f9cc403e3417643fcee7Allocate Seignio...40831802021-12-26 21:51:57399 days 4 hrs ago0x878ecdd898336dccc076ce0e16dabbf8f507ab9d IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.010635475 25
0xfa374f9415a04742ed69ffc6bad967325d2e30c7a12ae89fc73d19dad9a11e26Allocate Seignio...40627392021-12-26 3:31:42399 days 23 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0114295225 27.5
0xb938dc32de15ce6cca0f27f455dea93e667127ed37dd263488a70bb60b75373dAllocate Seignio...40559332021-12-25 21:31:44400 days 5 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0116605225 27.5
0x747044cd35bb2b224c9b1c89f6d082a035e4404614f968d813d005c4c86fe7a2Allocate Seignio...40475992021-12-25 15:31:43400 days 11 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0116605225 27.5
0x5109f4f00c8d0dc10a68a6542da4200a853fcbfceb4ba148fb993d0b1ca62535Allocate Seignio...40383032021-12-25 9:31:44400 days 17 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0114295225 27.5
0x75811748650478caf529e6c8902fa82d55044a5df077decffc8bfd4bd1cbb98dAllocate Seignio...40291692021-12-25 3:31:42400 days 23 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0116605225 27.5
0x1f7db4194d8492e08ef28bc9b77d8d7b28fb7aefd6380c98f36806bbcfae25ecAllocate Seignio...40215622021-12-24 21:31:44401 days 5 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0116605225 27.5
0x6e0b0b240b447a09fd5cfd45e816851ed7d6b7d973b73e9477843a4ebe7da6e1Allocate Seignio...40126222021-12-24 15:31:43401 days 11 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0116605225 27.5
0x3f38d59cafd42dbc1e042c94d29827f885403e8ba1c7f3d54aa3d595fbf9728dAllocate Seignio...40025202021-12-24 9:31:45401 days 17 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0116605225 27.5
0xae1a79f05103660b6f77338a8b577ad41dede7b86059dff8cc05f6b37c82972bAllocate Seignio...39914642021-12-24 3:31:42401 days 23 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0116605225 27.5
0xfeb01bb3cff5f0dff495d6974c1bdd79466bd7b52329efa6620e127ec296f4b1Allocate Seignio...39808172021-12-23 21:34:31402 days 5 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.0116605225 27.5
0x25f66fbf34f0af1bb9a4771df8cd4872a2e9466397f1de70105378491139d77fRedeem Bonds39800512021-12-23 21:08:36402 days 5 hrs ago0x878ecdd898336dccc076ce0e16dabbf8f507ab9d IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.003792325
0x3aef5939db4625063844836b5842487037b131668db1bba17aa3647b80123711Allocate Seignio...39771352021-12-23 19:29:20402 days 7 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.009448775 25
0x95ab31ac1d1ed4a7f60af4f45aaf827e28729021bddf5f0a0ff8d056e389a842Allocate Seignio...39771182021-12-23 19:28:46402 days 7 hrs ago0x9f5888b5625a1f0b47b4b42bd04d45ac16863924 IN 0x4a90a56525257133d4dda089a78990d1b1d826200 AVAX0.009448775 25
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x49aa346726e4929e6adbb00096a7c42986169834526f0e68e894d339bce52c8d67472432022-03-01 16:04:07334 days 10 hrs ago 0x19a95adf4d329fe6c2d7e81cad1957dd55a4b3360x4a90a56525257133d4dda089a78990d1b1d826200 AVAX
0x3e889ffa6c208877dea849bfb2df16dba8f08134ceaf7d884a3db5d5c459a1f047206342022-01-11 16:58:02383 days 9 hrs ago 0x19a95adf4d329fe6c2d7e81cad1957dd55a4b3360x4a90a56525257133d4dda089a78990d1b1d826200 AVAX
0x3e889ffa6c208877dea849bfb2df16dba8f08134ceaf7d884a3db5d5c459a1f047206342022-01-11 16:58:02383 days 9 hrs ago 0x19a95adf4d329fe6c2d7e81cad1957dd55a4b3360x4a90a56525257133d4dda089a78990d1b1d826200 AVAX
0xb7314dff18bd5ca31928182d40dd0e6e11de058ccbc6664cd81718ca9129c90843329612022-01-02 4:23:43392 days 22 hrs ago 0x19a95adf4d329fe6c2d7e81cad1957dd55a4b3360x4a90a56525257133d4dda089a78990d1b1d826200 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x72fca528ae8c3da711a513ac8a2cef5ad03f82030 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x19a95adf4d329fe6c2d7e81cad1957dd55a4b3360 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x5c1c371397ec10c7fe23b1035b22bd03f0e8834d0 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x5c1c371397ec10c7fe23b1035b22bd03f0e8834d0 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x5c1c371397ec10c7fe23b1035b22bd03f0e8834d0 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x5c1c371397ec10c7fe23b1035b22bd03f0e8834d0 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x5c1c371397ec10c7fe23b1035b22bd03f0e8834d0 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x5c1c371397ec10c7fe23b1035b22bd03f0e8834d0 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x5c1c371397ec10c7fe23b1035b22bd03f0e8834d0 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200xf527d595c434dd6fd944954b76c6cebe1098a6a60 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x5c1c371397ec10c7fe23b1035b22bd03f0e8834d0 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x72fca528ae8c3da711a513ac8a2cef5ad03f82030 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x72fca528ae8c3da711a513ac8a2cef5ad03f82030 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x19a95adf4d329fe6c2d7e81cad1957dd55a4b3360 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x153478b3dd08b7e889ca062abc08059f894bedb20 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200xf527d595c434dd6fd944954b76c6cebe1098a6a60 AVAX
0x9fa267315f3c01b930027ebee7b274e99cc606a3c8cd32b43548aee363c3e0fb41635592021-12-28 21:31:45397 days 5 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x5c1c371397ec10c7fe23b1035b22bd03f0e8834d0 AVAX
0x72ed1e2d23997c3323ccb6e64e406983216c1a410c618572b6a9f448f6c4d04f41599882021-12-28 19:31:24397 days 7 hrs ago 0x19a95adf4d329fe6c2d7e81cad1957dd55a4b3360x4a90a56525257133d4dda089a78990d1b1d826200 AVAX
0x4e82fae166b9b0cbdffb3ebc3beb639a929e9d64af19bdbdf1f32c3e2e05690041528572021-12-28 15:31:49397 days 11 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x72fca528ae8c3da711a513ac8a2cef5ad03f82030 AVAX
0x4e82fae166b9b0cbdffb3ebc3beb639a929e9d64af19bdbdf1f32c3e2e05690041528572021-12-28 15:31:49397 days 11 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x19a95adf4d329fe6c2d7e81cad1957dd55a4b3360 AVAX
0x4e82fae166b9b0cbdffb3ebc3beb639a929e9d64af19bdbdf1f32c3e2e05690041528572021-12-28 15:31:49397 days 11 hrs ago 0x4a90a56525257133d4dda089a78990d1b1d826200x5c1c371397ec10c7fe23b1035b22bd03f0e8834d0 AVAX
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
Treasury

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at testnet.snowtrace.io on 2021-12-17
*/

// SPDX-License-Identifier: MIXED

// File @openzeppelin/contracts/math/[email protected]
// License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

// File @openzeppelin/contracts/token/ERC20/[email protected]
// License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File @openzeppelin/contracts/math/[email protected]
// License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File @openzeppelin/contracts/utils/[email protected]
// License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File @openzeppelin/contracts/token/ERC20/[email protected]
// License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File @openzeppelin/contracts/utils/[email protected]
// License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File contracts/lib/Babylonian.sol
// License-Identifier: MIT

pragma solidity ^0.6.0;

library Babylonian {
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
        // else z = 0
    }
}

// File @openzeppelin/contracts/utils/[email protected]
// License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File @openzeppelin/contracts/GSN/[email protected]
// License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

// File @openzeppelin/contracts/access/[email protected]
// License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File contracts/owner/Operator.sol
// License-Identifier: MIT

pragma solidity 0.6.12;


contract Operator is Context, Ownable {
    address private _operator;

    event OperatorTransferred(address indexed previousOperator, address indexed newOperator);

    constructor() internal {
        _operator = _msgSender();
        emit OperatorTransferred(address(0), _operator);
    }

    function operator() public view returns (address) {
        return _operator;
    }

    modifier onlyOperator() {
        require(_operator == msg.sender, "operator: caller is not the operator");
        _;
    }

    function isOperator() public view returns (bool) {
        return _msgSender() == _operator;
    }

    function transferOperator(address newOperator_) public onlyOwner {
        _transferOperator(newOperator_);
    }

    function _transferOperator(address newOperator_) internal {
        require(newOperator_ != address(0), "operator: zero address given for new operator");
        emit OperatorTransferred(address(0), newOperator_);
        _operator = newOperator_;
    }
}

// File contracts/utils/ContractGuard.sol
// License-Identifier: MIT

pragma solidity 0.6.12;

contract ContractGuard {
    mapping(uint256 => mapping(address => bool)) private _status;

    function checkSameOriginReentranted() internal view returns (bool) {
        return _status[block.number][tx.origin];
    }

    function checkSameSenderReentranted() internal view returns (bool) {
        return _status[block.number][msg.sender];
    }

    modifier onlyOneBlock() {
        require(!checkSameOriginReentranted(), "ContractGuard: one block, one function");
        require(!checkSameSenderReentranted(), "ContractGuard: one block, one function");

        _;

        _status[block.number][tx.origin] = true;
        _status[block.number][msg.sender] = true;
    }
}

// File contracts/interfaces/IBasisAsset.sol
// License-Identifier: MIT

pragma solidity ^0.6.0;

interface IBasisAsset {
    function mint(address recipient, uint256 amount) external returns (bool);

    function burn(uint256 amount) external;

    function burnFrom(address from, uint256 amount) external;

    function isOperator() external returns (bool);

    function operator() external view returns (address);

    function transferOperator(address newOperator_) external;
}

// File contracts/interfaces/IOracle.sol
// License-Identifier: MIT

pragma solidity 0.6.12;

interface IOracle {
    function update() external;

    function consult(address _token, uint256 _amountIn) external view returns (uint144 amountOut);

    function twap(address _token, uint256 _amountIn) external view returns (uint144 _amountOut);
}

// File contracts/interfaces/IOlympus.sol
// License-Identifier: MIT

pragma solidity 0.6.12;

interface IOlympus {
    function balanceOf(address _member) external view returns (uint256);

    function earned(address _member) external view returns (uint256);

    function canWithdraw(address _member) external view returns (bool);

    function canClaimReward(address _member) external view returns (bool);

    function epoch() external view returns (uint256);

    function nextEpochPoint() external view returns (uint256);

    function getHermesPrice() external view returns (uint256);

    function setOperator(address _operator) external;

    function setLockUp(uint256 _withdrawLockupEpochs, uint256 _rewardLockupEpochs) external;

    function stake(uint256 _amount) external;

    function withdraw(uint256 _amount) external;

    function exit() external;

    function claimReward() external;

    function allocateSeigniorage(uint256 _amount) external;

    function governanceRecoverUnsupported(
        address _token,
        uint256 _amount,
        address _to
    ) external;
}

// File contracts/Treasury.sol
// License-Identifier: MIT

pragma solidity 0.6.12;









/*
 _    _    ______    ______    _________    ______    _______     
| |  | |  |   ___|  |  __  \  |         |  |   ___|  |  _____|
| |__| |  |  |__    | |  | |  | |\   /| |  |  |__     \ \__
|  __  |  |   __|   | | /_/   | | \_/ | |  |   __|     \__ \
| |  | |  |  |___   | | \ \   | |     | |  |  |___    ____\ \
|_|  |_|  |______|  |_|  \_\  |_|     |_|  |______|  |_______|

*/
contract Treasury is ContractGuard {
    using SafeERC20 for IERC20;
    using Address for address;
    using SafeMath for uint256;

    /* ========= CONSTANT VARIABLES ======== */

    uint256 public constant PERIOD = 6 hours;

    /* ========== STATE VARIABLES ========== */

    // governance
    address public operator;

    // flags
    bool public initialized = false;

    // epoch
    uint256 public startTime;
    uint256 public epoch = 0;
    uint256 public epochSupplyContractionLeft = 0;

    // core components
    address public hermes;
    address public bbond;
    address public bshare;

    address public olympus;
    address public hermesOracle;

    // price
    uint256 public hermesPriceOne;
    uint256 public hermesPriceCeiling;

    uint256 public seigniorageSaved;

    uint256[] public supplyTiers;
    uint256[] public maxExpansionTiers;

    uint256 public maxSupplyExpansionPercent;
    uint256 public bondDepletionFloorPercent;
    uint256 public seigniorageExpansionFloorPercent;
    uint256 public maxSupplyContractionPercent;
    uint256 public maxDebtRatioPercent;

    // 28 first epochs (1 week) with 4.5% expansion regardless of HERMES price
    uint256 public bootstrapEpochs;
    uint256 public bootstrapSupplyExpansionPercent;

    /* =================== Added variables =================== */
    uint256 public previousEpochHermesPrice;
    uint256 public maxDiscountRate; // when purchasing bond
    uint256 public maxPremiumRate; // when redeeming bond
    uint256 public discountPercent;
    uint256 public premiumThreshold;
    uint256 public premiumPercent;
    uint256 public mintingFactorForPayingDebt; // print extra HERMES during debt phase

    address public daoFund;
    uint256 public daoFundSharedPercent;

    address public devFund;
    uint256 public devFundSharedPercent;
    address public team1Fund;
    uint256 public team1FundSharedPercent;

    /* =================== Events =================== */

    event Initialized(address indexed executor, uint256 at);
    event BurnedBonds(address indexed from, uint256 bondAmount);
    event RedeemedBonds(address indexed from, uint256 hermesAmount, uint256 bondAmount);
    event BoughtBonds(address indexed from, uint256 hermesAmount, uint256 bondAmount);
    event TreasuryFunded(uint256 timestamp, uint256 seigniorage);
    event OlympusFunded(uint256 timestamp, uint256 seigniorage);
    event DaoFundFunded(uint256 timestamp, uint256 seigniorage);
    event DevFundFunded(uint256 timestamp, uint256 seigniorage);
    event TeamFundFunded(uint256 timestamp, uint256 seigniorage);

    /* =================== Modifier =================== */

    modifier onlyOperator() {
        require(operator == msg.sender, "Treasury: caller is not the operator");
        _;
    }

    modifier checkCondition() {
        require(now >= startTime, "Treasury: not started yet");

        _;
    }

    modifier checkEpoch() {
        require(now >= nextEpochPoint(), "Treasury: not opened yet");

        _;

        epoch = epoch.add(1);
        epochSupplyContractionLeft = (getHermesPrice() > hermesPriceCeiling) ? 0 : getHermesCirculatingSupply().mul(maxSupplyContractionPercent).div(10000);
    }

    modifier checkOperator() {
        require(
            IBasisAsset(hermes).operator() == address(this) &&
                IBasisAsset(bbond).operator() == address(this) &&
                IBasisAsset(bshare).operator() == address(this) &&
                Operator(olympus).operator() == address(this),
            "Treasury: need more permission"
        );

        _;
    }

    modifier notInitialized() {
        require(!initialized, "Treasury: already initialized");

        _;
    }

    /* ========== VIEW FUNCTIONS ========== */

    function isInitialized() public view returns (bool) {
        return initialized;
    }

    // epoch
    function nextEpochPoint() public view returns (uint256) {
        return startTime.add(epoch.mul(PERIOD));
    }

    // oracle
    function getHermesPrice() public view returns (uint256 hermesPrice) {
        try IOracle(hermesOracle).consult(hermes, 1e18) returns (uint144 price) {
            return uint256(price);
        } catch {
            revert("Treasury: failed to consult HERMES price from the oracle");
        }
    }

    function getHermesUpdatedPrice() public view returns (uint256 _hermesPrice) {
        try IOracle(hermesOracle).twap(hermes, 1e18) returns (uint144 price) {
            return uint256(price);
        } catch {
            revert("Treasury: failed to consult HERMES price from the oracle");
        }
    }

    // budget
    function getReserve() public view returns (uint256) {
        return seigniorageSaved;
    }

    function getBurnableHermesLeft() public view returns (uint256 _burnableHermesLeft) {
        uint256 _hermesPrice = getHermesPrice();
        if (_hermesPrice <= hermesPriceOne) {
            uint256 _hermesSupply = getHermesCirculatingSupply();
            uint256 _bondMaxSupply = _hermesSupply.mul(maxDebtRatioPercent).div(10000);
            uint256 _bondSupply = IERC20(bbond).totalSupply();
            if (_bondMaxSupply > _bondSupply) {
                uint256 _maxMintableBond = _bondMaxSupply.sub(_bondSupply);
                uint256 _maxBurnableHermes = _maxMintableBond.mul(_hermesPrice).div(1e18);
                _burnableHermesLeft = Math.min(epochSupplyContractionLeft, _maxBurnableHermes);
            }
        }
    }

    function getRedeemableBonds() public view returns (uint256 _redeemableBonds) {
        uint256 _hermesPrice = getHermesPrice();
        if (_hermesPrice > hermesPriceCeiling) {
            uint256 _totalHermes = IERC20(hermes).balanceOf(address(this));
            uint256 _rate = getBondPremiumRate();
            if (_rate > 0) {
                _redeemableBonds = _totalHermes.mul(1e18).div(_rate);
            }
        }
    }

    function getBondDiscountRate() public view returns (uint256 _rate) {
        uint256 _hermesPrice = getHermesPrice();
        if (_hermesPrice <= hermesPriceOne) {
            if (discountPercent == 0) {
                // no discount
                _rate = hermesPriceOne;
            } else {
                uint256 _bondAmount = hermesPriceOne.mul(1e18).div(_hermesPrice); // to burn 1 HERMES
                uint256 _discountAmount = _bondAmount.sub(hermesPriceOne).mul(discountPercent).div(10000);
                _rate = hermesPriceOne.add(_discountAmount);
                if (maxDiscountRate > 0 && _rate > maxDiscountRate) {
                    _rate = maxDiscountRate;
                }
            }
        }
    }

    function getBondPremiumRate() public view returns (uint256 _rate) {
        uint256 _hermesPrice = getHermesPrice();
        if (_hermesPrice > hermesPriceCeiling) {
            uint256 _hermesPricePremiumThreshold = hermesPriceOne.mul(premiumThreshold).div(100);
            if (_hermesPrice >= _hermesPricePremiumThreshold) {
                //Price > 1.10
                uint256 _premiumAmount = _hermesPrice.sub(hermesPriceOne).mul(premiumPercent).div(10000);
                _rate = hermesPriceOne.add(_premiumAmount);
                if (maxPremiumRate > 0 && _rate > maxPremiumRate) {
                    _rate = maxPremiumRate;
                }
            } else {
                // no premium bonus
                _rate = hermesPriceOne;
            }
        }
    }

    /* ========== GOVERNANCE ========== */

    function initialize(
        address _hermes,
        address _bbond,
        address _bshare,
        address _hermesOracle,
        address _olympus,
        uint256 _startTime
    ) public notInitialized {
        hermes = _hermes;
        bbond = _bbond;
        bshare = _bshare;
        hermesOracle = _hermesOracle;
        olympus = _olympus;
        startTime = _startTime;

        hermesPriceOne = 10**18; // This is to allow a PEG of 1 HERMES per AVAX
        hermesPriceCeiling = hermesPriceOne.mul(101).div(100);

        // Dynamic max expansion percent
        supplyTiers = [0 ether, 5000 ether, 10000 ether, 15000 ether, 20000 ether, 50000 ether, 100000 ether, 200000 ether, 500000 ether];
        maxExpansionTiers = [450, 400, 350, 300, 250, 200, 150, 125, 100];

        maxSupplyExpansionPercent = 400; // Upto 4.0% supply for expansion

        bondDepletionFloorPercent = 10000; // 100% of Bond supply for depletion floor
        seigniorageExpansionFloorPercent = 3500; // At least 35% of expansion reserved for olympus
        maxSupplyContractionPercent = 300; // Upto 3.0% supply for contraction (to burn HERMES and mint tBOND)
        maxDebtRatioPercent = 4500; // Upto 35% supply of tBOND to purchase

        premiumThreshold = 110;
        premiumPercent = 7000;

        // First 28 epochs with 4.5% expansion
        bootstrapEpochs = 0;
        bootstrapSupplyExpansionPercent = 450;

        // set seigniorageSaved to it's balance
        seigniorageSaved = IERC20(hermes).balanceOf(address(this));

        initialized = true;
        operator = msg.sender;
        emit Initialized(msg.sender, block.number);
    }

    function setOperator(address _operator) external onlyOperator {
        operator = _operator;
    }

    function setOlympus(address _olympus) external onlyOperator {
        olympus = _olympus;
    }

    function setHermesOracle(address _hermesOracle) external onlyOperator {
        hermesOracle = _hermesOracle;
    }

    function setHermesPriceCeiling(uint256 _hermesPriceCeiling) external onlyOperator {
        require(_hermesPriceCeiling >= hermesPriceOne && _hermesPriceCeiling <= hermesPriceOne.mul(120).div(100), "out of range"); // [$1.0, $1.2]
        hermesPriceCeiling = _hermesPriceCeiling;
    }

    function setMaxSupplyExpansionPercents(uint256 _maxSupplyExpansionPercent) external onlyOperator {
        require(_maxSupplyExpansionPercent >= 10 && _maxSupplyExpansionPercent <= 1000, "_maxSupplyExpansionPercent: out of range"); // [0.1%, 10%]
        maxSupplyExpansionPercent = _maxSupplyExpansionPercent;
    }

    function setSupplyTiersEntry(uint8 _index, uint256 _value) external onlyOperator returns (bool) {
        require(_index >= 0, "Index has to be higher than 0");
        require(_index < 9, "Index has to be lower than count of tiers");
        if (_index > 0) {
            require(_value > supplyTiers[_index - 1]);
        }
        if (_index < 8) {
            require(_value < supplyTiers[_index + 1]);
        }
        supplyTiers[_index] = _value;
        return true;
    }

    function setMaxExpansionTiersEntry(uint8 _index, uint256 _value) external onlyOperator returns (bool) {
        require(_index >= 0, "Index has to be higher than 0");
        require(_index < 9, "Index has to be lower than count of tiers");
        require(_value >= 10 && _value <= 1000, "_value: out of range"); // [0.1%, 10%]
        maxExpansionTiers[_index] = _value;
        return true;
    }

    function setBondDepletionFloorPercent(uint256 _bondDepletionFloorPercent) external onlyOperator {
        require(_bondDepletionFloorPercent >= 500 && _bondDepletionFloorPercent <= 10000, "out of range"); // [5%, 100%]
        bondDepletionFloorPercent = _bondDepletionFloorPercent;
    }

    function setMaxSupplyContractionPercent(uint256 _maxSupplyContractionPercent) external onlyOperator {
        require(_maxSupplyContractionPercent >= 100 && _maxSupplyContractionPercent <= 1500, "out of range"); // [0.1%, 15%]
        maxSupplyContractionPercent = _maxSupplyContractionPercent;
    }

    function setMaxDebtRatioPercent(uint256 _maxDebtRatioPercent) external onlyOperator {
        require(_maxDebtRatioPercent >= 1000 && _maxDebtRatioPercent <= 10000, "out of range"); // [10%, 100%]
        maxDebtRatioPercent = _maxDebtRatioPercent;
    }

    function setBootstrap(uint256 _bootstrapEpochs, uint256 _bootstrapSupplyExpansionPercent) external onlyOperator {
        require(_bootstrapEpochs <= 120, "_bootstrapEpochs: out of range"); // <= 1 month
        require(_bootstrapSupplyExpansionPercent >= 100 && _bootstrapSupplyExpansionPercent <= 1000, "_bootstrapSupplyExpansionPercent: out of range"); // [1%, 10%]
        bootstrapEpochs = _bootstrapEpochs;
        bootstrapSupplyExpansionPercent = _bootstrapSupplyExpansionPercent;
    }

    function setExtraFunds(
        address _daoFund,
        uint256 _daoFundSharedPercent,
        address _devFund,
        uint256 _devFundSharedPercent,
        address _team1Fund,
        uint256 _team1FundSharedPercent
    ) external onlyOperator {
        require(_daoFund != address(0), "zero");
        require(_daoFundSharedPercent <= 3000, "out of range"); // <= 30%
        require(_devFund != address(0), "zero");
        require(_devFundSharedPercent <= 500, "out of range"); // <= 5%
        require(_team1Fund != address(0), "zero");
        require(_team1FundSharedPercent <= 500, "out of range"); // <= 5%
        daoFund = _daoFund;
        daoFundSharedPercent = _daoFundSharedPercent;
        devFund = _devFund;
        devFundSharedPercent = _devFundSharedPercent;
        team1Fund = _team1Fund;
        team1FundSharedPercent = _team1FundSharedPercent;
    }

    function setMaxDiscountRate(uint256 _maxDiscountRate) external onlyOperator {
        maxDiscountRate = _maxDiscountRate;
    }

    function setMaxPremiumRate(uint256 _maxPremiumRate) external onlyOperator {
        maxPremiumRate = _maxPremiumRate;
    }

    function setDiscountPercent(uint256 _discountPercent) external onlyOperator {
        require(_discountPercent <= 20000, "_discountPercent is over 200%");
        discountPercent = _discountPercent;
    }

    function setPremiumThreshold(uint256 _premiumThreshold) external onlyOperator {
        require(_premiumThreshold >= hermesPriceCeiling, "_premiumThreshold exceeds hermesPriceCeiling");
        require(_premiumThreshold <= 150, "_premiumThreshold is higher than 1.5");
        premiumThreshold = _premiumThreshold;
    }

    function setPremiumPercent(uint256 _premiumPercent) external onlyOperator {
        require(_premiumPercent <= 20000, "_premiumPercent is over 200%");
        premiumPercent = _premiumPercent;
    }

    function setMintingFactorForPayingDebt(uint256 _mintingFactorForPayingDebt) external onlyOperator {
        require(_mintingFactorForPayingDebt >= 10000 && _mintingFactorForPayingDebt <= 20000, "_mintingFactorForPayingDebt: out of range"); // [100%, 200%]
        mintingFactorForPayingDebt = _mintingFactorForPayingDebt;
    }

    /* ========== MUTABLE FUNCTIONS ========== */

    function _updateHermesPrice() internal {
        try IOracle(hermesOracle).update() {} catch {}
    }

    function getHermesCirculatingSupply() public view returns (uint256) {
        IERC20 hermesErc20 = IERC20(hermes);
        uint256 totalSupply = hermesErc20.totalSupply();
        uint256 balanceExcluded = 0;
        return totalSupply.sub(balanceExcluded);
    }

    function buyBonds(uint256 _hermesAmount, uint256 targetPrice) external onlyOneBlock checkCondition checkOperator {
        require(_hermesAmount > 0, "Treasury: cannot purchase bonds with zero amount");

        uint256 hermesPrice = getHermesPrice();
        require(hermesPrice == targetPrice, "Treasury: HERMES price moved");
        require(
            hermesPrice < hermesPriceOne, // price < $1
            "Treasury: hermesPrice not eligible for bond purchase"
        );

        require(_hermesAmount <= epochSupplyContractionLeft, "Treasury: not enough bond left to purchase");

        uint256 _rate = getBondDiscountRate();
        require(_rate > 0, "Treasury: invalid bond rate");

        uint256 _bondAmount = _hermesAmount.mul(_rate).div(1e18);
        uint256 hermesSupply = getHermesCirculatingSupply();
        uint256 newBondSupply = IERC20(bbond).totalSupply().add(_bondAmount);
        require(newBondSupply <= hermesSupply.mul(maxDebtRatioPercent).div(10000), "over max debt ratio");

        IBasisAsset(hermes).burnFrom(msg.sender, _hermesAmount);
        IBasisAsset(bbond).mint(msg.sender, _bondAmount);

        epochSupplyContractionLeft = epochSupplyContractionLeft.sub(_hermesAmount);
        _updateHermesPrice();

        emit BoughtBonds(msg.sender, _hermesAmount, _bondAmount);
    }

    function redeemBonds(uint256 _bondAmount, uint256 targetPrice) external onlyOneBlock checkCondition checkOperator {
        require(_bondAmount > 0, "Treasury: cannot redeem bonds with zero amount");

        uint256 hermesPrice = getHermesPrice();
        require(hermesPrice == targetPrice, "Treasury: HERMES price moved");
        require(
            hermesPrice > hermesPriceCeiling, // price > $1.01
            "Treasury: hermesPrice not eligible for bond purchase"
        );

        uint256 _rate = getBondPremiumRate();
        require(_rate > 0, "Treasury: invalid bond rate");

        uint256 _hermesAmount = _bondAmount.mul(_rate).div(1e18);
        require(IERC20(hermes).balanceOf(address(this)) >= _hermesAmount, "Treasury: treasury has no more budget");

        seigniorageSaved = seigniorageSaved.sub(Math.min(seigniorageSaved, _hermesAmount));

        IBasisAsset(bbond).burnFrom(msg.sender, _bondAmount);
        IERC20(hermes).safeTransfer(msg.sender, _hermesAmount);

        _updateHermesPrice();

        emit RedeemedBonds(msg.sender, _hermesAmount, _bondAmount);
    }

    function _sendToOlympus(uint256 _amount) internal {
        IBasisAsset(hermes).mint(address(this), _amount);

        uint256 _daoFundSharedAmount = 0;
        if (daoFundSharedPercent > 0) {
            _daoFundSharedAmount = _amount.mul(daoFundSharedPercent).div(10000);
            IERC20(hermes).transfer(daoFund, _daoFundSharedAmount);
            emit DaoFundFunded(now, _daoFundSharedAmount);
        }

        uint256 _devFundSharedAmount = 0;
        if (devFundSharedPercent > 0) {
            _devFundSharedAmount = _amount.mul(devFundSharedPercent).div(10000);
            IERC20(hermes).transfer(devFund, _devFundSharedAmount);
            emit DevFundFunded(now, _devFundSharedAmount);
        }

        uint256 _team1FundSharedAmount = 0;
        if (team1FundSharedPercent > 0) {
            _team1FundSharedAmount = _amount.mul(team1FundSharedPercent).div(10000);
            IERC20(hermes).transfer(team1Fund, _team1FundSharedAmount);
            emit TeamFundFunded(now, _team1FundSharedAmount);
        }

        _amount = _amount.sub(_daoFundSharedAmount).sub(_devFundSharedAmount).sub(_team1FundSharedAmount);

        IERC20(hermes).safeApprove(olympus, 0);
        IERC20(hermes).safeApprove(olympus, _amount);
        IOlympus(olympus).allocateSeigniorage(_amount);
        emit OlympusFunded(now, _amount);
    }

    function _calculateMaxSupplyExpansionPercent(uint256 _hermesSupply) internal returns (uint256) {
        for (uint8 tierId = 8; tierId >= 0; --tierId) {
            if (_hermesSupply >= supplyTiers[tierId]) {
                maxSupplyExpansionPercent = maxExpansionTiers[tierId];
                break;
            }
        }
        return maxSupplyExpansionPercent;
    }

    function allocateSeigniorage() external onlyOneBlock checkCondition checkEpoch checkOperator {
        _updateHermesPrice();
        previousEpochHermesPrice = getHermesPrice();
        uint256 hermesSupply = getHermesCirculatingSupply().sub(seigniorageSaved);
        if (epoch < bootstrapEpochs) {
            // 28 first epochs with 4.5% expansion
            _sendToOlympus(hermesSupply.mul(bootstrapSupplyExpansionPercent).div(10000));
        } else {
            if (previousEpochHermesPrice > hermesPriceCeiling) {
                // Expansion ($HERMES Price > 1 $ETH): there is some seigniorage to be allocated
                uint256 bondSupply = IERC20(bbond).totalSupply();
                uint256 _percentage = previousEpochHermesPrice.sub(hermesPriceOne);
                uint256 _savedForBond;
                uint256 _savedForOlympus;
                uint256 _mse = _calculateMaxSupplyExpansionPercent(hermesSupply).mul(1e14);
                if (_percentage > _mse) {
                    _percentage = _mse;
                }
                if (seigniorageSaved >= bondSupply.mul(bondDepletionFloorPercent).div(10000)) {
                    // saved enough to pay debt, mint as usual rate
                    _savedForOlympus = hermesSupply.mul(_percentage).div(1e18);
                } else {
                    // have not saved enough to pay debt, mint more
                    uint256 _seigniorage = hermesSupply.mul(_percentage).div(1e18);
                    _savedForOlympus = _seigniorage.mul(seigniorageExpansionFloorPercent).div(10000);
                    _savedForBond = _seigniorage.sub(_savedForOlympus);
                    if (mintingFactorForPayingDebt > 0) {
                        _savedForBond = _savedForBond.mul(mintingFactorForPayingDebt).div(10000);
                    }
                }
                if (_savedForOlympus > 0) {
                    _sendToOlympus(_savedForOlympus);
                }
                if (_savedForBond > 0) {
                    seigniorageSaved = seigniorageSaved.add(_savedForBond);
                    IBasisAsset(hermes).mint(address(this), _savedForBond);
                    emit TreasuryFunded(now, _savedForBond);
                }
            }
        }
    }

    function governanceRecoverUnsupported(
        IERC20 _token,
        uint256 _amount,
        address _to
    ) external onlyOperator {
        // do not allow to drain core tokens
        require(address(_token) != address(hermes), "hermes");
        require(address(_token) != address(bbond), "bond");
        require(address(_token) != address(bshare), "share");
        _token.safeTransfer(_to, _amount);
    }

    function olympusSetOperator(address _operator) external onlyOperator {
        IOlympus(olympus).setOperator(_operator);
    }

    function olympusSetLockUp(uint256 _withdrawLockupEpochs, uint256 _rewardLockupEpochs) external onlyOperator {
        IOlympus(olympus).setLockUp(_withdrawLockupEpochs, _rewardLockupEpochs);
    }

    function olympusAllocateSeigniorage(uint256 amount) external onlyOperator {
        IOlympus(olympus).allocateSeigniorage(amount);
    }

    function olympusGovernanceRecoverUnsupported(
        address _token,
        uint256 _amount,
        address _to
    ) external onlyOperator {
        IOlympus(olympus).governanceRecoverUnsupported(_token, _amount, _to);
    }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"hermesAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"BoughtBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"BurnedBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"DaoFundFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"DevFundFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"at","type":"uint256"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"OlympusFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"hermesAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"RedeemedBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"TeamFundFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"TreasuryFunded","type":"event"},{"inputs":[],"name":"PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allocateSeigniorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bbond","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondDepletionFloorPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bootstrapEpochs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bootstrapSupplyExpansionPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bshare","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hermesAmount","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"}],"name":"buyBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daoFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoFundSharedPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFundSharedPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochSupplyContractionLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBondDiscountRate","outputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBondPremiumRate","outputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnableHermesLeft","outputs":[{"internalType":"uint256","name":"_burnableHermesLeft","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHermesCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHermesPrice","outputs":[{"internalType":"uint256","name":"hermesPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHermesUpdatedPrice","outputs":[{"internalType":"uint256","name":"_hermesPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRedeemableBonds","outputs":[{"internalType":"uint256","name":"_redeemableBonds","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hermes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hermesOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hermesPriceCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hermesPriceOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermes","type":"address"},{"internalType":"address","name":"_bbond","type":"address"},{"internalType":"address","name":"_bshare","type":"address"},{"internalType":"address","name":"_hermesOracle","type":"address"},{"internalType":"address","name":"_olympus","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDebtRatioPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDiscountRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxExpansionTiers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPremiumRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyContractionPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyExpansionPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingFactorForPayingDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextEpochPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"olympus","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"olympusAllocateSeigniorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"olympusGovernanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawLockupEpochs","type":"uint256"},{"internalType":"uint256","name":"_rewardLockupEpochs","type":"uint256"}],"name":"olympusSetLockUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"olympusSetOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premiumPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premiumThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousEpochHermesPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bondAmount","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"}],"name":"redeemBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seigniorageExpansionFloorPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seigniorageSaved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bondDepletionFloorPercent","type":"uint256"}],"name":"setBondDepletionFloorPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bootstrapEpochs","type":"uint256"},{"internalType":"uint256","name":"_bootstrapSupplyExpansionPercent","type":"uint256"}],"name":"setBootstrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_discountPercent","type":"uint256"}],"name":"setDiscountPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_daoFund","type":"address"},{"internalType":"uint256","name":"_daoFundSharedPercent","type":"uint256"},{"internalType":"address","name":"_devFund","type":"address"},{"internalType":"uint256","name":"_devFundSharedPercent","type":"uint256"},{"internalType":"address","name":"_team1Fund","type":"address"},{"internalType":"uint256","name":"_team1FundSharedPercent","type":"uint256"}],"name":"setExtraFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOracle","type":"address"}],"name":"setHermesOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hermesPriceCeiling","type":"uint256"}],"name":"setHermesPriceCeiling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxDebtRatioPercent","type":"uint256"}],"name":"setMaxDebtRatioPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxDiscountRate","type":"uint256"}],"name":"setMaxDiscountRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxExpansionTiersEntry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPremiumRate","type":"uint256"}],"name":"setMaxPremiumRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupplyContractionPercent","type":"uint256"}],"name":"setMaxSupplyContractionPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupplyExpansionPercent","type":"uint256"}],"name":"setMaxSupplyExpansionPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintingFactorForPayingDebt","type":"uint256"}],"name":"setMintingFactorForPayingDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_olympus","type":"address"}],"name":"setOlympus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_premiumPercent","type":"uint256"}],"name":"setPremiumPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_premiumThreshold","type":"uint256"}],"name":"setPremiumThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setSupplyTiersEntry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyTiers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team1Fund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team1FundSharedPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526001805460ff60a01b191690556000600381905560045534801561002757600080fd5b50614783806100376000396000f3fe608060405234801561001057600080fd5b50600436106104335760003560e01c8063874106cc11610236578063b4d1d7951161013b578063d8092c92116100c3578063e90b245411610087578063e90b2454146109ad578063f14698de146109b5578063f32f6a23146109bd578063f53c367a146109c5578063fcb6f008146109e257610433565b8063d8092c9214610985578063d98f24951461098d578063da3ed41914610995578063dbf88c361461099d578063e6ce24cf146109a557610433565b8063c8412d021161010a578063c8412d021461092a578063c8f987f314610932578063ca994c0f1461093a578063cecce38e14610942578063d4b149441461095f57610433565b8063b4d1d7951461090a578063b8a878f914610912578063bd686b0f1461091a578063c5967c261461092257610433565b806398b762a1116101be578063a204452b1161018d578063a204452b146108af578063a575c6c6146108cc578063a77a7995146108d4578063aed43a16146108dc578063b3ab15fb146108e457610433565b806398b762a114610850578063998200251461086d5780639beb31df1461088a578063a0487eea1461089257610433565b806391bbfed51161020557806391bbfed5146107725780639340bcc014610795578063940e6064146107bb57806395303166146107e157806395b6ef0c1461080457610433565b8063874106cc1461073d5780638c664db6146107455780638d934f7414610762578063900cf0cf1461076a57610433565b80634013a08e1161033c578063570ca735116102c45780635b756179116102935780635b7561791461071557806360dda69b1461071d57806372c054f91461072557806378e979251461072d57806381d11eaf1461073557610433565b8063570ca735146106e0578063591663e1146106e857806359bf5d39146107055780635a0fc79c1461070d57610433565b8063499f3f191161030b578063499f3f191461065a57806352e8c8811461067757806354575af41461067f57806354f04a11146106b557806355ebdeef146106d857610433565b80634013a08e1461060957806340af7ba5146106115780634136ade21461062e5780634390d2a81461063657610433565b8063158ef93e116103bf57806329ef19191161038e57806329ef1919146105cc5780632a7fe5a2146105d45780632e9c7b65146105f1578063392e53cd146105f95780633edccbf01461060157610433565b8063158ef93e1461053a5780631a39356a146105565780631b0fb35f1461057c57806322f832cd146105c457610433565b80630cf60175116104065780630cf60175146104b45780630db7eb0b146104bc578063118ebbf9146104c4578063142e89e7146104e7578063154ec2db1461051d57610433565b806303be7e761461043857806304e5c7b114610452578063096c1540146104715780630b5bcec714610497575b600080fd5b6104406109ea565b60408051918252519081900360200190f35b61046f6004803603602081101561046857600080fd5b50356109f0565b005b61046f6004803603602081101561048757600080fd5b50356001600160a01b0316610abf565b61046f600480360360208110156104ad57600080fd5b5035610b2a565b610440610bc6565b610440610c78565b61046f600480360360408110156104da57600080fd5b5080359060200135610d1a565b61046f600480360360608110156104fd57600080fd5b506001600160a01b03813581169160208101359160409091013516611377565b61046f6004803603602081101561053357600080fd5b503561143a565b6105426114df565b604080519115158252519081900360200190f35b61046f6004803603602081101561056c57600080fd5b50356001600160a01b03166114ef565b61046f600480360360c081101561059257600080fd5b506001600160a01b03813581169160208101359160408201358116916060810135916080820135169060a0013561155a565b610440611790565b610440611796565b61046f600480360360208110156105ea57600080fd5b503561179c565b610440611856565b61054261185c565b61044061186d565b610440611873565b61046f6004803603602081101561062757600080fd5b5035611879565b61044061191e565b61063e611924565b604080516001600160a01b039092168252519081900360200190f35b61046f6004803603602081101561067057600080fd5b5035611933565b6104406119d0565b61046f6004803603606081101561069557600080fd5b506001600160a01b03813581169160208101359160409091013516611aad565b61046f600480360360408110156106cb57600080fd5b5080359060200135611bf2565b610440612331565b61063e612337565b61046f600480360360208110156106fe57600080fd5b5035612346565b6104406123e8565b6104406123ee565b61046f6123f4565b610440612aa6565b610440612b08565b610440612bc8565b610440612bce565b610440612bd4565b61046f6004803603602081101561075b57600080fd5b5035612bda565b61063e612c7c565b610440612c8b565b61046f6004803603604081101561078857600080fd5b5080359060200135612c91565b61046f600480360360208110156107ab57600080fd5b50356001600160a01b0316612d89565b610542600480360360408110156107d157600080fd5b5060ff8135169060200135612e3b565b61046f600480360360408110156107f757600080fd5b5080359060200135612f57565b61046f600480360360c081101561081a57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101358216916080820135169060a00135613010565b61046f6004803603602081101561086657600080fd5b50356132f8565b6104406004803603602081101561088357600080fd5b5035613346565b61063e613364565b610440600480360360208110156108a857600080fd5b5035613373565b61046f600480360360208110156108c557600080fd5b5035613380565b6104406133ce565b61063e6133d4565b61063e6133e3565b61046f600480360360208110156108fa57600080fd5b50356001600160a01b03166133f2565b61044061345d565b610440613463565b610440613469565b6104406134ec565b610440613516565b61044061351c565b610440613522565b61046f6004803603602081101561095857600080fd5b5035613629565b6105426004803603604081101561097557600080fd5b5060ff81351690602001356136ca565b61063e6137c4565b6104406137d3565b6104406137d9565b61063e6137df565b6104406137ee565b6104406137f4565b6104406137fa565b61063e613800565b61046f600480360360208110156109db57600080fd5b503561380f565b6104406138a5565b60205481565b6001546001600160a01b03163314610a395760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b600b54811015610a7a5760405162461bcd60e51b815260040180806020018281038252602c81526020018061447a602c913960400191505060405180910390fd5b6096811115610aba5760405162461bcd60e51b81526004018080602001828103825260248152602001806144da6024913960400191505060405180910390fd5b601a55565b6001546001600160a01b03163314610b085760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610b735760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b600a8110158015610b8657506103e88111155b610bc15760405162461bcd60e51b81526004018080602001828103825260288152602001806145c36028913960400191505060405180910390fd5b600f55565b600080610bd16119d0565b9050600a548111610c7457601954610bed57600a549150610c74565b6000610c1682610c10670de0b6b3a7640000600a546138ab90919063ffffffff16565b9061390b565b90506000610c41612710610c10601954610c3b600a548761397290919063ffffffff16565b906138ab565b600a54909150610c5190826139cf565b93506000601754118015610c66575060175484115b15610c715760175493505b50505b5090565b600080610c836119d0565b9050600b54811115610c74576000610cad6064610c10601a54600a546138ab90919063ffffffff16565b9050808210610d0f576000610cd9612710610c10601b54610c3b600a548861397290919063ffffffff16565b600a54909150610ce990826139cf565b93506000601854118015610cfe575060185484115b15610d095760185493505b50610d15565b600a5492505b505090565b610d22613a29565b15610d5e5760405162461bcd60e51b815260040180806020018281038252602681526020018061469a6026913960400191505060405180910390fd5b610d66613a48565b15610da25760405162461bcd60e51b815260040180806020018281038252602681526020018061469a6026913960400191505060405180910390fd5b600254421015610df5576040805162461bcd60e51b8152602060048201526019602482015278151c99585cdd5c9e4e881b9bdd081cdd185c9d1959081e595d603a1b604482015290519081900360640190fd5b6005546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d6020811015610e6357600080fd5b50516001600160a01b0316148015610ef157506006546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610eba57600080fd5b505afa158015610ece573d6000803e3d6000fd5b505050506040513d6020811015610ee457600080fd5b50516001600160a01b0316145b8015610f7357506007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610f3c57600080fd5b505afa158015610f50573d6000803e3d6000fd5b505050506040513d6020811015610f6657600080fd5b50516001600160a01b0316145b8015610ff557506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610fbe57600080fd5b505afa158015610fd2573d6000803e3d6000fd5b505050506040513d6020811015610fe857600080fd5b50516001600160a01b0316145b611046576040805162461bcd60e51b815260206004820152601e60248201527f54726561737572793a206e656564206d6f7265207065726d697373696f6e0000604482015290519081900360640190fd5b600082116110855760405162461bcd60e51b815260040180806020018281038252602e81526020018061444c602e913960400191505060405180910390fd5b600061108f6119d0565b90508181146110e5576040805162461bcd60e51b815260206004820152601c60248201527f54726561737572793a204845524d4553207072696365206d6f76656400000000604482015290519081900360640190fd5b600b5481116111255760405162461bcd60e51b81526004018080602001828103825260348152602001806144a66034913960400191505060405180910390fd5b600061112f610c78565b905060008111611186576040805162461bcd60e51b815260206004820152601b60248201527f54726561737572793a20696e76616c696420626f6e6420726174650000000000604482015290519081900360640190fd5b600061119e670de0b6b3a7640000610c1087856138ab565b600554604080516370a0823160e01b8152306004820152905192935083926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156111ee57600080fd5b505afa158015611202573d6000803e3d6000fd5b505050506040513d602081101561121857600080fd5b505110156112575760405162461bcd60e51b81526004018080602001828103825260258152602001806145246025913960400191505060405180910390fd5b61126f611266600c5483613a67565b600c5490613972565b600c556006546040805163079cc67960e41b81523360048201526024810188905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b1580156112c557600080fd5b505af11580156112d9573d6000803e3d6000fd5b50506005546112f592506001600160a01b031690503383613a7d565b6112fd613acf565b6040805182815260208101879052815133927f51e0d16595cabc591e64da08e45bb223577e5b9a39cd947b4ddc3472b2dd8878928290030190a25050436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055505050565b6001546001600160a01b031633146113c05760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b60085460408051631515d6bd60e21b81526001600160a01b038681166004830152602482018690528481166044830152915191909216916354575af491606480830192600092919082900301818387803b15801561141d57600080fd5b505af1158015611431573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b031633146114835760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b614e208111156114da576040805162461bcd60e51b815260206004820152601d60248201527f5f646973636f756e7450657263656e74206973206f7665722032303025000000604482015290519081900360640190fd5b601955565b600154600160a01b900460ff1681565b6001546001600160a01b031633146115385760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146115a35760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b6001600160a01b0386166115e7576040805162461bcd60e51b815260206004808301919091526024820152637a65726f60e01b604482015290519081900360640190fd5b610bb885111561162d576040805162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b604482015290519081900360640190fd5b6001600160a01b038416611671576040805162461bcd60e51b815260206004808301919091526024820152637a65726f60e01b604482015290519081900360640190fd5b6101f48311156116b7576040805162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b604482015290519081900360640190fd5b6001600160a01b0382166116fb576040805162461bcd60e51b815260206004808301919091526024820152637a65726f60e01b604482015290519081900360640190fd5b6101f4811115611741576040805162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b604482015290519081900360640190fd5b601d80546001600160a01b03199081166001600160a01b0398891617909155601e95909555601f8054861694871694909417909355602091909155602180549093169316929092179055602255565b60115481565b60195481565b6001546001600160a01b031633146117e55760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b600a548110158015611811575061180d6064610c106078600a546138ab90919063ffffffff16565b8111155b611851576040805162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b604482015290519081900360640190fd5b600b55565b60185481565b600154600160a01b900460ff165b90565b60165481565b601c5481565b6001546001600160a01b031633146118c25760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b614e20811115611919576040805162461bcd60e51b815260206004820152601c60248201527f5f7072656d69756d50657263656e74206973206f766572203230302500000000604482015290519081900360640190fd5b601b55565b600b5481565b601f546001600160a01b031681565b6001546001600160a01b0316331461197c5760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b61271081101580156119905750614e208111155b6119cb5760405162461bcd60e51b815260040180806020018281038252602981526020018061459a6029913960400191505060405180910390fd5b601c55565b60095460055460408051633ddac95360e01b81526001600160a01b039283166004820152670de0b6b3a7640000602482015290516000939290921691633ddac95391604480820192602092909190829003018186803b158015611a3257600080fd5b505afa925050508015611a5757506040513d6020811015611a5257600080fd5b505160015b611a925760405162461bcd60e51b81526004018080602001828103825260388152602001806146386038913960400191505060405180910390fd5b71ffffffffffffffffffffffffffffffffffff16905061186a565b6001546001600160a01b03163314611af65760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b6005546001600160a01b0384811691161415611b42576040805162461bcd60e51b81526020600482015260066024820152656865726d657360d01b604482015290519081900360640190fd5b6006546001600160a01b0384811691161415611b8e576040805162461bcd60e51b81526020600480830191909152602482015263189bdb9960e21b604482015290519081900360640190fd5b6007546001600160a01b0384811691161415611bd9576040805162461bcd60e51b8152602060048201526005602482015264736861726560d81b604482015290519081900360640190fd5b611bed6001600160a01b0384168284613a7d565b505050565b611bfa613a29565b15611c365760405162461bcd60e51b815260040180806020018281038252602681526020018061469a6026913960400191505060405180910390fd5b611c3e613a48565b15611c7a5760405162461bcd60e51b815260040180806020018281038252602681526020018061469a6026913960400191505060405180910390fd5b600254421015611ccd576040805162461bcd60e51b8152602060048201526019602482015278151c99585cdd5c9e4e881b9bdd081cdd185c9d1959081e595d603a1b604482015290519081900360640190fd5b6005546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611d1157600080fd5b505afa158015611d25573d6000803e3d6000fd5b505050506040513d6020811015611d3b57600080fd5b50516001600160a01b0316148015611dc957506006546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611d9257600080fd5b505afa158015611da6573d6000803e3d6000fd5b505050506040513d6020811015611dbc57600080fd5b50516001600160a01b0316145b8015611e4b57506007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611e1457600080fd5b505afa158015611e28573d6000803e3d6000fd5b505050506040513d6020811015611e3e57600080fd5b50516001600160a01b0316145b8015611ecd57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611e9657600080fd5b505afa158015611eaa573d6000803e3d6000fd5b505050506040513d6020811015611ec057600080fd5b50516001600160a01b0316145b611f1e576040805162461bcd60e51b815260206004820152601e60248201527f54726561737572793a206e656564206d6f7265207065726d697373696f6e0000604482015290519081900360640190fd5b60008211611f5d5760405162461bcd60e51b815260040180806020018281038252603081526020018061456a6030913960400191505060405180910390fd5b6000611f676119d0565b9050818114611fbd576040805162461bcd60e51b815260206004820152601c60248201527f54726561737572793a204845524d4553207072696365206d6f76656400000000604482015290519081900360640190fd5b600a548110611ffd5760405162461bcd60e51b81526004018080602001828103825260348152602001806144a66034913960400191505060405180910390fd5b60045483111561203e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806146f6602a913960400191505060405180910390fd5b6000612048610bc6565b90506000811161209f576040805162461bcd60e51b815260206004820152601b60248201527f54726561737572793a20696e76616c696420626f6e6420726174650000000000604482015290519081900360640190fd5b60006120b7670de0b6b3a7640000610c1087856138ab565b905060006120c3613469565b9050600061214b83600660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561211957600080fd5b505afa15801561212d573d6000803e3d6000fd5b505050506040513d602081101561214357600080fd5b5051906139cf565b9050612168612710610c10601354856138ab90919063ffffffff16565b8111156121b2576040805162461bcd60e51b81526020600482015260136024820152726f766572206d6178206465627420726174696f60681b604482015290519081900360640190fd5b6005546040805163079cc67960e41b8152336004820152602481018a905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b15801561220557600080fd5b505af1158015612219573d6000803e3d6000fd5b5050600654604080516340c10f1960e01b81523360048201526024810188905290516001600160a01b0390921693506340c10f1992506044808201926020929091908290030181600087803b15801561227157600080fd5b505af1158015612285573d6000803e3d6000fd5b505050506040513d602081101561229b57600080fd5b50506004546122aa9088613972565b6004556122b5613acf565b6040805188815260208101859052815133927f73017f1b70789e2e66759eeb3c7ec11f59e6eedb55d921cfaec5410dd42a4799928290030190a25050436000908152602081815260408083203284529091528082208054600160ff19918216811790925533845291909220805490911690911790555050505050565b601e5481565b6001546001600160a01b031681565b6001546001600160a01b0316331461238f5760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b6103e881101580156123a357506127108111155b6123e3576040805162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b604482015290519081900360640190fd5b601355565b600c5490565b600c5481565b6123fc613a29565b156124385760405162461bcd60e51b815260040180806020018281038252602681526020018061469a6026913960400191505060405180910390fd5b612440613a48565b1561247c5760405162461bcd60e51b815260040180806020018281038252602681526020018061469a6026913960400191505060405180910390fd5b6002544210156124cf576040805162461bcd60e51b8152602060048201526019602482015278151c99585cdd5c9e4e881b9bdd081cdd185c9d1959081e595d603a1b604482015290519081900360640190fd5b6124d76134ec565b42101561252b576040805162461bcd60e51b815260206004820152601860248201527f54726561737572793a206e6f74206f70656e6564207965740000000000000000604482015290519081900360640190fd5b6005546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561256f57600080fd5b505afa158015612583573d6000803e3d6000fd5b505050506040513d602081101561259957600080fd5b50516001600160a01b031614801561262757506006546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156125f057600080fd5b505afa158015612604573d6000803e3d6000fd5b505050506040513d602081101561261a57600080fd5b50516001600160a01b0316145b80156126a957506007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561267257600080fd5b505afa158015612686573d6000803e3d6000fd5b505050506040513d602081101561269c57600080fd5b50516001600160a01b0316145b801561272b57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156126f457600080fd5b505afa158015612708573d6000803e3d6000fd5b505050506040513d602081101561271e57600080fd5b50516001600160a01b0316145b61277c576040805162461bcd60e51b815260206004820152601e60248201527f54726561737572793a206e656564206d6f7265207065726d697373696f6e0000604482015290519081900360640190fd5b612784613acf565b61278c6119d0565b601655600c546000906127a7906127a1613469565b90613972565b905060145460035410156127dd576127d86127d3612710610c10601554856138ab90919063ffffffff16565b613b33565b612a2a565b600b546016541115612a2a57600654604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561282e57600080fd5b505afa158015612842573d6000803e3d6000fd5b505050506040513d602081101561285857600080fd5b5051600a5460165491925060009161286f91613972565b90506000806000612889655af3107a4000610c3b88613f62565b905080841115612897578093505b6128b2612710610c10601054886138ab90919063ffffffff16565b600c54106128d7576128d0670de0b6b3a7640000610c1088876138ab565b9150612943565b60006128ef670de0b6b3a7640000610c1089886138ab565b905061290c612710610c10601154846138ab90919063ffffffff16565b92506129188184613972565b601c54909450156129415761293e612710610c10601c54876138ab90919063ffffffff16565b93505b505b81156129525761295282613b33565b8215612a2457600c5461296590846139cf565b600c55600554604080516340c10f1960e01b81523060048201526024810186905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b1580156129bc57600080fd5b505af11580156129d0573d6000803e3d6000fd5b505050506040513d60208110156129e657600080fd5b5050604080514281526020810185905281517ff705142bf09f04297640495ddf7c59b7fd6f51894c5aea9602d631cf05f0efc2929181900390910190a15b50505050505b50600354612a399060016139cf565b600355600b54612a476119d0565b11612a6557612a60612710610c10601254610c3b613469565b612a68565b60005b600455436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b60095460055460408051630d01142560e31b81526001600160a01b039283166004820152670de0b6b3a7640000602482015290516000939290921691636808a12891604480820192602092909190829003018186803b158015611a3257600080fd5b600080612b136119d0565b9050600b54811115610c7457600554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612b6a57600080fd5b505afa158015612b7e573d6000803e3d6000fd5b505050506040513d6020811015612b9457600080fd5b505190506000612ba2610c78565b90508015610c7157612bc081610c1084670de0b6b3a76400006138ab565b935050505090565b60025481565b60105481565b60155481565b6001546001600160a01b03163314612c235760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b6101f48110158015612c3757506127108111155b612c77576040805162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b604482015290519081900360640190fd5b601055565b601d546001600160a01b031681565b60035481565b6001546001600160a01b03163314612cda5760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b6078821115612d30576040805162461bcd60e51b815260206004820152601e60248201527f5f626f6f74737472617045706f6368733a206f7574206f662072616e67650000604482015290519081900360640190fd5b60648110158015612d4357506103e88111155b612d7e5760405162461bcd60e51b815260040180806020018281038252602e815260200180614720602e913960400191505060405180910390fd5b601491909155601555565b6001546001600160a01b03163314612dd25760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b6008546040805163b3ab15fb60e01b81526001600160a01b0384811660048301529151919092169163b3ab15fb91602480830192600092919082900301818387803b158015612e2057600080fd5b505af1158015612e34573d6000803e3d6000fd5b5050505050565b6001546000906001600160a01b03163314612e875760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b60098360ff1610612ec95760405162461bcd60e51b81526004018080602001828103825260298152602001806145eb6029913960400191505060405180910390fd5b60ff831615612efb57600d6001840360ff1681548110612ee557fe5b90600052602060002001548211612efb57600080fd5b60088360ff161015612f3057600d8360010160ff1681548110612f1a57fe5b90600052602060002001548210612f3057600080fd5b81600d8460ff1681548110612f4157fe5b6000918252602090912001555060015b92915050565b6001546001600160a01b03163314612fa05760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b60085460408051632ffaaa0960e01b8152600481018590526024810184905290516001600160a01b0390921691632ffaaa099160448082019260009290919082900301818387803b158015612ff457600080fd5b505af1158015613008573d6000803e3d6000fd5b505050505050565b600154600160a01b900460ff161561306f576040805162461bcd60e51b815260206004820152601d60248201527f54726561737572793a20616c726561647920696e697469616c697a6564000000604482015290519081900360640190fd5b600580546001600160a01b03199081166001600160a01b0389811691909117909255600680548216888416179055600780548216878416179055600980548216868416179055600880549091169184169190911790556002819055670de0b6b3a7640000600a8190556130ea90606490610c109060656138ab565b600b5560408051610120810182526000815269010f0cf064dd59200000602082015269021e19e0c9bab24000009181019190915269032d26d12e980b600000606082015269043c33c19375648000006080820152690a968163f0a57b40000060a082015269152d02c7e14af680000060c0820152692a5a058fc295ed00000060e08201526969e10de76676d080000061010082015261318d90600d9060096143a0565b5060408051610120810182526101c28152610190602082015261015e9181019190915261012c606082015260fa608082015260c860a0820152609660c0820152607d60e082015260646101008201526131ea90600e9060096143f5565b50610190600f55612710601055610dac60115561012c601255611194601355606e601a55611b58601b5560006014556101c2601555600554604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561326a57600080fd5b505afa15801561327e573d6000803e3d6000fd5b505050506040513d602081101561329457600080fd5b5051600c55600180546001600160a01b031960ff60a01b19909116600160a01b1716339081179091556040805143815290517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799181900360200190a2505050505050565b6001546001600160a01b031633146133415760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b601755565b600d818154811061335357fe5b600091825260209091200154905081565b6007546001600160a01b031681565b600e818154811061335357fe5b6001546001600160a01b031633146133c95760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b601855565b60225481565b6021546001600160a01b031681565b6009546001600160a01b031681565b6001546001600160a01b0316331461343b5760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b61546081565b60175481565b600554604080516318160ddd60e01b815290516000926001600160a01b031691839183916318160ddd916004808301926020929190829003018186803b1580156134b257600080fd5b505afa1580156134c6573d6000803e3d6000fd5b505050506040513d60208110156134dc57600080fd5b505190506000612bc08282613972565b60006135116135086154606003546138ab90919063ffffffff16565b600254906139cf565b905090565b601b5481565b601a5481565b60008061352d6119d0565b9050600a548111610c74576000613542613469565b90506000613561612710610c10601354856138ab90919063ffffffff16565b90506000600660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135b357600080fd5b505afa1580156135c7573d6000803e3d6000fd5b505050506040513d60208110156135dd57600080fd5b50519050808211156136225760006135f58383613972565b9050600061360f670de0b6b3a7640000610c1084896138ab565b905061361d60045482613a67565b965050505b5050505090565b6001546001600160a01b031633146136725760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b6064811015801561368557506105dc8111155b6136c5576040805162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b604482015290519081900360640190fd5b601255565b6001546000906001600160a01b031633146137165760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b60098360ff16106137585760405162461bcd60e51b81526004018080602001828103825260298152602001806145eb6029913960400191505060405180910390fd5b600a821015801561376b57506103e88211155b6137b3576040805162461bcd60e51b81526020600482015260146024820152735f76616c75653a206f7574206f662072616e676560601b604482015290519081900360640190fd5b81600e8460ff1681548110612f4157fe5b6005546001600160a01b031681565b600f5481565b60135481565b6006546001600160a01b031681565b600a5481565b60125481565b60145481565b6008546001600160a01b031681565b6001546001600160a01b031633146138585760405162461bcd60e51b81526004018080602001828103825260248152602001806146146024913960400191505060405180910390fd5b600854604080516397ffe1d760e01b81526004810184905290516001600160a01b03909216916397ffe1d79160248082019260009290919082900301818387803b158015612e2057600080fd5b60045481565b6000826138ba57506000612f51565b828202828482816138c757fe5b04146139045760405162461bcd60e51b81526004018080602001828103825260218152602001806145496021913960400191505060405180910390fd5b9392505050565b6000808211613961576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161396a57fe5b049392505050565b6000828211156139c9576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015613904576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b4360009081526020818152604080832032845290915290205460ff1690565b4360009081526020818152604080832033845290915290205460ff1690565b6000818310613a765781613904565b5090919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611bed908490613fbf565b600960009054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613b1f57600080fd5b505af1925050508015613b30575060015b50565b600554604080516340c10f1960e01b81523060048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b158015613b8757600080fd5b505af1158015613b9b573d6000803e3d6000fd5b505050506040513d6020811015613bb157600080fd5b5050601e5460009015613c9c57613bd9612710610c10601e54856138ab90919063ffffffff16565b600554601d546040805163a9059cbb60e01b81526001600160a01b03928316600482015260248101859052905193945091169163a9059cbb916044808201926020929091908290030181600087803b158015613c3457600080fd5b505af1158015613c48573d6000803e3d6000fd5b505050506040513d6020811015613c5e57600080fd5b5050604080514281526020810183905281517fcb3f34aaa3445b461e6da5492dc89e5c257a59fa598131f3b6bbc97a3638e409929181900390910190a15b60205460009015613d8557613cc2612710610c10602054866138ab90919063ffffffff16565b600554601f546040805163a9059cbb60e01b81526001600160a01b03928316600482015260248101859052905193945091169163a9059cbb916044808201926020929091908290030181600087803b158015613d1d57600080fd5b505af1158015613d31573d6000803e3d6000fd5b505050506040513d6020811015613d4757600080fd5b5050604080514281526020810183905281517fdc8b715b18523e58b7fd0da53259dfa91efd91df4a854d94b136e3333a3b9395929181900390910190a15b60225460009015613e6e57613dab612710610c10602254876138ab90919063ffffffff16565b6005546021546040805163a9059cbb60e01b81526001600160a01b03928316600482015260248101859052905193945091169163a9059cbb916044808201926020929091908290030181600087803b158015613e0657600080fd5b505af1158015613e1a573d6000803e3d6000fd5b505050506040513d6020811015613e3057600080fd5b5050604080514281526020810183905281517f2dfe5937647c787f9c6bddefedb6b3273b627227b0493e9a83b5441fb11ee00c929181900390910190a15b613e7e816127a184818888613972565b600854600554919550613e9f916001600160a01b0390811691166000614070565b600854600554613ebc916001600160a01b03918216911686614070565b600854604080516397ffe1d760e01b81526004810187905290516001600160a01b03909216916397ffe1d79160248082019260009290919082900301818387803b158015613f0957600080fd5b505af1158015613f1d573d6000803e3d6000fd5b5050604080514281526020810188905281517fae125e9259555f4e1f77f18989770903eb97d076faecc31ec3a1b1b1c6bda4ee9450908190039091019150a150505050565b600060085b600d8160ff1681548110613f7757fe5b90600052602060002001548310613fac57600e8160ff1681548110613f9857fe5b600091825260209091200154600f55613fb5565b60001901613f67565b5050600f54919050565b6060614014826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166141839092919063ffffffff16565b805190915015611bed5780806020019051602081101561403357600080fd5b5051611bed5760405162461bcd60e51b815260040180806020018281038252602a815260200180614670602a913960400191505060405180910390fd5b8015806140f6575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156140c857600080fd5b505afa1580156140dc573d6000803e3d6000fd5b505050506040513d60208110156140f257600080fd5b5051155b6141315760405162461bcd60e51b81526004018080602001828103825260368152602001806146c06036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611bed908490613fbf565b6060614192848460008561419a565b949350505050565b6060824710156141db5760405162461bcd60e51b81526004018080602001828103825260268152602001806144fe6026913960400191505060405180910390fd5b6141e4856142f6565b614235576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106142745780518252601f199092019160209182019101614255565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146142d6576040519150601f19603f3d011682016040523d82523d6000602084013e6142db565b606091505b50915091506142eb8282866142fc565b979650505050505050565b3b151590565b6060831561430b575081613904565b82511561431b5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561436557818101518382015260200161434d565b50505050905090810190601f1680156143925780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b8280548282559060005260206000209081019282156143e9579160200282015b828111156143e9578251829069ffffffffffffffffffff169055916020019190600101906143c0565b50610c74929150614436565b8280548282559060005260206000209081019282156143e9579160200282015b828111156143e9578251829061ffff16905591602001919060010190614415565b5b80821115610c74576000815560010161443756fe54726561737572793a2063616e6e6f742072656465656d20626f6e64732077697468207a65726f20616d6f756e745f7072656d69756d5468726573686f6c642065786365656473206865726d657350726963654365696c696e6754726561737572793a206865726d65735072696365206e6f7420656c696769626c6520666f7220626f6e642070757263686173655f7072656d69756d5468726573686f6c6420697320686967686572207468616e20312e35416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c54726561737572793a20747265617375727920686173206e6f206d6f726520627564676574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7754726561737572793a2063616e6e6f7420707572636861736520626f6e64732077697468207a65726f20616d6f756e745f6d696e74696e67466163746f72466f72506179696e67446562743a206f7574206f662072616e67655f6d6178537570706c79457870616e73696f6e50657263656e743a206f7574206f662072616e6765496e6465782068617320746f206265206c6f776572207468616e20636f756e74206f6620746965727354726561737572793a2063616c6c6572206973206e6f7420746865206f70657261746f7254726561737572793a206661696c656420746f20636f6e73756c74204845524d45532070726963652066726f6d20746865206f7261636c655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756e6374696f6e5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636554726561737572793a206e6f7420656e6f75676820626f6e64206c65667420746f2070757263686173655f626f6f747374726170537570706c79457870616e73696f6e50657263656e743a206f7574206f662072616e6765a26469706673582212202e46ff27f2d24f4a323690cd425169d259f63bea7fad3d654a4374b73ac4da0c64736f6c634300060c0033

Deployed ByteCode Sourcemap

34213:23066:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36073:35;;;:::i;:::-;;;;;;;;;;;;;;;;48248:324;;;;;;;;;;;;;;;;-1:-1:-1;48248:324:0;;:::i;:::-;;43811:117;;;;;;;;;;;;;;;;-1:-1:-1;43811:117:0;-1:-1:-1;;;;;43811:117:0;;:::i;44233:319::-;;;;;;;;;;;;;;;;-1:-1:-1;44233:319:0;;:::i;40291:743::-;;;:::i;41042:797::-;;;:::i;50922:1122::-;;;;;;;;;;;;;;;;-1:-1:-1;50922:1122:0;;;;;;;:::i;57042:234::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;57042:234:0;;;;;;;;;;;;;;;;;:::i;48033:207::-;;;;;;;;;;;;;;;;-1:-1:-1;48033:207:0;;:::i;34571:31::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;43706:97;;;;;;;;;;;;;;;;-1:-1:-1;43706:97:0;-1:-1:-1;;;;;43706:97:0;;:::i;46855:900::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46855:900:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35219:47::-;;;:::i;35770:30::-;;;:::i;43936:289::-;;;;;;;;;;;;;;;;-1:-1:-1;43936:289:0;;:::i;35711:29::-;;;:::i;38088:89::-;;;:::i;35604:39::-;;;:::i;35881:41::-;;;:::i;48580:201::-;;;;;;;;;;;;;;;;-1:-1:-1;48580:201:0;;:::i;34965:33::-;;;:::i;36044:22::-;;;:::i;:::-;;;;-1:-1:-1;;;;;36044:22:0;;;;;;;;;;;;;;48789:330;;;;;;;;;;;;;;;;-1:-1:-1;48789:330:0;;:::i;38336:306::-;;;:::i;56121:425::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56121:425:0;;;;;;;;;;;;;;;;;:::i;49567:1347::-;;;;;;;;;;;;;;;;-1:-1:-1;49567:1347:0;;;;;;;:::i;36000:35::-;;;:::i;34525:23::-;;;:::i;46083:257::-;;;;;;;;;;;;;;;;-1:-1:-1;46083:257:0;;:::i;38984:94::-;;;:::i;35007:31::-;;;:::i;53822:2291::-;;;:::i;38650:311::-;;;:::i;39843:440::-;;;:::i;34625:24::-;;;:::i;35172:40::-;;;:::i;35482:46::-;;;:::i;45473:291::-;;;;;;;;;;;;;;;;-1:-1:-1;45473:291:0;;:::i;35971:22::-;;;:::i;34656:24::-;;;:::i;46348:499::-;;;;;;;;;;;;;;;;-1:-1:-1;46348:499:0;;;;;;;:::i;56554:128::-;;;;;;;;;;;;;;;;-1:-1:-1;56554:128:0;-1:-1:-1;;;;;56554:128:0;;:::i;44560:492::-;;;;;;;;;;;;;;;;-1:-1:-1;44560:492:0;;;;;;;;;:::i;56690:198::-;;;;;;;;;;;;;;;;-1:-1:-1;56690:198:0;;;;;;;:::i;41893:1696::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41893:1696:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47763:129::-;;;;;;;;;;;;;;;;-1:-1:-1;47763:129:0;;:::i;35047:28::-;;;;;;;;;;;;;;;;-1:-1:-1;35047:28:0;;:::i;34820:21::-;;;:::i;35082:34::-;;;;;;;;;;;;;;;;-1:-1:-1;35082:34:0;;:::i;47900:125::-;;;;;;;;;;;;;;;;-1:-1:-1;47900:125:0;;:::i;36146:37::-;;;:::i;36115:24::-;;;:::i;34879:27::-;;;:::i;43597:101::-;;;;;;;;;;;;;;;;-1:-1:-1;43597:101:0;-1:-1:-1;;;;;43597:101:0;;:::i;34406:40::-;;;:::i;35650:30::-;;;:::i;49291:268::-;;;:::i;38199:114::-;;;:::i;35845:29::-;;;:::i;35807:31::-;;;:::i;39086:749::-;;;:::i;45772:303::-;;;;;;;;;;;;;;;;-1:-1:-1;45772:303:0;;:::i;45060:405::-;;;;;;;;;;;;;;;;-1:-1:-1;45060:405:0;;;;;;;;;:::i;34765:21::-;;;:::i;35125:40::-;;;:::i;35322:34::-;;;:::i;34793:20::-;;;:::i;34929:29::-;;;:::i;35273:42::-;;;:::i;35445:30::-;;;:::i;34850:22::-;;;:::i;56896:138::-;;;;;;;;;;;;;;;;-1:-1:-1;56896:138:0;;:::i;34687:45::-;;;:::i;36073:35::-;;;;:::o;48248:324::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48366:18:::1;;48345:17;:39;;48337:96;;;;-1:-1:-1::0;;;48337:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48473:3;48452:17;:24;;48444:73;;;;-1:-1:-1::0;;;48444:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48528:16;:36:::0;48248:324::o;43811:117::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43892:12:::1;:28:::0;;-1:-1:-1;;;;;;43892:28:0::1;-1:-1:-1::0;;;;;43892:28:0;;;::::1;::::0;;;::::1;::::0;;43811:117::o;44233:319::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44379:2:::1;44349:26;:32;;:70;;;;;44415:4;44385:26;:34;;44349:70;44341:123;;;;-1:-1:-1::0;;;44341:123:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44490:25;:54:::0;44233:319::o;40291:743::-;40343:13;40369:20;40392:16;:14;:16::i;:::-;40369:39;;40439:14;;40423:12;:30;40419:608;;40474:15;;40470:546;;40555:14;;40547:22;;40470:546;;;40610:19;40632:42;40661:12;40632:24;40651:4;40632:14;;:18;;:24;;;;:::i;:::-;:28;;:42::i;:::-;40610:64;;40713:23;40739:63;40796:5;40739:52;40775:15;;40739:31;40755:14;;40739:11;:15;;:31;;;;:::i;:::-;:35;;:52::i;:63::-;40829:14;;40713:89;;-1:-1:-1;40829:35:0;;40713:89;40829:18;:35::i;:::-;40821:43;;40905:1;40887:15;;:19;:46;;;;;40918:15;;40910:5;:23;40887:46;40883:118;;;40966:15;;40958:23;;40883:118;40470:546;;;40291:743;;:::o;41042:797::-;41093:13;41119:20;41142:16;:14;:16::i;:::-;41119:39;;41188:18;;41173:12;:33;41169:663;;;41223:36;41262:45;41303:3;41262:36;41281:16;;41262:14;;:18;;:36;;;;:::i;:45::-;41223:84;;41342:28;41326:12;:44;41322:499;;41423:22;41448:63;41505:5;41448:52;41485:14;;41448:32;41465:14;;41448:12;:16;;:32;;;;:::i;:63::-;41538:14;;41423:88;;-1:-1:-1;41538:34:0;;41423:88;41538:18;:34::i;:::-;41530:42;;41612:1;41595:14;;:18;:44;;;;;41625:14;;41617:5;:22;41595:44;41591:115;;;41672:14;;41664:22;;41591:115;41322:499;;;;41791:14;;41783:22;;41322:499;41169:663;41042:797;;:::o;50922:1122::-;31418:28;:26;:28::i;:::-;31417:29;31409:80;;;;-1:-1:-1;;;31409:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31509:28;:26;:28::i;:::-;31508:29;31500:80;;;;-1:-1:-1;;;31500:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37140:9:::1;;37133:3;:16;;37125:54;;;::::0;;-1:-1:-1;;;37125:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37125:54:0;;;;;;;;;;;;;::::1;;37593:6:::2;::::0;37581:30:::2;::::0;;-1:-1:-1;;;37581:30:0;;;;37623:4:::2;::::0;-1:-1:-1;;;;;37593:6:0::2;::::0;37581:28:::2;::::0;:30:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;37593:6;37581:30;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37581:30:0;-1:-1:-1;;;;;37581:47:0::2;;:114:::0;::::2;;;-1:-1:-1::0;37661:5:0::2;::::0;37649:29:::2;::::0;;-1:-1:-1;;;37649:29:0;;;;37690:4:::2;::::0;-1:-1:-1;;;;;37661:5:0::2;::::0;37649:27:::2;::::0;:29:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;37661:5;37649:29;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37649:29:0;-1:-1:-1;;;;;37649:46:0::2;;37581:114;:182;;;;-1:-1:-1::0;37728:6:0::2;::::0;37716:30:::2;::::0;;-1:-1:-1;;;37716:30:0;;;;37758:4:::2;::::0;-1:-1:-1;;;;;37728:6:0::2;::::0;37716:28:::2;::::0;:30:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;37728:6;37716:30;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37716:30:0;-1:-1:-1;;;;;37716:47:0::2;;37581:182;:248;;;;-1:-1:-1::0;37793:7:0::2;::::0;37784:28:::2;::::0;;-1:-1:-1;;;37784:28:0;;;;37824:4:::2;::::0;-1:-1:-1;;;;;37793:7:0::2;::::0;37784:26:::2;::::0;:28:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;37793:7;37784:28;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37784:28:0;-1:-1:-1;;;;;37784:45:0::2;;37581:248;37559:328;;;::::0;;-1:-1:-1;;;37559:328:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;51069:1:::3;51055:11;:15;51047:74;;;;-1:-1:-1::0;;;51047:74:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51134:19;51156:16;:14;:16::i;:::-;51134:38;;51206:11;51191;:26;51183:67;;;::::0;;-1:-1:-1;;;51183:67:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;51297:18;;51283:11;:32;51261:151;;;;-1:-1:-1::0;;;51261:151:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51425:13;51441:20;:18;:20::i;:::-;51425:36;;51488:1;51480:5;:9;51472:49;;;::::0;;-1:-1:-1;;;51472:49:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;51534:21;51558:32;51585:4;51558:22;:11:::0;51574:5;51558:15:::3;:22::i;:32::-;51616:6;::::0;51609:39:::3;::::0;;-1:-1:-1;;;51609:39:0;;51642:4:::3;51609:39;::::0;::::3;::::0;;;51534:56;;-1:-1:-1;51534:56:0;;-1:-1:-1;;;;;51616:6:0;;::::3;::::0;51609:24:::3;::::0;:39;;;;;::::3;::::0;;;;;;;;;51616:6;51609:39;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;51609:39:0;:56:::3;;51601:106;;;;-1:-1:-1::0;;;51601:106:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51739:63;51760:41;51769:16;;51787:13;51760:8;:41::i;:::-;51739:16;::::0;;:20:::3;:63::i;:::-;51720:16;:82:::0;51827:5:::3;::::0;51815:52:::3;::::0;;-1:-1:-1;;;51815:52:0;;51843:10:::3;51815:52;::::0;::::3;::::0;;;;;;;;;-1:-1:-1;;;;;51827:5:0;;::::3;::::0;51815:27:::3;::::0;:52;;;;;51827:5:::3;::::0;51815:52;;;;;;;;51827:5;;51815:52;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;51885:6:0::3;::::0;51878:54:::3;::::0;-1:-1:-1;;;;;;51885:6:0::3;::::0;-1:-1:-1;51906:10:0::3;51918:13:::0;51878:27:::3;:54::i;:::-;51945:20;:18;:20::i;:::-;51983:53;::::0;;;;;::::3;::::0;::::3;::::0;;;;;51997:10:::3;::::0;51983:53:::3;::::0;;;;;;::::3;-1:-1:-1::0;;31615:12:0;31607:7;:21;;;;;;;;;;;31629:9;31607:32;;;;;;;;:39;;31642:4;-1:-1:-1;;31607:39:0;;;;;;;;31679:10;31657:33;;;;;;:40;;;;;;;;;;-1:-1:-1;;;50922:1122:0:o;57042:234::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57209:7:::1;::::0;57200:68:::1;::::0;;-1:-1:-1;;;57200:68:0;;-1:-1:-1;;;;;57200:68:0;;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;;;;57209:7;;;::::1;::::0;57200:46:::1;::::0;:68;;;;;57209:7:::1;::::0;57200:68;;;;;;;57209:7;;57200:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57042:234:::0;;;:::o;48033:207::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48148:5:::1;48128:16;:25;;48120:67;;;::::0;;-1:-1:-1;;;48120:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;48198:15;:34:::0;48033:207::o;34571:31::-;;;-1:-1:-1;;;34571:31:0;;;;;:::o;43706:97::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43777:7:::1;:18:::0;;-1:-1:-1;;;;;;43777:18:0::1;-1:-1:-1::0;;;;;43777:18:0;;;::::1;::::0;;;::::1;::::0;;43706:97::o;46855:900::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47131:22:0;::::1;47123:39;;;::::0;;-1:-1:-1;;;47123:39:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;47123:39:0;;;;;;;;;;;;;::::1;;47206:4;47181:21;:29;;47173:54;;;::::0;;-1:-1:-1;;;47173:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47173:54:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;47256:22:0;::::1;47248:39;;;::::0;;-1:-1:-1;;;47248:39:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;47248:39:0;;;;;;;;;;;;;::::1;;47331:3;47306:21;:28;;47298:53;;;::::0;;-1:-1:-1;;;47298:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47298:53:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;47379:24:0;::::1;47371:41;;;::::0;;-1:-1:-1;;;47371:41:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;47371:41:0;;;;;;;;;;;;;::::1;;47458:3;47431:23;:30;;47423:55;;;::::0;;-1:-1:-1;;;47423:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47423:55:0;;;;;;;;;;;;;::::1;;47498:7;:18:::0;;-1:-1:-1;;;;;;47498:18:0;;::::1;-1:-1:-1::0;;;;;47498:18:0;;::::1;;::::0;;;47527:20:::1;:44:::0;;;;47582:7:::1;:18:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;47611:20:::1;:44:::0;;;;47666:9:::1;:22:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;47699::::1;:48:::0;46855:900::o;35219:47::-;;;;:::o;35770:30::-;;;;:::o;43936:289::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44060:14:::1;;44037:19;:37;;:96;;;;;44101:32;44129:3;44101:23;44120:3;44101:14;;:18;;:23;;;;:::i;:32::-;44078:19;:55;;44037:96;44029:121;;;::::0;;-1:-1:-1;;;44029:121:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44029:121:0;;;;;;;;;;;;;::::1;;44177:18;:40:::0;43936:289::o;35711:29::-;;;;:::o;38088:89::-;38158:11;;-1:-1:-1;;;38158:11:0;;;;38088:89;;:::o;35604:39::-;;;;:::o;35881:41::-;;;;:::o;48580:201::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48692:5:::1;48673:15;:24;;48665:65;;;::::0;;-1:-1:-1;;;48665:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;48741:14;:32:::0;48580:201::o;34965:33::-;;;;:::o;36044:22::-;;;-1:-1:-1;;;;;36044:22:0;;:::o;48789:330::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48937:5:::1;48906:27;:36;;:76;;;;;48977:5;48946:27;:36;;48906:76;48898:130;;;;-1:-1:-1::0;;;48898:130:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49055:26;:56:::0;48789:330::o;38336:306::-;38427:12;;38449:6;;38419:43;;;-1:-1:-1;;;38419:43:0;;-1:-1:-1;;;;;38449:6:0;;;38419:43;;;;38457:4;38419:43;;;;;;38383:19;;38427:12;;;;;38419:29;;:43;;;;;;;;;;;;;;;38427:12;38419:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38419:43:0;;;38415:220;;38557:66;;-1:-1:-1;;;38557:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38415:220;38509:14;;;-1:-1:-1;38502:21:0;;56121:425;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56352:6:::1;::::0;-1:-1:-1;;;;;56325:34:0;;::::1;56352:6:::0;::::1;56325:34;;56317:53;;;::::0;;-1:-1:-1;;;56317:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;56317:53:0;;;;;;;;;;;;;::::1;;56416:5;::::0;-1:-1:-1;;;;;56389:33:0;;::::1;56416:5:::0;::::1;56389:33;;56381:50;;;::::0;;-1:-1:-1;;;56381:50:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;56381:50:0;;;;;;;;;;;;;::::1;;56477:6;::::0;-1:-1:-1;;;;;56450:34:0;;::::1;56477:6:::0;::::1;56450:34;;56442:52;;;::::0;;-1:-1:-1;;;56442:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;56442:52:0;;;;;;;;;;;;;::::1;;56505:33;-1:-1:-1::0;;;;;56505:19:0;::::1;56525:3:::0;56530:7;56505:19:::1;:33::i;:::-;56121:425:::0;;;:::o;49567:1347::-;31418:28;:26;:28::i;:::-;31417:29;31409:80;;;;-1:-1:-1;;;31409:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31509:28;:26;:28::i;:::-;31508:29;31500:80;;;;-1:-1:-1;;;31500:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37140:9:::1;;37133:3;:16;;37125:54;;;::::0;;-1:-1:-1;;;37125:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37125:54:0;;;;;;;;;;;;;::::1;;37593:6:::2;::::0;37581:30:::2;::::0;;-1:-1:-1;;;37581:30:0;;;;37623:4:::2;::::0;-1:-1:-1;;;;;37593:6:0::2;::::0;37581:28:::2;::::0;:30:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;37593:6;37581:30;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37581:30:0;-1:-1:-1;;;;;37581:47:0::2;;:114:::0;::::2;;;-1:-1:-1::0;37661:5:0::2;::::0;37649:29:::2;::::0;;-1:-1:-1;;;37649:29:0;;;;37690:4:::2;::::0;-1:-1:-1;;;;;37661:5:0::2;::::0;37649:27:::2;::::0;:29:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;37661:5;37649:29;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37649:29:0;-1:-1:-1;;;;;37649:46:0::2;;37581:114;:182;;;;-1:-1:-1::0;37728:6:0::2;::::0;37716:30:::2;::::0;;-1:-1:-1;;;37716:30:0;;;;37758:4:::2;::::0;-1:-1:-1;;;;;37728:6:0::2;::::0;37716:28:::2;::::0;:30:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;37728:6;37716:30;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37716:30:0;-1:-1:-1;;;;;37716:47:0::2;;37581:182;:248;;;;-1:-1:-1::0;37793:7:0::2;::::0;37784:28:::2;::::0;;-1:-1:-1;;;37784:28:0;;;;37824:4:::2;::::0;-1:-1:-1;;;;;37793:7:0::2;::::0;37784:26:::2;::::0;:28:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;37793:7;37784:28;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37784:28:0;-1:-1:-1;;;;;37784:45:0::2;;37581:248;37559:328;;;::::0;;-1:-1:-1;;;37559:328:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;49715:1:::3;49699:13;:17;49691:78;;;;-1:-1:-1::0;;;49691:78:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49782:19;49804:16;:14;:16::i;:::-;49782:38;;49854:11;49839;:26;49831:67;;;::::0;;-1:-1:-1;;;49831:67:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;49945:14;;49931:11;:28;49909:144;;;;-1:-1:-1::0;;;49909:144:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50091:26;;50074:13;:43;;50066:98;;;;-1:-1:-1::0;;;50066:98:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50177:13;50193:21;:19;:21::i;:::-;50177:37;;50241:1;50233:5;:9;50225:49;;;::::0;;-1:-1:-1;;;50225:49:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;50287:19;50309:34;50338:4;50309:24;:13:::0;50327:5;50309:17:::3;:24::i;:34::-;50287:56;;50354:20;50377:28;:26;:28::i;:::-;50354:51;;50416:21;50440:44;50472:11;50447:5;;;;;;;;;-1:-1:-1::0;;;;;50447:5:0::3;-1:-1:-1::0;;;;;50440:25:0::3;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;50440:27:0;;:31:::3;:44::i;:::-;50416:68;;50520:48;50562:5;50520:37;50537:19;;50520:12;:16;;:37;;;;:::i;:48::-;50503:13;:65;;50495:97;;;::::0;;-1:-1:-1;;;50495:97:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;-1:-1:-1;;;50495:97:0;;;;;;;;;;;;;::::3;;50617:6;::::0;50605:55:::3;::::0;;-1:-1:-1;;;50605:55:0;;50634:10:::3;50605:55;::::0;::::3;::::0;;;;;;;;;-1:-1:-1;;;;;50617:6:0;;::::3;::::0;50605:28:::3;::::0;:55;;;;;50617:6:::3;::::0;50605:55;;;;;;;;50617:6;;50605:55;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;50683:5:0::3;::::0;50671:48:::3;::::0;;-1:-1:-1;;;50671:48:0;;50695:10:::3;50671:48;::::0;::::3;::::0;;;;;;;;;-1:-1:-1;;;;;50683:5:0;;::::3;::::0;-1:-1:-1;50671:23:0::3;::::0;-1:-1:-1;50671:48:0;;;;;::::3;::::0;;;;;;;;;50683:5:::3;::::0;50671:48;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;;50761:26:0::3;::::0;:45:::3;::::0;50792:13;50761:30:::3;:45::i;:::-;50732:26;:74:::0;50817:20:::3;:18;:20::i;:::-;50855:51;::::0;;;;;::::3;::::0;::::3;::::0;;;;;50867:10:::3;::::0;50855:51:::3;::::0;;;;;;::::3;-1:-1:-1::0;;31615:12:0;31607:7;:21;;;;;;;;;;;31629:9;31607:32;;;;;;;;:39;;31642:4;-1:-1:-1;;31607:39:0;;;;;;;;31679:10;31657:33;;;;;;:40;;;;;;;;;;-1:-1:-1;;;;;49567:1347:0:o;36000:35::-;;;;:::o;34525:23::-;;;-1:-1:-1;;;;;34525:23:0;;:::o;46083:257::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46210:4:::1;46186:20;:28;;:61;;;;;46242:5;46218:20;:29;;46186:61;46178:86;;;::::0;;-1:-1:-1;;;46178:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;46178:86:0;;;;;;;;;;;;;::::1;;46290:19;:42:::0;46083:257::o;38984:94::-;39054:16;;38984:94;:::o;35007:31::-;;;;:::o;53822:2291::-;31418:28;:26;:28::i;:::-;31417:29;31409:80;;;;-1:-1:-1;;;31409:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31509:28;:26;:28::i;:::-;31508:29;31500:80;;;;-1:-1:-1;;;31500:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37140:9:::1;;37133:3;:16;;37125:54;;;::::0;;-1:-1:-1;;;37125:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37125:54:0;;;;;;;;;;;;;::::1;;37257:16:::2;:14;:16::i;:::-;37250:3;:23;;37242:60;;;::::0;;-1:-1:-1;;;37242:60:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;37593:6:::3;::::0;37581:30:::3;::::0;;-1:-1:-1;;;37581:30:0;;;;37623:4:::3;::::0;-1:-1:-1;;;;;37593:6:0::3;::::0;37581:28:::3;::::0;:30:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;37593:6;37581:30;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;37581:30:0;-1:-1:-1;;;;;37581:47:0::3;;:114:::0;::::3;;;-1:-1:-1::0;37661:5:0::3;::::0;37649:29:::3;::::0;;-1:-1:-1;;;37649:29:0;;;;37690:4:::3;::::0;-1:-1:-1;;;;;37661:5:0::3;::::0;37649:27:::3;::::0;:29:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;37661:5;37649:29;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;37649:29:0;-1:-1:-1;;;;;37649:46:0::3;;37581:114;:182;;;;-1:-1:-1::0;37728:6:0::3;::::0;37716:30:::3;::::0;;-1:-1:-1;;;37716:30:0;;;;37758:4:::3;::::0;-1:-1:-1;;;;;37728:6:0::3;::::0;37716:28:::3;::::0;:30:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;37728:6;37716:30;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;37716:30:0;-1:-1:-1;;;;;37716:47:0::3;;37581:182;:248;;;;-1:-1:-1::0;37793:7:0::3;::::0;37784:28:::3;::::0;;-1:-1:-1;;;37784:28:0;;;;37824:4:::3;::::0;-1:-1:-1;;;;;37793:7:0::3;::::0;37784:26:::3;::::0;:28:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;37793:7;37784:28;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;37784:28:0;-1:-1:-1;;;;;37784:45:0::3;;37581:248;37559:328;;;::::0;;-1:-1:-1;;;37559:328:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;53926:20:::4;:18;:20::i;:::-;53984:16;:14;:16::i;:::-;53957:24;:43:::0;54067:16:::4;::::0;54011:20:::4;::::0;54034:50:::4;::::0;:28:::4;:26;:28::i;:::-;:32:::0;::::4;:50::i;:::-;54011:73;;54107:15;;54099:5;;:23;54095:2011;;;54191:76;54206:60;54260:5;54206:49;54223:31;;54206:12;:16;;:49;;;;:::i;:60::-;54191:14;:76::i;:::-;54095:2011;;;54331:18;;54304:24;;:45;54300:1795;;;54496:5;::::0;54489:27:::4;::::0;;-1:-1:-1;;;54489:27:0;;;;54468:18:::4;::::0;-1:-1:-1;;;;;54496:5:0::4;::::0;54489:25:::4;::::0;:27:::4;::::0;;::::4;::::0;::::4;::::0;;;;;;;;54496:5;54489:27;::::4;;::::0;::::4;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;::::0;::::4;;-1:-1:-1::0;54489:27:0;54586:14:::4;::::0;54557:24:::4;::::0;54489:27;;-1:-1:-1;54535:19:0::4;::::0;54557:44:::4;::::0;:28:::4;:44::i;:::-;54535:66;;54620:21;54660:24:::0;54703:12:::4;54718:59;54772:4;54718:49;54754:12;54718:35;:49::i;:59::-;54703:74;;54814:4;54800:11;:18;54796:85;;;54857:4;54843:18;;54796:85;54923:52;54969:5;54923:41;54938:25;;54923:10;:14;;:41;;;;:::i;:52::-;54903:16;;:72;54899:785;;55088:39;55122:4;55088:29;:12:::0;55105:11;55088:16:::4;:29::i;:39::-;55069:58;;54899:785;;;55245:20;55268:39;55302:4;55268:29;:12:::0;55285:11;55268:16:::4;:29::i;:39::-;55245:62;;55349:61;55404:5;55349:50;55366:32;;55349:12;:16;;:50;;;;:::i;:61::-;55330:80:::0;-1:-1:-1;55449:34:0::4;:12:::0;55330:80;55449:16:::4;:34::i;:::-;55510:26;::::0;55433:50;;-1:-1:-1;55510:30:0;55506:159:::4;;55585:56;55635:5;55585:45;55603:26;;55585:13;:17;;:45;;;;:::i;:56::-;55569:72;;55506:159;54899:785;;55706:20:::0;;55702:101:::4;;55751:32;55766:16;55751:14;:32::i;:::-;55825:17:::0;;55821:259:::4;;55886:16;::::0;:35:::4;::::0;55907:13;55886:20:::4;:35::i;:::-;55867:16;:54:::0;55956:6:::4;::::0;55944:54:::4;::::0;;-1:-1:-1;;;55944:54:0;;55977:4:::4;55944:54;::::0;::::4;::::0;;;;;;;;;-1:-1:-1;;;;;55956:6:0;;::::4;::::0;55944:24:::4;::::0;:54;;;;;::::4;::::0;;;;;;;;;55956:6:::4;::::0;55944:54;::::4;;::::0;::::4;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;::::0;::::4;;-1:-1:-1::0;;56026:34:0::4;::::0;;56041:3:::4;56026:34:::0;;55944:54:::4;56026:34:::0;::::4;::::0;;;;;::::4;::::0;;;;;;;;;::::4;55821:259;54300:1795;;;;;;-1:-1:-1::0;37337:5:0::2;::::0;:12:::2;::::0;37347:1:::2;37337:9;:12::i;:::-;37329:5;:20:::0;37409:18:::2;::::0;37390:16:::2;:14;:16::i;:::-;:37;37389:118;;37435:72;37501:5;37435:61;37468:27;;37435:28;:26;:28::i;:72::-;37389:118;;;37431:1;37389:118;37360:26;:147:::0;31615:12;31607:7;:21;;;;;;;;;;;31629:9;31607:32;;;;;;;;:39;;31642:4;-1:-1:-1;;31607:39:0;;;;;;;;31679:10;31657:33;;;;;;:40;;;;;;;;;;53822:2291::o;38650:311::-;38749:12;;38768:6;;38741:40;;;-1:-1:-1;;;38741:40:0;;-1:-1:-1;;;;;38768:6:0;;;38741:40;;;;38776:4;38741:40;;;;;;38704:20;;38749:12;;;;;38741:26;;:40;;;;;;;;;;;;;;;38749:12;38741:40;;;;;;;;;;39843:440;39894:24;39931:20;39954:16;:14;:16::i;:::-;39931:39;;40000:18;;39985:12;:33;39981:295;;;40065:6;;40058:39;;;-1:-1:-1;;;40058:39:0;;40091:4;40058:39;;;;;;40035:20;;-1:-1:-1;;;;;40065:6:0;;40058:24;;:39;;;;;;;;;;;;;;40065:6;40058:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40058:39:0;;-1:-1:-1;40112:13:0;40128:20;:18;:20::i;:::-;40112:36;-1:-1:-1;40167:9:0;;40163:102;;40216:33;40243:5;40216:22;:12;40233:4;40216:16;:22::i;:33::-;40197:52;;39981:295;;39843:440;;:::o;34625:24::-;;;;:::o;35172:40::-;;;;:::o;35482:46::-;;;;:::o;45473:291::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45618:3:::1;45588:26;:33;;:72;;;;;45655:5;45625:26;:35;;45588:72;45580:97;;;::::0;;-1:-1:-1;;;45580:97:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45580:97:0;;;;;;;;;;;;;::::1;;45702:25;:54:::0;45473:291::o;35971:22::-;;;-1:-1:-1;;;;;35971:22:0;;:::o;34656:24::-;;;;:::o;46348:499::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46499:3:::1;46479:16;:23;;46471:66;;;::::0;;-1:-1:-1;;;46471:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;46606:3;46570:32;:39;;:83;;;;;46649:4;46613:32;:40;;46570:83;46562:142;;;;-1:-1:-1::0;;;46562:142:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46728:15;:34:::0;;;;46773:31:::1;:66:::0;46348:499::o;56554:128::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56643:7:::1;::::0;56634:40:::1;::::0;;-1:-1:-1;;;56634:40:0;;-1:-1:-1;;;;;56634:40:0;;::::1;;::::0;::::1;::::0;;;56643:7;;;::::1;::::0;56634:29:::1;::::0;:40;;;;;56643:7:::1;::::0;56634:40;;;;;;;56643:7;;56634:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56554:128:::0;:::o;44560:492::-;36997:8;;44650:4;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44748:1:::1;44739:6;:10;;;44731:64;;;;-1:-1:-1::0;;;44731:64:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44810:10;::::0;::::1;::::0;44806:84:::1;;44854:11;44875:1;44866:6;:10;44854:23;;;;;;;;;;;;;;;;;;44845:6;:32;44837:41;;;::::0;::::1;;44913:1;44904:6;:10;;;44900:84;;;44948:11;44960:6;44969:1;44960:10;44948:23;;;;;;;;;;;;;;;;;;44939:6;:32;44931:41;;;::::0;::::1;;45016:6;44994:11;45006:6;44994:19;;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:28:::0;-1:-1:-1;45040:4:0::1;37071:1;44560:492:::0;;;;:::o;56690:198::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56818:7:::1;::::0;56809:71:::1;::::0;;-1:-1:-1;;;56809:71:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;56818:7:0;;::::1;::::0;56809:27:::1;::::0;:71;;;;;56818:7:::1;::::0;56809:71;;;;;;;;56818:7;;56809:71;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56690:198:::0;;:::o;41893:1696::-;37963:11;;-1:-1:-1;;;37963:11:0;;;;37962:12;37954:54;;;;;-1:-1:-1;;;37954:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42118:6:::1;:16:::0;;-1:-1:-1;;;;;;42118:16:0;;::::1;-1:-1:-1::0;;;;;42118:16:0;;::::1;::::0;;;::::1;::::0;;;42145:5:::1;:14:::0;;;::::1;::::0;;::::1;;::::0;;42170:6:::1;:16:::0;;;::::1;::::0;;::::1;;::::0;;42197:12:::1;:28:::0;;;::::1;::::0;;::::1;;::::0;;42236:7:::1;:18:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;42265:9:::1;:22:::0;;;42317:6:::1;42300:14;:23:::0;;;42402:32:::1;::::0;42430:3:::1;::::0;42402:23:::1;::::0;42421:3:::1;42402:18;:23::i;:32::-;42381:18;:53:::0;42489:129:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;42489:129:0;;42513:10:::1;42489:129;::::0;::::1;::::0;42525:11:::1;42489:129:::0;;;;;;;42538:11:::1;42489:129:::0;;;;42551:11:::1;42489:129:::0;;;;42564:11:::1;42489:129:::0;;;;42577:12:::1;42489:129:::0;;;;42591:12:::1;42489:129:::0;;;;42605:12:::1;42489:129:::0;;;;::::1;::::0;:11:::1;::::0;:129:::1;;:::i;:::-;-1:-1:-1::0;42629:65:0::1;::::0;;::::1;::::0;::::1;::::0;;42650:3:::1;42629:65:::0;;42655:3:::1;42629:65;::::0;::::1;::::0;42660:3:::1;42629:65:::0;;;;;;;42665:3:::1;42629:65:::0;;;;42670:3:::1;42629:65:::0;;;;42675:3:::1;42629:65:::0;;;;42680:3:::1;42629:65:::0;;;;42685:3:::1;42629:65:::0;;;;42690:3:::1;42629:65:::0;;;;::::1;::::0;:17:::1;::::0;:65:::1;;:::i;:::-;-1:-1:-1::0;42735:3:0::1;42707:25;:31:::0;42813:5:::1;42785:25;:33:::0;42907:4:::1;42872:32;:39:::0;43002:3:::1;42972:27;:33:::0;43106:4:::1;43084:19;:26:::0;43182:3:::1;43163:16;:22:::0;43213:4:::1;43196:14;:21:::0;-1:-1:-1;43278:15:0::1;:19:::0;43342:3:::1;43308:31;:37:::0;-1:-1:-1;43433:6:0;43426:39:::1;::::0;;-1:-1:-1;;;43426:39:0;;43459:4:::1;43426:39;::::0;::::1;::::0;;;-1:-1:-1;;;;;43433:6:0;;::::1;::::0;43426:24:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;43433:6;43426:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43426:39:0;43407:16:::1;:58:::0;43492:4:::1;43478:18:::0;;-1:-1:-1;;;;;;;;;;43478:18:0;;::::1;-1:-1:-1::0;;;43478:18:0::1;43507:21;43518:10;43507:21:::0;;::::1;::::0;;;43544:37:::1;::::0;;43568:12:::1;43544:37:::0;;;;::::1;::::0;;;;43426:39:::1;43544:37:::0;;::::1;41893:1696:::0;;;;;;:::o;47763:129::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47850:15:::1;:34:::0;47763:129::o;35047:28::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35047:28:0;:::o;34820:21::-;;;-1:-1:-1;;;;;34820:21:0;;:::o;35082:34::-;;;;;;;;;;47900:125;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47985:14:::1;:32:::0;47900:125::o;36146:37::-;;;;:::o;36115:24::-;;;-1:-1:-1;;;;;36115:24:0;;:::o;34879:27::-;;;-1:-1:-1;;;;;34879:27:0;;:::o;43597:101::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43670:8:::1;:20:::0;;-1:-1:-1;;;;;;43670:20:0::1;-1:-1:-1::0;;;;;43670:20:0;;;::::1;::::0;;;::::1;::::0;;43597:101::o;34406:40::-;34439:7;34406:40;:::o;35650:30::-;;;;:::o;49291:268::-;49398:6;;49438:25;;;-1:-1:-1;;;49438:25:0;;;;49350:7;;-1:-1:-1;;;;;49398:6:0;;49350:7;;49398:6;;49438:23;;:25;;;;;;;;;;;;;;49398:6;49438:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49438:25:0;;-1:-1:-1;49474:23:0;49519:32;49438:25;49474:23;49519:15;:32::i;38199:114::-;38246:7;38273:32;38287:17;34439:7;38287:5;;:9;;:17;;;;:::i;:::-;38273:9;;;:13;:32::i;:::-;38266:39;;38199:114;:::o;35845:29::-;;;;:::o;35807:31::-;;;;:::o;39086:749::-;39140:27;39180:20;39203:16;:14;:16::i;:::-;39180:39;;39250:14;;39234:12;:30;39230:598;;39281:21;39305:28;:26;:28::i;:::-;39281:52;;39348:22;39373:49;39416:5;39373:38;39391:19;;39373:13;:17;;:38;;;;:::i;:49::-;39348:74;;39437:19;39466:5;;;;;;;;;-1:-1:-1;;;;;39466:5:0;-1:-1:-1;;;;;39459:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39459:27:0;;-1:-1:-1;39505:28:0;;;39501:316;;;39554:24;39581:31;:14;39600:11;39581:18;:31::i;:::-;39554:58;-1:-1:-1;39631:26:0;39660:44;39699:4;39660:34;39554:58;39681:12;39660:20;:34::i;:44::-;39631:73;;39745:56;39754:26;;39782:18;39745:8;:56::i;:::-;39723:78;;39501:316;;;39230:598;;;39086:749;;:::o;45772:303::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45923:3:::1;45891:28;:35;;:75;;;;;45962:4;45930:28;:36;;45891:75;45883:100;;;::::0;;-1:-1:-1;;;45883:100:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45883:100:0;;;;;;;;;;;;;::::1;;46009:27;:58:::0;45772:303::o;45060:405::-;36997:8;;45156:4;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45254:1:::1;45245:6;:10;;;45237:64;;;;-1:-1:-1::0;;;45237:64:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45330:2;45320:6;:12;;:30;;;;;45346:4;45336:6;:14;;45320:30;45312:63;;;::::0;;-1:-1:-1;;;45312:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45312:63:0;;;;;;;;;;;;;::::1;;45429:6;45401:17;45419:6;45401:25;;;;;;;;;34765:21:::0;;;-1:-1:-1;;;;;34765:21:0;;:::o;35125:40::-;;;;:::o;35322:34::-;;;;:::o;34793:20::-;;;-1:-1:-1;;;;;34793:20:0;;:::o;34929:29::-;;;;:::o;35273:42::-;;;;:::o;35445:30::-;;;;:::o;34850:22::-;;;-1:-1:-1;;;;;34850:22:0;;:::o;56896:138::-;36997:8;;-1:-1:-1;;;;;36997:8:0;37009:10;36997:22;36989:71;;;;-1:-1:-1;;;36989:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56990:7:::1;::::0;56981:45:::1;::::0;;-1:-1:-1;;;56981:45:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;56990:7:0;;::::1;::::0;56981:37:::1;::::0;:45;;;;;56990:7:::1;::::0;56981:45;;;;;;;;56990:7;;56981:45;::::1;;::::0;::::1;;;;::::0;::::1;34687::::0;;;;:::o;7475:220::-;7533:7;7557:6;7553:20;;-1:-1:-1;7572:1:0;7565:8;;7553:20;7596:5;;;7600:1;7596;:5;:1;7620:5;;;;;:10;7612:56;;;;-1:-1:-1;;;7612:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7686:1;7475:220;-1:-1:-1;;;7475:220:0:o;8173:153::-;8231:7;8263:1;8259;:5;8251:44;;;;;-1:-1:-1;;;8251:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8317:1;8313;:5;;;;;;;8173:153;-1:-1:-1;;;8173:153:0:o;7058:158::-;7116:7;7149:1;7144;:6;;7136:49;;;;;-1:-1:-1;;;7136:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7203:5:0;;;7058:158::o;6596:179::-;6654:7;6686:5;;;6710:6;;;;6702:46;;;;;-1:-1:-1;;;6702:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;31107:125;31200:12;31168:4;31192:21;;;;;;;;;;;31214:9;31192:32;;;;;;;;;;31107:125;:::o;31240:126::-;31333:12;31301:4;31325:21;;;;;;;;;;;31347:10;31325:33;;;;;;;;;;31240:126;:::o;503:106::-;561:7;592:1;588;:5;:13;;600:1;588:13;;;-1:-1:-1;596:1:0;;581:20;-1:-1:-1;503:106:0:o;20020:177::-;20130:58;;;-1:-1:-1;;;;;20130:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20130:58:0;-1:-1:-1;;;20130:58:0;;;20103:86;;20123:5;;20103:19;:86::i;49180:103::-;49242:12;;;;;;;;;-1:-1:-1;;;;;49242:12:0;-1:-1:-1;;;;;49234:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49230:46;49180:103::o;52052:1372::-;52125:6;;52113:48;;;-1:-1:-1;;;52113:48:0;;52146:4;52113:48;;;;;;;;;;;;-1:-1:-1;;;;;52125:6:0;;;;52113:24;;:48;;;;;;;;;;;;;;;52125:6;;52113:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52221:20:0;;52174:28;;52221:24;52217:253;;52285:44;52323:5;52285:33;52297:20;;52285:7;:11;;:33;;;;:::i;:44::-;52351:6;;52368:7;;52344:54;;;-1:-1:-1;;;52344:54:0;;-1:-1:-1;;;;;52368:7:0;;;52344:54;;;;;;;;;;;;52262:67;;-1:-1:-1;52351:6:0;;;52344:23;;:54;;;;;;;;;;;;;;;52351:6;;52344:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52418:40:0;;;52432:3;52418:40;;52344:54;52418:40;;;;;;;;;;;;;;;;;;52217:253;52529:20;;52482:28;;52529:24;52525:253;;52593:44;52631:5;52593:33;52605:20;;52593:7;:11;;:33;;;;:::i;:44::-;52659:6;;52676:7;;52652:54;;;-1:-1:-1;;;52652:54:0;;-1:-1:-1;;;;;52676:7:0;;;52652:54;;;;;;;;;;;;52570:67;;-1:-1:-1;52659:6:0;;;52652:23;;:54;;;;;;;;;;;;;;;52659:6;;52652:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52726:40:0;;;52740:3;52726:40;;52652:54;52726:40;;;;;;;;;;;;;;;;;;52525:253;52839:22;;52790:30;;52839:26;52835:266;;52907:46;52947:5;52907:35;52919:22;;52907:7;:11;;:35;;;;:::i;:46::-;52975:6;;52992:9;;52968:58;;;-1:-1:-1;;;52968:58:0;;-1:-1:-1;;;;;52992:9:0;;;52968:58;;;;;;;;;;;;52882:71;;-1:-1:-1;52975:6:0;;;52968:23;;:58;;;;;;;;;;;;;;;52975:6;;52968:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53046:43:0;;;53061:3;53046:43;;52968:58;53046:43;;;;;;;;;;;;;;;;;;52835:266;53123:87;53187:22;53123:59;53161:20;53123:59;:7;53135:20;53123:11;:33::i;:87::-;53250:7;;53230:6;;53113:97;;-1:-1:-1;53223:38:0;;-1:-1:-1;;;;;53230:6:0;;;;53250:7;;53223:26;:38::i;:::-;53299:7;;53279:6;;53272:44;;-1:-1:-1;;;;;53279:6:0;;;;53299:7;53308;53272:26;:44::i;:::-;53336:7;;53327:46;;;-1:-1:-1;;;53327:46:0;;;;;;;;;;-1:-1:-1;;;;;53336:7:0;;;;53327:37;;:46;;;;;53336:7;;53327:46;;;;;;;;53336:7;;53327:46;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53389:27:0;;;53403:3;53389:27;;;;;;;;;;;;-1:-1:-1;53389:27:0;;;;;;;;-1:-1:-1;53389:27:0;52052:1372;;;;:::o;53432:382::-;53518:7;53558:1;53538:226;53620:11;53632:6;53620:19;;;;;;;;;;;;;;;;;;53603:13;:36;53599:154;;53688:17;53706:6;53688:25;;;;;;;;;;;;;;;;;;;;53660;:53;53732:5;;53599:154;-1:-1:-1;;53574:8:0;53538:226;;;-1:-1:-1;;53781:25:0;;53432:382;;;:::o;22325:761::-;22749:23;22775:69;22803:4;22775:69;;;;;;;;;;;;;;;;;22783:5;-1:-1:-1;;;;;22775:27:0;;;:69;;;;;:::i;:::-;22859:17;;22749:95;;-1:-1:-1;22859:21:0;22855:224;;23001:10;22990:30;;;;;;;;;;;;;;;-1:-1:-1;22990:30:0;22982:85;;;;-1:-1:-1;;;22982:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20679:622;21049:10;;;21048:62;;-1:-1:-1;21065:39:0;;;-1:-1:-1;;;21065:39:0;;21089:4;21065:39;;;;-1:-1:-1;;;;;21065:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21065:39:0;:44;21048:62;21040:152;;;;-1:-1:-1;;;21040:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21230:62;;;-1:-1:-1;;;;;21230:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21230:62:0;-1:-1:-1;;;21230:62:0;;;21203:90;;21223:5;;21203:19;:90::i;14985:195::-;15088:12;15120:52;15142:6;15150:4;15156:1;15159:12;15120:21;:52::i;:::-;15113:59;14985:195;-1:-1:-1;;;;14985:195:0:o;16037:530::-;16164:12;16222:5;16197:21;:30;;16189:81;;;;-1:-1:-1;;;16189:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16289:18;16300:6;16289:10;:18::i;:::-;16281:60;;;;;-1:-1:-1;;;16281:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16415:12;16429:23;16456:6;-1:-1:-1;;;;;16456:11:0;16476:5;16484:4;16456:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16456:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16414:75;;;;16507:52;16525:7;16534:10;16546:12;16507:17;:52::i;:::-;16500:59;16037:530;-1:-1:-1;;;;;;;16037:530:0:o;12067:422::-;12434:20;12473:8;;;12067:422::o;18577:742::-;18692:12;18721:7;18717:595;;;-1:-1:-1;18752:10:0;18745:17;;18717:595;18866:17;;:21;18862:439;;19129:10;19123:17;19190:15;19177:10;19173:2;19169:19;19162:44;19077:148;19272:12;19265:20;;-1:-1:-1;;;19265:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

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