Contract 0x58981216e93f38307e50edd65790707f723e0ccf

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x962348ea37dfbb1b8f20a79ca6beaa1c5a4f87064d4588de6e3816ba31952a68Swap Exact ETH F...92622022021-10-19 21:56:054 mins ago0xdac53237df57b2108fc0d1432f6788bd33f68c67 IN  0x58981216e93f38307e50edd65790707f723e0ccf5.543674844364526 HT0.00094156653.5
0x77fa92c1c6bde3b8be19a948478fb474cd78e2cf075d83ffc74827ea46296d3eSwap Exact Token...92620862021-10-19 21:50:1710 mins ago0x46a4fcc65719f8fcf732d0b7933ede7b19bb5009 IN  0x58981216e93f38307e50edd65790707f723e0ccf0 HT0.0009863913.5
0x7d0fba85abd273f38279ffb22c35f2429093d4cba1aa8dc6ace585db6422f810Swap Exact Token...92620082021-10-19 21:46:2314 mins ago0x59366fce432983e8eedba5ac6309f4c22c927436 IN  0x58981216e93f38307e50edd65790707f723e0ccf0 HT0.00063194562.6
0x205c5c21c4bae07099fef9f85daf070b63cb27022a9380ba366c6056b69d5dbeSwap Exact Token...92605692021-10-19 20:34:261 hr 26 mins ago0xb0b0839e50133994f19c74b336cf078d388b763d IN  0x58981216e93f38307e50edd65790707f723e0ccf0 HT0.00092862353.5
0x0a2386799864df3989c3aceba450cf641aa33462778615b17778d50f447afe03Swap Exact Token...92605652021-10-19 20:34:141 hr 26 mins ago0xb0b0839e50133994f19c74b336cf078d388b763d IN  0x58981216e93f38307e50edd65790707f723e0ccf0 HT0.00092862353.5
0x774a7efc630a6e5ae146b23da4086102f5b1183bc5c29a4d0e26a123f42498beSwap Exact Token...92605482021-10-19 20:33:231 hr 27 mins ago0xb0b0839e50133994f19c74b336cf078d388b763d IN  0x58981216e93f38307e50edd65790707f723e0ccf0 HT0.00092862353.5
0xa9207db70777717d93a42f5c02ccf8e66efae85f5a30fb62a1c6e78a6c5ab163Swap Exact Token...92605392021-10-19 20:32:561 hr 27 mins ago0x65a9be2775a8777e66ccde8c3af9ff0be9a3a4cb IN  0x58981216e93f38307e50edd65790707f723e0ccf0 HT0.0015241733.5
0xff50d82dbc026f46b6bc95b89800a0fa91988d617cfad39ac0fd67abc78ee693Swap Exact Token...92605192021-10-19 20:31:561 hr 28 mins ago0xb0b0839e50133994f19c74b336cf078d388b763d IN  0x58981216e93f38307e50edd65790707f723e0ccf0 HT0.00092862353.5
0x80b7d831e796b1c73fecf73d7d426b10efbbf4ae81336931a7d6f806adb24b53Swap Exact Token...92603122021-10-19 20:21:351 hr 39 mins ago0xa618d9a978e74b916f923e451cbad40d22dba517 IN  0x58981216e93f38307e50edd65790707f723e0ccf0 HT0.0004919813.5
0x576a3d21f4f0713bab6b13bc6e5439939ffa201b9ec9bb48b3869934e839f21eSwap Exact Token...92603122021-10-19 20:21:351 hr 39 mins ago0x15b9ed417404e482e8359206355f3cdbcd517b4d IN  0x58981216e93f38307e50edd65790707f723e0ccf0 HT0.00058903743.78
0x9c2693568dfbbf3aed307fb3988e6fa1d59a35c1f6d9d16cd1406a4135af82caSwap Exact Token...92603022021-10-19 20:21:051 hr 39 mins ago0xcfbf45e59f56fd83fb2d41688031ce83eb727195 IN  0x58981216e93f38307e50edd65790707f723e0ccf0 HT0.0009863913.5
0x1c105438851e4c84627e886d7ceabc8b721841d450c2605f7bea375b6be10ff8Swap Exact ETH F...92600352021-10-19 20:07:441 hr 53 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.000000151686651 HT0.0004627983.5
0xb91243fbe3cecaa957464ecd75851197d4d205f8eb38ab1d9f2824cd8972347fSwap Exact ETH F...92600242021-10-19 20:07:111 hr 53 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.000000202248868 HT0.0001333573.5
0x2e09635fdaf28c833c626bdfb155a7716f9f943d29988bd52fcced78669f1090Swap Exact ETH F...92600172021-10-19 20:06:501 hr 54 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.000000202248868 HT0.0001333573.5
0x110fc7318e1d10f7ce6cc30fd6a27830e7d88511dc7e74df738d7033e192d1d9Swap Exact ETH F...92600132021-10-19 20:06:381 hr 54 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.000002022488868 HT0.0001333153.5
0x540e729a2a14e030e48ac56c64c5d3acdfb7e244eca81d5c6e3255e323dbec07Swap Exact ETH F...92600082021-10-19 20:06:231 hr 54 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.000000161511094 HT0.0004627983.5
0x61da4c1f1f1ecc06b6fcf11dc931394fbe0eff7f0fbdf2a6a34f46bc07be6e70Swap Exact ETH F...92600052021-10-19 20:06:141 hr 54 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.000000131679986 HT0.0001333573.5
0x09ddaa4ce83dd2ee8455963fb5389a40ffd2e7242e3155b8a0d6802e1513ccddSwap Exact ETH F...92600022021-10-19 20:06:051 hr 54 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.000000131679986 HT0.0004627983.5
0xd4567edf32cfa0ac2735c402d3d44a71394c27240cacb64c14d0992dbca1a238Swap Exact ETH F...92599982021-10-19 20:05:531 hr 55 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.000000109235544 HT0.0004627983.5
0x2c4b39111a1414baf2c388d6ab887af5a8a9bc92b7059361da8725b639e69f14Swap Exact ETH F...92599842021-10-19 20:05:111 hr 55 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.000000091964435 HT0.0004627983.5
0x55f4b16af878eee5d3d7f028ba6afed73c1dab69da8987020ba793069f2b417aSwap Exact ETH F...92599712021-10-19 20:04:321 hr 56 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.000000078408881 HT0.0004627983.5
0x9b2a23d000f79079156250b3c44e494e64e59bc7009a1129b7785dfa202e0467Swap Exact ETH F...92599432021-10-19 20:03:081 hr 57 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.000000067591104 HT0.0004627983.5
0x9e5b39f00d6e269ad129ddce774aa1b0a83140f2ebeea704915e1c123913a683Swap Exact ETH F...92599392021-10-19 20:02:561 hr 57 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.00000005882666 HT0.0004627983.5
0x52e91a4c3766de757ccc15a3e7f8a42df061ce0366e7635f6dca4a613e001540Swap Exact ETH F...92599342021-10-19 20:02:411 hr 58 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.00000058826666 HT0.0001333573.5
0x481a23cb4cb4eb38bc41256c40ff33acb29882a511ecac0ff05fabe15c87df3bSwap Exact ETH F...92599292021-10-19 20:02:261 hr 58 mins ago0x7c06eab2337eef4e4610eb74c01e1136a1d84fe8 IN  0x58981216e93f38307e50edd65790707f723e0ccf0.00000005163555 HT0.0004627983.5
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x962348ea37dfbb1b8f20a79ca6beaa1c5a4f87064d4588de6e3816ba31952a6892622022021-10-19 21:56:054 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token5.5436748443645268 HT
0x77fa92c1c6bde3b8be19a948478fb474cd78e2cf075d83ffc74827ea46296d3e92620862021-10-19 21:50:1710 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf0x46a4fcc65719f8fcf732d0b7933ede7b19bb50090.705494234919386742 HT
0x77fa92c1c6bde3b8be19a948478fb474cd78e2cf075d83ffc74827ea46296d3e92620862021-10-19 21:50:1710 mins ago Huobi: Wrapped Huobi Token 0x58981216e93f38307e50edd65790707f723e0ccf0.705494234919386742 HT
0xf5cf6dcdd34dd173d92d6b96a1602d182fc7fb84935edc1ceee85946d6e5a14092620192021-10-19 21:46:5613 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf 0xcabf51e77abe9b6e706a6626e09aefee7f1d51bd13.412908829966844905 HT
0xf5cf6dcdd34dd173d92d6b96a1602d182fc7fb84935edc1ceee85946d6e5a14092620192021-10-19 21:46:5613 mins ago Huobi: Wrapped Huobi Token 0x58981216e93f38307e50edd65790707f723e0ccf13.412908829966844905 HT
0x2436536152aac3ee9de966159b6654152ccad75964599a6ace4265272f5971ea92603432021-10-19 20:23:081 hr 37 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf 0x432401a5fb1fe7face350933b9f3b59499c8883913.847541365157365753 HT
0x2436536152aac3ee9de966159b6654152ccad75964599a6ace4265272f5971ea92603432021-10-19 20:23:081 hr 37 mins ago Huobi: Wrapped Huobi Token 0x58981216e93f38307e50edd65790707f723e0ccf13.847541365157365753 HT
0x9c2693568dfbbf3aed307fb3988e6fa1d59a35c1f6d9d16cd1406a4135af82ca92603022021-10-19 20:21:051 hr 39 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf0xcfbf45e59f56fd83fb2d41688031ce83eb7271951.129753711570162415 HT
0x9c2693568dfbbf3aed307fb3988e6fa1d59a35c1f6d9d16cd1406a4135af82ca92603022021-10-19 20:21:051 hr 39 mins ago Huobi: Wrapped Huobi Token 0x58981216e93f38307e50edd65790707f723e0ccf1.129753711570162415 HT
0x1c105438851e4c84627e886d7ceabc8b721841d450c2605f7bea375b6be10ff892600352021-10-19 20:07:441 hr 53 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token0.000000151686651498 HT
0x540e729a2a14e030e48ac56c64c5d3acdfb7e244eca81d5c6e3255e323dbec0792600082021-10-19 20:06:231 hr 54 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token0.00000016151109496 HT
0x09ddaa4ce83dd2ee8455963fb5389a40ffd2e7242e3155b8a0d6802e1513ccdd92600022021-10-19 20:06:051 hr 54 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token0.000000131679986832 HT
0xd4567edf32cfa0ac2735c402d3d44a71394c27240cacb64c14d0992dbca1a23892599982021-10-19 20:05:531 hr 55 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token0.000000109235544632 HT
0x2c4b39111a1414baf2c388d6ab887af5a8a9bc92b7059361da8725b639e69f1492599842021-10-19 20:05:111 hr 55 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token0.000000091964435248 HT
0x55f4b16af878eee5d3d7f028ba6afed73c1dab69da8987020ba793069f2b417a92599712021-10-19 20:04:321 hr 56 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token0.000000078408881048 HT
0x9b2a23d000f79079156250b3c44e494e64e59bc7009a1129b7785dfa202e046792599432021-10-19 20:03:081 hr 57 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token0.000000067591104352 HT
0x9e5b39f00d6e269ad129ddce774aa1b0a83140f2ebeea704915e1c123913a68392599392021-10-19 20:02:561 hr 57 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token0.000000058826660784 HT
0x481a23cb4cb4eb38bc41256c40ff33acb29882a511ecac0ff05fabe15c87df3b92599292021-10-19 20:02:261 hr 58 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token0.000000051635550392 HT
0x44938da1d3d9a2ceef301228c70bf5dea195524a8c6fb8e2466902fcfc6ad24792599242021-10-19 20:02:111 hr 58 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token0.000000045671106544 HT
0x442a5377e1c9fb24c42e98efa3861cefbce73fe70617b1aa4fd0a20629a8056c92599082021-10-19 20:01:231 hr 59 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token0.000000004510217712 HT
0xccce236073c597286eed9b28808201e7bae43de472b932d88154ed71edda5c3292594172021-10-19 19:36:502 hrs 24 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf0x863c278e5ddf711dfa2cb2e578d57420043790150.653049897832204364 HT
0xccce236073c597286eed9b28808201e7bae43de472b932d88154ed71edda5c3292594172021-10-19 19:36:502 hrs 24 mins ago Huobi: Wrapped Huobi Token 0x58981216e93f38307e50edd65790707f723e0ccf0.653049897832204364 HT
0x0c6b7b850bbed02583b58d996f3fd108f0b63cb3364dfdf854745f7c2566e2c692579162021-10-19 18:21:473 hrs 39 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf Huobi: Wrapped Huobi Token5.196867356515536 HT
0xd5c38b482ec2fecdbb985adb302cf3dd790c711b59eced4cd4a7ccae4860c16a92577772021-10-19 18:14:503 hrs 46 mins ago 0x58981216e93f38307e50edd65790707f723e0ccf0xe36fca17bcdc95f96de7647d3046a9e4e89c49945.154569959798681499 HT
0xd5c38b482ec2fecdbb985adb302cf3dd790c711b59eced4cd4a7ccae4860c16a92577772021-10-19 18:14:503 hrs 46 mins ago Huobi: Wrapped Huobi Token 0x58981216e93f38307e50edd65790707f723e0ccf5.154569959798681499 HT
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XFRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-09-14
*/

pragma solidity ^0.6.0;

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;
    }
}

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 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;
    }
}

library SafeMath {
    uint256 constant WAD = 10 ** 18;
    uint256 constant RAY = 10 ** 27;

    function wad() public pure returns (uint256) {
        return WAD;
    }

    function ray() public pure returns (uint256) {
        return RAY;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (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 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a <= b ? a : b;
    }

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

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

    function wmul(uint256 a, uint256 b) internal pure returns (uint256) {
        return mul(a, b) / WAD;
    }

    function wmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, b), WAD / 2) / WAD;
    }

    function rmul(uint256 a, uint256 b) internal pure returns (uint256) {
        return mul(a, b) / RAY;
    }

    function rmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, b), RAY / 2) / RAY;
    }

    function wdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(mul(a, WAD), b);
    }

    function wdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, WAD), b / 2) / b;
    }

    function rdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(mul(a, RAY), b);
    }

    function rdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, RAY), b / 2) / b;
    }

    function wpow(uint256 x, uint256 n) internal pure returns (uint256) {
        uint256 result = WAD;
        while (n > 0) {
            if (n % 2 != 0) {
                result = wmul(result, x);
            }
            x = wmul(x, x);
            n /= 2;
        }
        return result;
    }

    function rpow(uint256 x, uint256 n) internal pure returns (uint256) {
        uint256 result = RAY;
        while (n > 0) {
            if (n % 2 != 0) {
                result = rmul(result, x);
            }
            x = rmul(x, x);
            n /= 2;
        }
        return result;
    }
}

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

    function transferFrom(address from, address to, uint value) external returns (bool);
}

interface IXFERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

interface IXFFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    
    function blacklist(address _addr) external view returns (bool);

    function feeToSetter() external view returns (address);

    function feeToRate() external view returns (uint256);

    function getPair(address tokenA, address tokenB) external view returns (address pair);

    function allPairs(uint) external view returns (address pair);

    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;

    function setFeeToRate(uint256) external;

    function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1);

    function pairFor(address tokenA, address tokenB) external view returns (address pair);

    function getReserves(address tokenA, address tokenB) external view returns (uint256 reserveA, uint256 reserveB);

    function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB);

    function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) external view returns (uint256 amountOut);

    function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) external view returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}


interface IXFPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;

    function skim(address to) external;

    function sync() external;

    function price(address token, uint256 baseDecimal) external view returns (uint256);

    function initialize(address, address) external;
}

interface IXFRouter {
    function factory() external pure returns (address);

    function WHT() external pure returns (address);

    function swapMining() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external view returns (uint256 amountB);

    function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) external view returns (uint256 amountOut);

    function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) external view returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface ISwapMining {
    function swap(address account, address input, address output, uint256 amount) external returns (bool);
}

interface IWHT {
    function deposit() external payable;

    function transfer(address to, uint value) external returns (bool);

    function withdraw(uint) external;
}

contract XFRouter is IXFRouter, Ownable {
    using SafeMath for uint256;

    address public immutable override factory;
    address public immutable override WHT;
    address public override swapMining;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'XFRouter: EXPIRED');
        _;
    }

    constructor(address _factory, address _WHT) public {
        factory = _factory;
        WHT = _WHT;
    }

    receive() external payable {
        assert(msg.sender == WHT);
        // only accept HT via fallback from the WHT contract
    }

    function pairFor(address tokenA, address tokenB) public view returns (address pair){
        pair = IXFFactory(factory).pairFor(tokenA, tokenB);
    }

    function setSwapMining(address _swapMininng) public onlyOwner {
        swapMining = _swapMininng;
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IXFFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IXFFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = IXFFactory(factory).getReserves(tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = IXFFactory(factory).quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'XFRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = IXFFactory(factory).quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'XFRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = pairFor(tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IXFPair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WHT,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = pairFor(token, WHT);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWHT(WHT).deposit{value : amountETH}();
        assert(IWHT(WHT).transfer(pair, amountETH));
        liquidity = IXFPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        require(IXFFactory(factory).blacklist(msg.sender) == false,"xFarmerSwap: BLACKLIST");
        address pair = pairFor(tokenA, tokenB);
        IXFPair(pair).transferFrom(msg.sender, pair, liquidity);
        // send liquidity to pair
        (uint amount0, uint amount1) = IXFPair(pair).burn(to);
        (address token0,) = IXFFactory(factory).sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'XFRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'XFRouter: INSUFFICIENT_B_AMOUNT');
    }

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        require(IXFFactory(factory).blacklist(msg.sender) == false,"xFarmerSwap: BLACKLIST");
        (amountToken, amountETH) = removeLiquidity(
            token,
            WHT,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWHT(WHT).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        require(IXFFactory(factory).blacklist(msg.sender) == false,"xFarmerSwap: BLACKLIST");
        address pair = pairFor(tokenA, tokenB);
        uint value = approveMax ? uint(- 1) : liquidity;
        IXFPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        require(IXFFactory(factory).blacklist(msg.sender) == false,"xFarmerSwap: BLACKLIST");
        address pair = pairFor(token, WHT);
        uint value = approveMax ? uint(- 1) : liquidity;
        IXFPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        require(IXFFactory(factory).blacklist(msg.sender) == false,"xFarmerSwap: BLACKLIST");
        (, amountETH) = removeLiquidity(
            token,
            WHT,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWHT(WHT).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        require(IXFFactory(factory).blacklist(msg.sender) == false,"xFarmerSwap: BLACKLIST");
        address pair = pairFor(token, WHT);
        uint value = approveMax ? uint(- 1) : liquidity;
        IXFPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = IXFFactory(factory).sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            if (swapMining != address(0)) {
                ISwapMining(swapMining).swap(msg.sender, input, output, amountOut);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? pairFor(output, path[i + 2]) : _to;
            IXFPair(pairFor(input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = IXFFactory(factory).getAmountsOut(amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'XFRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, pairFor(path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = IXFFactory(factory).getAmountsIn(amountOut, path);
        require(amounts[0] <= amountInMax, 'XFRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, pairFor(path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    virtual
    override
    payable
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(path[0] == WHT, 'XFRouter: INVALID_PATH');
        amounts = IXFFactory(factory).getAmountsOut(msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'XFRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWHT(WHT).deposit{value : amounts[0]}();
        assert(IWHT(WHT).transfer(pairFor(path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }

    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    virtual
    override
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WHT, 'XFRouter: INVALID_PATH');
        amounts = IXFFactory(factory).getAmountsIn(amountOut, path);
        require(amounts[0] <= amountInMax, 'XFRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, pairFor(path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWHT(WHT).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    virtual
    override
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WHT, 'XFRouter: INVALID_PATH');
        amounts = IXFFactory(factory).getAmountsOut(amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'XFRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, pairFor(path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWHT(WHT).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    virtual
    override
    payable
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(path[0] == WHT, 'XFRouter: INVALID_PATH');
        amounts = IXFFactory(factory).getAmountsIn(amountOut, path);
        require(amounts[0] <= msg.value, 'XFRouter: EXCESSIVE_INPUT_AMOUNT');
        IWHT(WHT).deposit{value : amounts[0]}();
        assert(IWHT(WHT).transfer(pairFor(path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = IXFFactory(factory).sortTokens(input, output);
            IXFPair pair = IXFPair(pairFor(input, output));
            uint amountInput;
            uint amountOutput;
            {// scope to avoid stack too deep errors
                (uint reserve0, uint reserve1,) = pair.getReserves();
                (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
                amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
                amountOutput = IXFFactory(factory).getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            if (swapMining != address(0)) {
                ISwapMining(swapMining).swap(msg.sender, input, output, amountOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? pairFor(output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, pairFor(path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'XFRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
    external
    virtual
    override
    payable
    ensure(deadline)
    {
        require(path[0] == WHT, 'XFRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWHT(WHT).deposit{value : amountIn}();
        assert(IWHT(WHT).transfer(pairFor(path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'XFRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
    external
    virtual
    override
    ensure(deadline)
    {
        require(path[path.length - 1] == WHT, 'XFRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, pairFor(path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WHT).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'XFRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWHT(WHT).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) public view override returns (uint256 amountB) {
        return IXFFactory(factory).quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) public view override returns (uint256 amountOut){
        return IXFFactory(factory).getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) public view override returns (uint256 amountIn){
        return IXFFactory(factory).getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint256 amountIn, address[] memory path) public view override returns (uint256[] memory amounts){
        return IXFFactory(factory).getAmountsOut(amountIn, path);
    }

    function getAmountsIn(uint256 amountOut, address[] memory path) public view override returns (uint256[] memory amounts){
        return IXFFactory(factory).getAmountsIn(amountOut, path);
    }

}


// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value : value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WHT","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"WHT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapMininng","type":"address"}],"name":"setSwapMining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapMining","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b50604051620055b9380380620055b9833981810160405260408110156200003757600080fd5b50805160209091015160006200004c620000b5565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606092831b8116608052911b1660a052620000b9565b3390565b60805160601c60a05160601c6153cd620001ec600039806101e15280610f185280610f5352806110df52806113e05280611a6b5280611e3f528061218152806122a55280612380528061245a5280612528528061277352806127fb5280612ded5280612ea15280612f6d5280613002528061307652806137ce5280613b215280613b565280613b8a5280613bfe5280613d8c5280613fe95280614071525080610e605280610fe9528061119552806114d1528061161f528061183f5280611b215280611d6052806125e4528061291252806129f75280612baa5280612c5d5280612d3552806132de52806134bb5280613643528061368f52806136ef5280613e4752806145ba52806149015280614aba5280614db45280614e6d5280614f1d5280614ff052806150fb52506153cd6000f3fe6080604052600436106101d15760003560e01c806385f8c259116100f7578063baa2abde11610095578063e8e3370011610064578063e8e3370014610c7c578063f2fde38b14610cfc578063f305d71914610d2f578063fb3bdb4114610d755761020a565b8063baa2abde14610ae2578063c45a015514610b3f578063d06ca61f14610b54578063ded9382a14610c095761020a565b806396ed28f9116100d157806396ed28f91461099a578063ad615dec146109d5578063af2979eb14610a0b578063b6f9de9514610a5e5761020a565b806385f8c259146108b95780638803dbee146108ef5780638da5cb5b146109855761020a565b80634e5eda111161016f5780635cb485921161013e5780635cb4859214610775578063715018a61461078a578063791ac9471461079f5780637ff36ab5146108355761020a565b80634e5eda11146106085780634f887183146106395780635b0d59841461066c5780635c11d795146106df5761020a565b80631f00ca74116101ab5780631f00ca74146103a95780632195995c1461045e57806338ed1739146104dc5780634a25d94a146105725761020a565b806302751cec1461020f578063054d50d41461027b57806318cbafe5146102c35761020a565b3661020a57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461020857fe5b005b600080fd5b34801561021b57600080fd5b50610262600480360360c081101561023257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610df9565b6040805192835260208301919091528051918290030190f35b34801561028757600080fd5b506102b16004803603606081101561029e57600080fd5b5080359060208101359060400135610fe5565b60408051918252519081900360200190f35b3480156102cf57600080fd5b50610359600480360360a08110156102e657600080fd5b813591602081013591810190606081016040820135600160201b81111561030c57600080fd5b82018360208201111561031e57600080fd5b803590602001918460208302840111600160201b8311171561033f57600080fd5b91935091506001600160a01b03813516906020013561108f565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561039557818101518382015260200161037d565b505050509050019250505060405180910390f35b3480156103b557600080fd5b50610359600480360360408110156103cc57600080fd5b81359190810190604081016020820135600160201b8111156103ed57600080fd5b8201836020820111156103ff57600080fd5b803590602001918460208302840111600160201b8311171561042057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061149f945050505050565b34801561046a57600080fd5b50610262600480360361016081101561048257600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561161a565b3480156104e857600080fd5b50610359600480360360a08110156104ff57600080fd5b813591602081013591810190606081016040820135600160201b81111561052557600080fd5b82018360208201111561053757600080fd5b803590602001918460208302840111600160201b8311171561055857600080fd5b91935091506001600160a01b0381351690602001356117cc565b34801561057e57600080fd5b50610359600480360360a081101561059557600080fd5b813591602081013591810190606081016040820135600160201b8111156105bb57600080fd5b8201836020820111156105cd57600080fd5b803590602001918460208302840111600160201b831117156105ee57600080fd5b91935091506001600160a01b038135169060200135611a1b565b34801561061457600080fd5b5061061d611cc1565b604080516001600160a01b039092168252519081900360200190f35b34801561064557600080fd5b506102086004803603602081101561065c57600080fd5b50356001600160a01b0316611cd0565b34801561067857600080fd5b506102b1600480360361014081101561069057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611d5c565b3480156106eb57600080fd5b50610208600480360360a081101561070257600080fd5b813591602081013591810190606081016040820135600160201b81111561072857600080fd5b82018360208201111561073a57600080fd5b803590602001918460208302840111600160201b8311171561075b57600080fd5b91935091506001600160a01b038135169060200135611f23565b34801561078157600080fd5b5061061d61217f565b34801561079657600080fd5b506102086121a3565b3480156107ab57600080fd5b50610208600480360360a08110156107c257600080fd5b813591602081013591810190606081016040820135600160201b8111156107e857600080fd5b8201836020820111156107fa57600080fd5b803590602001918460208302840111600160201b8311171561081b57600080fd5b91935091506001600160a01b038135169060200135612257565b6103596004803603608081101561084b57600080fd5b81359190810190604081016020820135600160201b81111561086c57600080fd5b82018360208201111561087e57600080fd5b803590602001918460208302840111600160201b8311171561089f57600080fd5b91935091506001600160a01b0381351690602001356124e0565b3480156108c557600080fd5b506102b1600480360360608110156108dc57600080fd5b508035906020810135906040013561290e565b3480156108fb57600080fd5b50610359600480360360a081101561091257600080fd5b813591602081013591810190606081016040820135600160201b81111561093857600080fd5b82018360208201111561094a57600080fd5b803590602001918460208302840111600160201b8311171561096b57600080fd5b91935091506001600160a01b038135169060200135612984565b34801561099157600080fd5b5061061d612b97565b3480156109a657600080fd5b5061061d600480360360408110156109bd57600080fd5b506001600160a01b0381358116916020013516612ba6565b3480156109e157600080fd5b506102b1600480360360608110156109f857600080fd5b5080359060208101359060400135612c59565b348015610a1757600080fd5b506102b1600480360360c0811015610a2e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612ccf565b61020860048036036080811015610a7457600080fd5b81359190810190604081016020820135600160201b811115610a9557600080fd5b820183602082011115610aa757600080fd5b803590602001918460208302840111600160201b83111715610ac857600080fd5b91935091506001600160a01b038135169060200135612f27565b348015610aee57600080fd5b50610262600480360360e0811015610b0557600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135613277565b348015610b4b57600080fd5b5061061d613641565b348015610b6057600080fd5b5061035960048036036040811015610b7757600080fd5b81359190810190604081016020820135600160201b811115610b9857600080fd5b820183602082011115610baa57600080fd5b803590602001918460208302840111600160201b83111715610bcb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613665945050505050565b348015610c1557600080fd5b506102626004803603610140811015610c2d57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356136ea565b348015610c8857600080fd5b50610cde6004803603610100811015610ca057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356138b6565b60408051938452602084019290925282820152519081900360600190f35b348015610d0857600080fd5b5061020860048036036020811015610d1f57600080fd5b50356001600160a01b03166139c8565b610cde600480360360c0811015610d4557600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135613ad2565b61035960048036036080811015610d8b57600080fd5b81359190810190604081016020820135600160201b811115610dac57600080fd5b820183602082011115610dbe57600080fd5b803590602001918460208302840111600160201b83111715610ddf57600080fd5b91935091506001600160a01b038135169060200135613d44565b6000808242811015610e40576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b60408051633e7e4af960e21b815233600482015290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163f9f92be4916024808301926020929190829003018186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d6020811015610ed057600080fd5b505115610f12576040805162461bcd60e51b81526020600482015260166024820152600080516020615354833981519152604482015290519081900360640190fd5b610f41897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a613277565b9093509150610f518986856141b6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610fb757600080fd5b505af1158015610fcb573d6000803e3d6000fd5b50505050610fd98583614320565b50965096945050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663054d50d48585856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561105b57600080fd5b505afa15801561106f573d6000803e3d6000fd5b505050506040513d602081101561108557600080fd5b5051949350505050565b606081428110156110d5576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061110f57fe5b905060200201356001600160a01b03166001600160a01b031614611168576040805162461bcd60e51b815260206004820152601660248201526000805160206152f1833981519152604482015290519081900360640190fd5b6040805163d06ca61f60e01b8152600481018a815260248201928352604482018890526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263d06ca61f928c928b928b92606401846020850280828437600081840152601f19601f82011690508083019250505094505050505060006040518083038186803b15801561120357600080fd5b505afa158015611217573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561124057600080fd5b8101908080516040519392919084600160201b82111561125f57600080fd5b90830190602082018581111561127457600080fd5b82518660208202830111600160201b8211171561129057600080fd5b82525081516020918201928201910280838360005b838110156112bd5781810151838201526020016112a5565b50505050905001604052505050915086826001845103815181106112dd57fe5b602002602001015110156113225760405162461bcd60e51b81526004018080602001828103825260248152602001806152cd6024913960400191505060405180910390fd5b61139f8686600081811061133257fe5b905060200201356001600160a01b0316336113858989600081811061135357fe5b905060200201356001600160a01b03168a8a600181811061137057fe5b905060200201356001600160a01b0316612ba6565b8560008151811061139257fe5b6020026020010151614418565b6113de82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614575915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061141d57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561145b57600080fd5b505af115801561146f573d6000803e3d6000fd5b50505050611494848360018551038151811061148757fe5b6020026020010151614320565b509695505050505050565b604080516307c0329d60e21b815260048101848152602482019283528351604483015283516060936001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693631f00ca7493889388939192606401906020808601910280838360005b8381101561152757818101518382015260200161150f565b50505050905001935050505060006040518083038186803b15801561154b57600080fd5b505afa15801561155f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561158857600080fd5b8101908080516040519392919084600160201b8211156115a757600080fd5b9083019060208201858111156115bc57600080fd5b82518660208202830111600160201b821117156115d857600080fd5b82525081516020918201928201910280838360005b838110156116055781810151838201526020016115ed565b50505050905001604052505050905092915050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f9f92be4336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561168a57600080fd5b505afa15801561169e573d6000803e3d6000fd5b505050506040513d60208110156116b457600080fd5b5051156116f6576040805162461bcd60e51b81526020600482015260166024820152600080516020615354833981519152604482015290519081900360640190fd5b60006117028e8e612ba6565b9050600087611711578c611715565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561178b57600080fd5b505af115801561179f573d6000803e3d6000fd5b505050506117b28f8f8f8f8f8f8f613277565b809450819550505050509b509b9950505050505050505050565b60608142811015611812576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b6040805163d06ca61f60e01b8152600481018a815260248201928352604482018890526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263d06ca61f928c928b928b92606401846020850280828437600081840152601f19601f82011690508083019250505094505050505060006040518083038186803b1580156118ad57600080fd5b505afa1580156118c1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156118ea57600080fd5b8101908080516040519392919084600160201b82111561190957600080fd5b90830190602082018581111561191e57600080fd5b82518660208202830111600160201b8211171561193a57600080fd5b82525081516020918201928201910280838360005b8381101561196757818101518382015260200161194f565b505050509050016040525050509150868260018451038151811061198757fe5b602002602001015110156119cc5760405162461bcd60e51b81526004018080602001828103825260248152602001806152cd6024913960400191505060405180910390fd5b6119dc8686600081811061133257fe5b61149482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614575915050565b60608142811015611a61576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110611a9b57fe5b905060200201356001600160a01b03166001600160a01b031614611af4576040805162461bcd60e51b815260206004820152601660248201526000805160206152f1833981519152604482015290519081900360640190fd5b604080516307c0329d60e21b8152600481018a815260248201928352604482018890526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692631f00ca74928c928b928b92606401846020850280828437600081840152601f19601f82011690508083019250505094505050505060006040518083038186803b158015611b8f57600080fd5b505afa158015611ba3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611bcc57600080fd5b8101908080516040519392919084600160201b821115611beb57600080fd5b908301906020820185811115611c0057600080fd5b82518660208202830111600160201b82111715611c1c57600080fd5b82525081516020918201928201910280838360005b83811015611c49578181015183820152602001611c31565b5050505090500160405250505091508682600081518110611c6657fe5b60200260200101511115611322576040805162461bcd60e51b815260206004820181905260248201527f5846526f757465723a204558434553534956455f494e5055545f414d4f554e54604482015290519081900360640190fd5b6001546001600160a01b031681565b611cd86148b8565b6000546001600160a01b03908116911614611d3a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f9f92be4336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611dcb57600080fd5b505afa158015611ddf573d6000803e3d6000fd5b505050506040513d6020811015611df557600080fd5b505115611e37576040805162461bcd60e51b81526020600482015260166024820152600080516020615354833981519152604482015290519081900360640190fd5b6000611e638c7f0000000000000000000000000000000000000000000000000000000000000000612ba6565b9050600086611e72578b611e76565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015611eec57600080fd5b505af1158015611f00573d6000803e3d6000fd5b50505050611f128d8d8d8d8d8d612ccf565b9d9c50505050505050505050505050565b8042811015611f67576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b611fbb85856000818110611f7757fe5b905060200201356001600160a01b031633611fb588886000818110611f9857fe5b905060200201356001600160a01b03168989600181811061137057fe5b8a614418565b600085856000198101818110611fcd57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561202957600080fd5b505afa15801561203d573d6000803e3d6000fd5b505050506040513d602081101561205357600080fd5b505160408051602088810282810182019093528882529293506120959290918991899182918501908490808284376000920191909152508892506148bc915050565b8661213882888860001981018181106120aa57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561210657600080fd5b505afa15801561211a573d6000803e3d6000fd5b505050506040513d602081101561213057600080fd5b505190614d5b565b10156121755760405162461bcd60e51b81526004018080602001828103825260248152602001806152cd6024913960400191505060405180910390fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6121ab6148b8565b6000546001600160a01b0390811691161461220d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b804281101561229b576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858560001981018181106122d557fe5b905060200201356001600160a01b03166001600160a01b03161461232e576040805162461bcd60e51b815260206004820152601660248201526000805160206152f1833981519152604482015290519081900360640190fd5b61233e85856000818110611f7757fe5b61237c8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506148bc915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123eb57600080fd5b505afa1580156123ff573d6000803e3d6000fd5b505050506040513d602081101561241557600080fd5b50519050868110156124585760405162461bcd60e51b81526004018080602001828103825260248152602001806152cd6024913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156124be57600080fd5b505af11580156124d2573d6000803e3d6000fd5b505050506121758482614320565b60608142811015612526576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061255d57fe5b905060200201356001600160a01b03166001600160a01b0316146125b6576040805162461bcd60e51b815260206004820152601660248201526000805160206152f1833981519152604482015290519081900360640190fd5b6040805163d06ca61f60e01b8152346004820181815260248301938452604483018990526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169363d06ca61f938b928b929091606401846020850280828437600081840152601f19601f82011690508083019250505094505050505060006040518083038186803b15801561265257600080fd5b505afa158015612666573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561268f57600080fd5b8101908080516040519392919084600160201b8211156126ae57600080fd5b9083019060208201858111156126c357600080fd5b82518660208202830111600160201b821117156126df57600080fd5b82525081516020918201928201910280838360005b8381101561270c5781810151838201526020016126f4565b505050509050016040525050509150868260018451038151811061272c57fe5b602002602001015110156127715760405162461bcd60e51b81526004018080602001828103825260248152602001806152cd6024913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106127ad57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156127e057600080fd5b505af11580156127f4573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61283888886000818110611f9857fe5b8460008151811061284557fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561289357600080fd5b505af11580156128a7573d6000803e3d6000fd5b505050506040513d60208110156128bd57600080fd5b50516128c557fe5b61290482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614575915050565b5095945050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166385f8c2598585856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561105b57600080fd5b606081428110156129ca576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b604080516307c0329d60e21b8152600481018a815260248201928352604482018890526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692631f00ca74928c928b928b92606401846020850280828437600081840152601f19601f82011690508083019250505094505050505060006040518083038186803b158015612a6557600080fd5b505afa158015612a79573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612aa257600080fd5b8101908080516040519392919084600160201b821115612ac157600080fd5b908301906020820185811115612ad657600080fd5b82518660208202830111600160201b82111715612af257600080fd5b82525081516020918201928201910280838360005b83811015612b1f578181015183820152602001612b07565b5050505090500160405250505091508682600081518110612b3c57fe5b602002602001015111156119cc576040805162461bcd60e51b815260206004820181905260248201527f5846526f757465723a204558434553534956455f494e5055545f414d4f554e54604482015290519081900360640190fd5b6000546001600160a01b031690565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166396ed28f984846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015612c2657600080fd5b505afa158015612c3a573d6000803e3d6000fd5b505050506040513d6020811015612c5057600080fd5b50519392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad615dec8585856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561105b57600080fd5b60008142811015612d15576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b60408051633e7e4af960e21b815233600482015290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163f9f92be4916024808301926020929190829003018186803b158015612d7b57600080fd5b505afa158015612d8f573d6000803e3d6000fd5b505050506040513d6020811015612da557600080fd5b505115612de7576040805162461bcd60e51b81526020600482015260166024820152600080516020615354833981519152604482015290519081900360640190fd5b612e16887f00000000000000000000000000000000000000000000000000000000000000008989893089613277565b905080925050612e9f88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612e6e57600080fd5b505afa158015612e82573d6000803e3d6000fd5b505050506040513d6020811015612e9857600080fd5b50516141b6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612f0557600080fd5b505af1158015612f19573d6000803e3d6000fd5b505050506114948483614320565b8042811015612f6b576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110612fa257fe5b905060200201356001600160a01b03166001600160a01b031614612ffb576040805162461bcd60e51b815260206004820152601660248201526000805160206152f1833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6130b388886000818110611f9857fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156130fa57600080fd5b505af115801561310e573d6000803e3d6000fd5b505050506040513d602081101561312457600080fd5b505161312c57fe5b60008686600019810181811061313e57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561319a57600080fd5b505afa1580156131ae573d6000803e3d6000fd5b505050506040513d60208110156131c457600080fd5b505160408051602089810282810182019093528982529293506132069290918a918a9182918501908490808284376000920191909152508992506148bc915050565b87612138828989600019810181811061321b57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561210657600080fd5b60008082428110156132be576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b60408051633e7e4af960e21b815233600482015290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163f9f92be4916024808301926020929190829003018186803b15801561332457600080fd5b505afa158015613338573d6000803e3d6000fd5b505050506040513d602081101561334e57600080fd5b505115613390576040805162461bcd60e51b81526020600482015260166024820152600080516020615354833981519152604482015290519081900360640190fd5b600061339c8b8b612ba6565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156133f757600080fd5b505af115801561340b573d6000803e3d6000fd5b505050506040513d602081101561342157600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561346e57600080fd5b505af1158015613482573d6000803e3d6000fd5b505050506040513d604081101561349857600080fd5b8101908080519060200190929190805190602001909291905050509150915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663544caa568f8f6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050604080518083038186803b15801561353657600080fd5b505afa15801561354a573d6000803e3d6000fd5b505050506040513d604081101561356057600080fd5b505190506001600160a01b038e81169082161461357e578183613581565b82825b90975095508a8710156135db576040805162461bcd60e51b815260206004820152601f60248201527f5846526f757465723a20494e53554646494349454e545f415f414d4f554e5400604482015290519081900360640190fd5b89861015613630576040805162461bcd60e51b815260206004820152601f60248201527f5846526f757465723a20494e53554646494349454e545f425f414d4f554e5400604482015290519081900360640190fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040805163d06ca61f60e01b815260048101848152602482019283528351604483015283516060937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169363d06ca61f9388938893919260640190602080860191028083836000831561152757818101518382015260200161150f565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f9f92be4336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561375a57600080fd5b505afa15801561376e573d6000803e3d6000fd5b505050506040513d602081101561378457600080fd5b5051156137c6576040805162461bcd60e51b81526020600482015260166024820152600080516020615354833981519152604482015290519081900360640190fd5b60006137f28d7f0000000000000000000000000000000000000000000000000000000000000000612ba6565b9050600087613801578c613805565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561387b57600080fd5b505af115801561388f573d6000803e3d6000fd5b505050506138a18e8e8e8e8e8e610df9565b909f909e509c50505050505050505050505050565b600080600083428110156138ff576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b61390d8c8c8c8c8c8c614da4565b9094509250600061391e8d8d612ba6565b905061392c8d338388614418565b6139388c338387614418565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561398757600080fd5b505af115801561399b573d6000803e3d6000fd5b505050506040513d60208110156139b157600080fd5b5051949d939c50939a509198505050505050505050565b6139d06148b8565b6000546001600160a01b03908116911614613a32576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116613a775760405162461bcd60e51b81526004018080602001828103825260268152602001806152a76026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008060008342811015613b1b576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b613b498a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614da4565b90945092506000613b7a8b7f0000000000000000000000000000000000000000000000000000000000000000612ba6565b9050613b888b338388614418565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015613be357600080fd5b505af1158015613bf7573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015613c7357600080fd5b505af1158015613c87573d6000803e3d6000fd5b505050506040513d6020811015613c9d57600080fd5b5051613ca557fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015613cf457600080fd5b505af1158015613d08573d6000803e3d6000fd5b505050506040513d6020811015613d1e57600080fd5b5051925034841015613d3657613d3633853403614320565b505096509650969350505050565b60608142811015613d8a576040805162461bcd60e51b81526020600482015260116024820152600080516020615311833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110613dc157fe5b905060200201356001600160a01b03166001600160a01b031614613e1a576040805162461bcd60e51b815260206004820152601660248201526000805160206152f1833981519152604482015290519081900360640190fd5b604080516307c0329d60e21b81526004810189815260248201928352604482018890526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692631f00ca74928b928b928b92606401846020850280828437600081840152601f19601f82011690508083019250505094505050505060006040518083038186803b158015613eb557600080fd5b505afa158015613ec9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613ef257600080fd5b8101908080516040519392919084600160201b821115613f1157600080fd5b908301906020820185811115613f2657600080fd5b82518660208202830111600160201b82111715613f4257600080fd5b82525081516020918201928201910280838360005b83811015613f6f578181015183820152602001613f57565b5050505090500160405250505091503482600081518110613f8c57fe5b60200260200101511115613fe7576040805162461bcd60e51b815260206004820181905260248201527f5846526f757465723a204558434553534956455f494e5055545f414d4f554e54604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061402357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561405657600080fd5b505af115801561406a573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6140ae88886000818110611f9857fe5b846000815181106140bb57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561410957600080fd5b505af115801561411d573d6000803e3d6000fd5b505050506040513d602081101561413357600080fd5b505161413b57fe5b61417a82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614575915050565b8160008151811061418757fe5b60200260200101513411156129045761290433836000815181106141a757fe5b60200260200101513403614320565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106142335780518252601f199092019160209182019101614214565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614295576040519150601f19603f3d011682016040523d82523d6000602084013e61429a565b606091505b50915091508180156142c85750805115806142c857508080602001905160208110156142c557600080fd5b50515b614319576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061436c5780518252601f19909201916020918201910161434d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146143ce576040519150601f19603f3d011682016040523d82523d6000602084013e6143d3565b606091505b50509050806144135760405162461bcd60e51b81526004018080602001828103825260238152602001806153316023913960400191505060405180910390fd5b505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061449d5780518252601f19909201916020918201910161447e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146144ff576040519150601f19603f3d011682016040523d82523d6000602084013e614504565b606091505b5091509150818015614532575080511580614532575080806020019051602081101561452f57600080fd5b50515b61456d5760405162461bcd60e51b81526004018080602001828103825260248152602001806153746024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156148b25760008084838151811061459357fe5b60200260200101518584600101815181106145aa57fe5b60200260200101519150915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663544caa5684846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050604080518083038186803b15801561463557600080fd5b505afa158015614649573d6000803e3d6000fd5b505050506040513d604081101561465f57600080fd5b5051875190915060009088906001870190811061467857fe5b60209081029190910101516001549091506001600160a01b031615614728576001546040805163152cf14360e31b81523360048201526001600160a01b0387811660248301528681166044830152606482018590529151919092169163a9678a189160848083019260209291908290030181600087803b1580156146fb57600080fd5b505af115801561470f573d6000803e3d6000fd5b505050506040513d602081101561472557600080fd5b50505b600080836001600160a01b0316866001600160a01b03161461474c57826000614750565b6000835b91509150600060028a510388106147675788614787565b614787868b8a6002018151811061477a57fe5b6020026020010151612ba6565b90506147938787612ba6565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156147d0576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614838578181015183820152602001614820565b50505050905090810190601f1680156148655780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561488757600080fd5b505af115801561489b573d6000803e3d6000fd5b505060019099019850614578975050505050505050565b50505050565b3390565b60005b6001835103811015614413576000808483815181106148da57fe5b60200260200101518584600101815181106148f157fe5b60200260200101519150915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663544caa5684846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050604080518083038186803b15801561497c57600080fd5b505afa158015614990573d6000803e3d6000fd5b505050506040513d60408110156149a657600080fd5b5051905060006149b68484612ba6565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156149f757600080fd5b505afa158015614a0b573d6000803e3d6000fd5b505050506040513d6060811015614a2157600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506000806001600160a01b038a811690891614614a5e578284614a61565b83835b91509150614ab6828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561210657600080fd5b95507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663054d50d48784846040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015614b2c57600080fd5b505afa158015614b40573d6000803e3d6000fd5b505050506040513d6020811015614b5657600080fd5b50516001549095506001600160a01b0316159350614c0392505050576001546040805163152cf14360e31b81523360048201526001600160a01b0389811660248301528881166044830152606482018590529151919092169163a9678a189160848083019260209291908290030181600087803b158015614bd657600080fd5b505af1158015614bea573d6000803e3d6000fd5b505050506040513d6020811015614c0057600080fd5b50505b600080856001600160a01b0316886001600160a01b031614614c2757826000614c2b565b6000835b91509150600060028c51038a10614c42578a614c55565b614c55888d8c6002018151811061477a57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614cdf578181015183820152602001614cc7565b50505050905090810190601f168015614d0c5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614d2e57600080fd5b505af1158015614d42573d6000803e3d6000fd5b50506001909b019a506148bf9950505050505050505050565b6000614d9d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061520f565b9392505050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015614e3057600080fd5b505afa158015614e44573d6000803e3d6000fd5b505050506040513d6020811015614e5a57600080fd5b50516001600160a01b03161415614f18577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b158015614eeb57600080fd5b505af1158015614eff573d6000803e3d6000fd5b505050506040513d6020811015614f1557600080fd5b50505b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d52bb6f48b8b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050604080518083038186803b158015614f9857600080fd5b505afa158015614fac573d6000803e3d6000fd5b505050506040513d6040811015614fc257600080fd5b508051602090910151909250905081158015614fdc575080155b15614fec57879350869250615202565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad615dec8a85856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561506257600080fd5b505afa158015615076573d6000803e3d6000fd5b505050506040513d602081101561508c57600080fd5b505190508781116150f757858110156150ec576040805162461bcd60e51b815260206004820152601f60248201527f5846526f757465723a20494e53554646494349454e545f425f414d4f554e5400604482015290519081900360640190fd5b889450925082615200565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad615dec8a85876040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561516d57600080fd5b505afa158015615181573d6000803e3d6000fd5b505050506040513d602081101561519757600080fd5b50519050898111156151a557fe5b878110156151fa576040805162461bcd60e51b815260206004820152601f60248201527f5846526f757465723a20494e53554646494349454e545f415f414d4f554e5400604482015290519081900360640190fd5b94508793505b505b5050965096945050505050565b6000818484111561529e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561526357818101518382015260200161524b565b50505050905090810190601f1680156152905780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735846526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545846526f757465723a20494e56414c49445f50415448000000000000000000005846526f757465723a20455850495245440000000000000000000000000000005472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544784661726d6572537761703a20424c41434b4c495354000000000000000000005472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220aae879dcdfbc926a97b0a4887b576bd29ef42d948f1aecde541f63f4c7dd1d6564736f6c634300060c003300000000000000000000000026474955a5df147e4bf1729c8c1242033f5754df0000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000026474955a5df147e4bf1729c8c1242033f5754df0000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f

-----Decoded View---------------
Arg [0] : _factory (address): 0x26474955a5df147e4bf1729c8c1242033f5754df
Arg [1] : _WHT (address): 0x5545153ccfca01fbd7dd11c0b23ba694d9509a6f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000026474955a5df147e4bf1729c8c1242033f5754df
Arg [1] : 0000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f


Deployed ByteCode Sourcemap

17952:18682:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18458:10;-1:-1:-1;;;;;18472:3:0;18458:17;;18451:25;;;;17952:18682;;;;;22848:765;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22848:765:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35782:218;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35782:218:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30272:781;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30272:781:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30272:781:0;;;;;;;;;;;;-1:-1:-1;30272:781:0;-1:-1:-1;;;;;;30272:781:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36435:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36435:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36435:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36435:194:0;;-1:-1:-1;36435:194:0;;-1:-1:-1;;;;;36435:194:0:i;23621:740::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23621:740:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27702:589::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27702:589:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27702:589:0;;;;;;;;;;;;-1:-1:-1;27702:589:0;-1:-1:-1;;;;;;27702:589:0;;;;;;;;:::i;29505:759::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29505:759:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29505:759:0;;;;;;;;;;;;-1:-1:-1;29505:759:0;-1:-1:-1;;;;;;29505:759:0;;;;;;;;:::i;18126:34::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;18126:34:0;;;;;;;;;;;;;;18714:106;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18714:106:0;-1:-1:-1;;;;;18714:106:0;;:::i;25979:780::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25979:780:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33269:681::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33269:681:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33269:681:0;;;;;;;;;;;;-1:-1:-1;33269:681:0;-1:-1:-1;;;;;;33269:681:0;;;;;;;;:::i;18082:37::-;;;;;;;;;;;;;:::i;1557:148::-;;;;;;;;;;;;;:::i;34752:783::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34752:783:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34752:783:0;;;;;;;;;;;;-1:-1:-1;34752:783:0;-1:-1:-1;;;;;;34752:783:0;;;;;;;;:::i;28874:623::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28874:623:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28874:623:0;;;;;;;;;;;;-1:-1:-1;28874:623:0;-1:-1:-1;;;;;;28874:623:0;;;;;;;;:::i;36008:217::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36008:217:0;;;;;;;;;;;;:::i;28299:567::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28299:567:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28299:567:0;;;;;;;;;;;;-1:-1:-1;28299:567:0;-1:-1:-1;;;;;;28299:567:0;;;;;;;;:::i;915:79::-;;;;;;;;;;;;;:::i;18554:152::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18554:152:0;;;;;;;;;;:::i;35579:195::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35579:195:0;;;;;;;;;;;;:::i;25179:792::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25179:792:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33958:786::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33958:786:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33958:786:0;;;;;;;;;;;;-1:-1:-1;33958:786:0;-1:-1:-1;;;;;;33958:786:0;;;;;;;;:::i;21922:918::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21922:918:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18034:41::-;;;;;;;;;;;;;:::i;36233:194::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36233:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36233:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36233:194:0;;-1:-1:-1;36233:194:0;;-1:-1:-1;;;;;36233:194:0:i;24369:731::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24369:731:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20230:705::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20230:705:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1860:244;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1860:244:0;-1:-1:-1;;;;;1860:244:0;;:::i;20943:936::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20943:936:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31061:736::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31061:736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31061:736:0;;;;;;;;;;;;-1:-1:-1;31061:736:0;-1:-1:-1;;;;;;31061:736:0;;;;;;;;:::i;22848:765::-;23085:16;23103:14;23066:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;23138:41:::1;::::0;;-1:-1:-1;;;23138:41:0;;23168:10:::1;23138:41;::::0;::::1;::::0;;;-1:-1:-1;;;;;23149:7:0::1;23138:29;::::0;::::1;::::0;:41;;;;;::::1;::::0;;;;;;;;:29;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23138:41:0;:50:::1;23130:84;;;::::0;;-1:-1:-1;;;23130:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;23130:84:0;;;;;;;;;;;;;::::1;;23252:195;23282:5;23302:3;23320:9;23344:14;23373:12;23408:4;23428:8;23252:15;:195::i;:::-;23225:222:::0;;-1:-1:-1;23225:222:0;-1:-1:-1;23458:51:0::1;23486:5:::0;23493:2;23225:222;23458:27:::1;:51::i;:::-;23525:3;-1:-1:-1::0;;;;;23520:18:0::1;;23539:9;23520:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23560:45;23591:2;23595:9;23560:30;:45::i;:::-;22848:765:::0;;;;;;;;;;:::o;35782:218::-;35891:17;35938:7;-1:-1:-1;;;;;35927:32:0;;35960:8;35970:9;35981:10;35927:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35927:65:0;;35782:218;-1:-1:-1;;;;35782:218:0:o;30272:781::-;30466:21;30442:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30538:3:0::1;30513:28;:4:::0;;-1:-1:-1;;30518:15:0;;30513:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30513:21:0::1;-1:-1:-1::0;;;;;30513:28:0::1;;30505:63;;;::::0;;-1:-1:-1;;;30505:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;30505:63:0;;;;;;;;;;;;;::::1;;30589:49;::::0;;-1:-1:-1;;;30589:49:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30600:7:0::1;30589:33;::::0;::::1;::::0;30623:8;;30633:4;;;;30589:49;;30633:4;30589:49:::1;::::0;::::1;::::0;30633:4;30589:49;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;30589:49:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;30589:49:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;30589:49:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;30589:49:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;30579:59;;30688:12;30657:7;30682:1;30665:7;:14;:18;30657:27;;;;;;;;;;;;;;:43;;30649:92;;;;-1:-1:-1::0;;;30649:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30752:115;30798:4;;30803:1;30798:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30798:7:0::1;30807:10;30819:25;30827:4;;30832:1;30827:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30827:7:0::1;30836:4;;30841:1;30836:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30836:7:0::1;30819;:25::i;:::-;30846:7;30854:1;30846:10;;;;;;;;;;;;;;30752:31;:115::i;:::-;30878:35;30884:7;30893:4;;30878:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30907:4:0::1;::::0;-1:-1:-1;30878:5:0::1;::::0;-1:-1:-1;;30878:35:0:i:1;:::-;30929:3;-1:-1:-1::0;;;;;30924:18:0::1;;30943:7;30968:1;30951:7;:14;:18;30943:27;;;;;;;;;;;;;;30924:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30982:63;31013:2;31017:7;31042:1;31025:7;:14;:18;31017:27;;;;;;;;;;;;;;30982:30;:63::i;:::-;30272:781:::0;;;;;;;;;:::o;36435:194::-;36572:49;;;-1:-1:-1;;;36572:49:0;;;;;;;;;;;;;;;;;;;;;;36529:24;;-1:-1:-1;;;;;36583:7:0;36572:32;;;;36605:9;;36616:4;;36572:49;;;;;;;;;;;;;;-1:-1:-1;36572:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36572:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36572:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36572:49:0;;;;;;;;;;;;-1:-1:-1;36572:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36565:56;;36435:194;;;;:::o;23621:740::-;23927:12;23941;23985:7;-1:-1:-1;;;;;23974:29:0;;24004:10;23974:41;;;;;;;;;;;;;-1:-1:-1;;;;;23974:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23974:41:0;:50;23966:84;;;;;-1:-1:-1;;;23966:84:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23966:84:0;;;;;;;;;;;;;;;24061:12;24076:23;24084:6;24092;24076:7;:23::i;:::-;24061:38;;24110:10;24123;:34;;24148:9;24123:34;;;-1:-1:-1;;24123:34:0;24168:73;;;-1:-1:-1;;;24168:73:0;;24189:10;24168:73;;;;24209:4;24168:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24110:47;;-1:-1:-1;;;;;;24168:20:0;;;;;:73;;;;;-1:-1:-1;;24168:73:0;;;;;;;;-1:-1:-1;24168:20:0;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24273:80;24289:6;24297;24305:9;24316:10;24328;24340:2;24344:8;24273:15;:80::i;:::-;24252:101;;;;;;;;23621:740;;;;;;;;;;;;;;;;:::o;27702:589::-;27926:21;27907:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;27970:49:::1;::::0;;-1:-1:-1;;;27970:49:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27981:7:0::1;27970:33;::::0;::::1;::::0;28004:8;;28014:4;;;;27970:49;;28014:4;27970:49:::1;::::0;::::1;::::0;28014:4;27970:49;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;27970:49:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;27970:49:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;27970:49:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;27970:49:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;27960:59;;28069:12;28038:7;28063:1;28046:7;:14;:18;28038:27;;;;;;;;;;;;;;:43;;28030:92;;;;-1:-1:-1::0;;;28030:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28133:115;28179:4;;28184:1;28179:7;;;;;;28133:115;28259:24;28265:7;28274:4;;28259:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28280:2:0;;-1:-1:-1;28259:5:0::1;::::0;-1:-1:-1;;28259:24:0:i:1;29505:759::-:0;29699:21;29675:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29771:3:0::1;29746:28;:4:::0;;-1:-1:-1;;29751:15:0;;29746:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;29746:21:0::1;-1:-1:-1::0;;;;;29746:28:0::1;;29738:63;;;::::0;;-1:-1:-1;;;29738:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29738:63:0;;;;;;;;;;;;;::::1;;29822:49;::::0;;-1:-1:-1;;;29822:49:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29833:7:0::1;29822:32;::::0;::::1;::::0;29855:9;;29866:4;;;;29822:49;;29866:4;29822:49:::1;::::0;::::1;::::0;29866:4;29822:49;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;29822:49:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;29822:49:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;29822:49:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;29822:49:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;29812:59;;29904:11;29890:7;29898:1;29890:10;;;;;;;;;;;;;;:25;;29882:70;;;::::0;;-1:-1:-1;;;29882:70:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;18126:34:::0;;;-1:-1:-1;;;;;18126:34:0;;:::o;18714:106::-;1137:12;:10;:12::i;:::-;1127:6;;-1:-1:-1;;;;;1127:6:0;;;:22;;;1119:67;;;;;-1:-1:-1;;;1119:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18787:10:::1;:25:::0;;-1:-1:-1;;;;;;18787:25:0::1;-1:-1:-1::0;;;;;18787:25:0;;;::::1;::::0;;;::::1;::::0;;18714:106::o;25979:780::-;26297:14;26343:7;-1:-1:-1;;;;;26332:29:0;;26362:10;26332:41;;;;;;;;;;;;;-1:-1:-1;;;;;26332:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26332:41:0;:50;26324:84;;;;;-1:-1:-1;;;26324:84:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26324:84:0;;;;;;;;;;;;;;;26419:12;26434:19;26442:5;26449:3;26434:7;:19::i;:::-;26419:34;;26464:10;26477;:34;;26502:9;26477:34;;;-1:-1:-1;;26477:34:0;26522:73;;;-1:-1:-1;;;26522:73:0;;26543:10;26522:73;;;;26563:4;26522:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26464:47;;-1:-1:-1;;;;;;26522:20:0;;;;;:73;;;;;-1:-1:-1;;26522:73:0;;;;;;;;-1:-1:-1;26522:20:0;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26618:133;26680:5;26687:9;26698:14;26714:12;26728:2;26732:8;26618:47;:133::i;:::-;26606:145;25979:780;-1:-1:-1;;;;;;;;;;;;;25979:780:0:o;33269:681::-;33503:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;33524:113:::1;33570:4;;33575:1;33570:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33570:7:0::1;33579:10;33591:25;33599:4;;33604:1;33599:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33599:7:0::1;33608:4;;33613:1;33608:7;;;;;;33591:25;33618:8;33524:31;:113::i;:::-;33648:18;33676:4:::0;;-1:-1:-1;;33681:15:0;;33676:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33676:21:0::1;-1:-1:-1::0;;;;;33669:39:0::1;;33709:2;33669:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;33669:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33669:43:0;33723:44:::1;::::0;;33669:43:::1;33723:44:::0;;::::1;::::0;;;;;;;;;;;33669:43;;-1:-1:-1;33723:44:0::1;::::0;;;33758:4;;;;;;33723:44;::::1;::::0;33758:4;;33723:44;33758:4;33723:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;33764:2:0;;-1:-1:-1;33723:34:0::1;::::0;-1:-1:-1;;33723:44:0:i:1;:::-;33866:12:::0;33800:62:::1;33848:13:::0;33807:4;;-1:-1:-1;;33812:15:0;;33807:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33807:21:0::1;-1:-1:-1::0;;;;;33800:39:0::1;;33840:2;33800:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;33800:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33800:43:0;;:47:::1;:62::i;:::-;:78;;33778:164;;;;-1:-1:-1::0;;;33778:164:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18279:1;33269:681:::0;;;;;;;:::o;18082:37::-;;;:::o;1557:148::-;1137:12;:10;:12::i;:::-;1127:6;;-1:-1:-1;;;;;1127:6:0;;;:22;;;1119:67;;;;;-1:-1:-1;;;1119:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1664:1:::1;1648:6:::0;;1627:40:::1;::::0;-1:-1:-1;;;;;1648:6:0;;::::1;::::0;1627:40:::1;::::0;1664:1;;1627:40:::1;1695:1;1678:19:::0;;-1:-1:-1;;;;;;1678:19:0::1;::::0;;1557:148::o;34752:783::-;35003:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35062:3:0::1;35037:28;:4:::0;;-1:-1:-1;;35042:15:0;;35037:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;35037:21:0::1;-1:-1:-1::0;;;;;35037:28:0::1;;35029:63;;;::::0;;-1:-1:-1;;;35029:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35029:63:0;;;;;;;;;;;;;::::1;;35103:113;35149:4;;35154:1;35149:7;;;;;;35103:113;35227:55;35262:4;;35227:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35276:4:0::1;::::0;-1:-1:-1;35227:34:0::1;::::0;-1:-1:-1;;35227:55:0:i:1;:::-;35293:14;35317:3;-1:-1:-1::0;;;;;35310:21:0::1;;35340:4;35310:36;;;;;;;;;;;;;-1:-1:-1::0;;;;;35310:36:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35310:36:0;;-1:-1:-1;35365:25:0;;::::1;;35357:74;;;;-1:-1:-1::0;;;35357:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35447:3;-1:-1:-1::0;;;;;35442:18:0::1;;35461:9;35442:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35482:45;35513:2;35517:9;35482:30;:45::i;28874:623::-:0;29066:21;29042:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;29124:3:::1;-1:-1:-1::0;;;;;29113:14:0::1;:4;;29118:1;29113:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29113:7:0::1;-1:-1:-1::0;;;;;29113:14:0::1;;29105:49;;;::::0;;-1:-1:-1;;;29105:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29105:49:0;;;;;;;;;;;;;::::1;;29175:50;::::0;;-1:-1:-1;;;29175:50:0;;29209:9:::1;29175:50;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29186:7:0::1;29175:33;::::0;::::1;::::0;29220:4;;;;29175:50;;;;29220:4;29175:50:::1;::::0;::::1;::::0;29220:4;29175:50;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;29175:50:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;29175:50:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;29175:50:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;29175:50:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;29165:60;;29275:12;29244:7;29269:1;29252:7;:14;:18;29244:27;;;;;;;;;;;;;;:43;;29236:92;;;;-1:-1:-1::0;;;29236:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29344:3;-1:-1:-1::0;;;;;29339:17:0::1;;29365:7;29373:1;29365:10;;;;;;;;;;;;;;29339:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29401:3;-1:-1:-1::0;;;;;29396:18:0::1;;29415:25;29423:4;;29428:1;29423:7;;;;;;29415:25;29442:7;29450:1;29442:10;;;;;;;;;;;;;;29396:57;;;;;;;;;;;;;-1:-1:-1::0;;;;;29396:57:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29396:57:0;29389:65:::1;;;;29465:24;29471:7;29480:4;;29465:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29486:2:0;;-1:-1:-1;29465:5:0::1;::::0;-1:-1:-1;;29465:24:0:i:1;:::-;28874:623:::0;;;;;;;;:::o;36008:217::-;36117:16;36163:7;-1:-1:-1;;;;;36152:31:0;;36184:9;36195;36206:10;36152:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28299:567;28523:21;28504:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;28567:49:::1;::::0;;-1:-1:-1;;;28567:49:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28578:7:0::1;28567:32;::::0;::::1;::::0;28600:9;;28611:4;;;;28567:49;;28611:4;28567:49:::1;::::0;::::1;::::0;28611:4;28567:49;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;28567:49:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;28567:49:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;28567:49:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;28567:49:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;28557:59;;28649:11;28635:7;28643:1;28635:10;;;;;;;;;;;;;;:25;;28627:70;;;::::0;;-1:-1:-1;;;28627:70:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;915:79:::0;953:7;980:6;-1:-1:-1;;;;;980:6:0;915:79;:::o;18554:152::-;18624:12;18666:7;-1:-1:-1;;;;;18655:27:0;;18683:6;18691;18655:43;;;;;;;;;;;;;-1:-1:-1;;;;;18655:43:0;;;;;;-1:-1:-1;;;;;18655:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18655:43:0;;18554:152;-1:-1:-1;;;18554:152:0:o;35579:195::-;35677:15;35723:7;-1:-1:-1;;;;;35712:25:0;;35738:7;35747:8;35757;35712:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25179:792;25445:14;25426:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;25480:41:::1;::::0;;-1:-1:-1;;;25480:41:0;;25510:10:::1;25480:41;::::0;::::1;::::0;;;-1:-1:-1;;;;;25491:7:0::1;25480:29;::::0;::::1;::::0;:41;;;;;::::1;::::0;;;;;;;;:29;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25480:41:0;:50:::1;25472:84;;;::::0;;-1:-1:-1;;;25472:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;25472:84:0;;;;;;;;;;;;;::::1;;25583:195;25613:5;25633:3;25651:9;25675:14;25704:12;25739:4;25759:8;25583:15;:195::i;:::-;25567:211;;;;;;25789:78;25817:5;25824:2;25835:5;-1:-1:-1::0;;;;;25828:23:0::1;;25860:4;25828:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;25828:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25828:38:0;25789:27:::1;:78::i;:::-;25883:3;-1:-1:-1::0;;;;;25878:18:0::1;;25897:9;25878:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25918:45;25949:2;25953:9;25918:30;:45::i;33958:786::-:0;34198:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;34243:3:::1;-1:-1:-1::0;;;;;34232:14:0::1;:4;;34237:1;34232:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;34232:7:0::1;-1:-1:-1::0;;;;;34232:14:0::1;;34224:49;;;::::0;;-1:-1:-1;;;34224:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;34224:49:0;;;;;;;;;;;;;::::1;;34284:13;34300:9;34284:25;;34325:3;-1:-1:-1::0;;;;;34320:17:0::1;;34346:8;34320:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;34380:3;-1:-1:-1::0;;;;;34375:18:0::1;;34394:25;34402:4;;34407:1;34402:7;;;;;;34394:25;34421:8;34375:55;;;;;;;;;;;;;-1:-1:-1::0;;;;;34375:55:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34375:55:0;34368:63:::1;;;;34442:18;34470:4:::0;;-1:-1:-1;;34475:15:0;;34470:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;34470:21:0::1;-1:-1:-1::0;;;;;34463:39:0::1;;34503:2;34463:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;34463:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34463:43:0;34517:44:::1;::::0;;34463:43:::1;34517:44:::0;;::::1;::::0;;;;;;;;;;;34463:43;;-1:-1:-1;34517:44:0::1;::::0;;;34552:4;;;;;;34517:44;::::1;::::0;34552:4;;34517:44;34552:4;34517:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;34558:2:0;;-1:-1:-1;34517:34:0::1;::::0;-1:-1:-1;;34517:44:0:i:1;:::-;34660:12:::0;34594:62:::1;34642:13:::0;34601:4;;-1:-1:-1;;34606:15:0;;34601:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;34601:21:0::1;-1:-1:-1::0;;;;;34594:39:0::1;;34634:2;34594:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;34594:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;21922:918:::0;22176:12;22190;22157:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;22223:41:::1;::::0;;-1:-1:-1;;;22223:41:0;;22253:10:::1;22223:41;::::0;::::1;::::0;;;-1:-1:-1;;;;;22234:7:0::1;22223:29;::::0;::::1;::::0;:41;;;;;::::1;::::0;;;;;;;;:29;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22223:41:0;:50:::1;22215:84;;;::::0;;-1:-1:-1;;;22215:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;22215:84:0;;;;;;;;;;;;;::::1;;22310:12;22325:23;22333:6;22341;22325:7;:23::i;:::-;22359:55;::::0;;-1:-1:-1;;;22359:55:0;;22386:10:::1;22359:55;::::0;::::1;::::0;-1:-1:-1;;;;;22359:26:0;::::1;:55:::0;;;;;;;;;;;;;;22310:38;;-1:-1:-1;22359:26:0;;::::1;::::0;:55;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;22359:26:0;:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;22491:22:0::1;::::0;;-1:-1:-1;;;22491:22:0;;-1:-1:-1;;;;;22491:22:0;;::::1;;::::0;::::1;::::0;;;22461:12:::1;::::0;;;22491:18;;::::1;::::0;::::1;::::0;:22;;;;;;;;;;;22461:12;22491:18;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;22460:53;;;;22525:14;22555:7;-1:-1:-1::0;;;;;22544:30:0::1;;22575:6;22583;22544:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;22544:46:0::1;;;;;;-1:-1:-1::0;;;;;22544:46:0::1;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22544:46:0;;-1:-1:-1;;;;;;22622:16:0;;::::1;::::0;;::::1;;:58;;22663:7;22672;22622:58;;;22642:7;22651;22622:58;22601:79:::0;;-1:-1:-1;22601:79:0;-1:-1:-1;22699:21:0;;::::1;;22691:65;;;::::0;;-1:-1:-1;;;22691:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;22786:10;22775:7;:21;;22767:65;;;::::0;;-1:-1:-1;;;22767:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;18279:1;;;;21922:918:::0;;;;;;;;;;;:::o;18034:41::-;;;:::o;36233:194::-;36370:49;;;-1:-1:-1;;;36370:49:0;;;;;;;;;;;;;;;;;;;;;;36327:24;;36381:7;-1:-1:-1;;;;;36370:33:0;;;;:49;;;;;;;;;;;;;;;;;;-1:-1:-1;36370:49:0;;;;;;;;;;;;;;;;24369:731;24658:16;24676:14;24722:7;-1:-1:-1;;;;;24711:29:0;;24741:10;24711:41;;;;;;;;;;;;;-1:-1:-1;;;;;24711:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24711:41:0;:50;24703:84;;;;;-1:-1:-1;;;24703:84:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24703:84:0;;;;;;;;;;;;;;;24798:12;24813:19;24821:5;24828:3;24813:7;:19::i;:::-;24798:34;;24843:10;24856;:34;;24881:9;24856:34;;;-1:-1:-1;;24856:34:0;24901:73;;;-1:-1:-1;;;24901:73:0;;24922:10;24901:73;;;;24942:4;24901:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24843:47;;-1:-1:-1;;;;;;24901:20:0;;;;;:73;;;;;-1:-1:-1;;24901:73:0;;;;;;;;-1:-1:-1;24901:20:0;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25012:80;25031:5;25038:9;25049:14;25065:12;25079:2;25083:8;25012:18;:80::i;:::-;24985:107;;;;-1:-1:-1;24369:731:0;-1:-1:-1;;;;;;;;;;;;;24369:731:0:o;20230:705::-;20518:12;20532;20546:14;20499:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;20594:85:::1;20608:6;20616;20624:14;20640;20656:10;20668;20594:13;:85::i;:::-;20573:106:::0;;-1:-1:-1;20573:106:0;-1:-1:-1;20690:12:0::1;20705:23;20713:6:::0;20721;20705:7:::1;:23::i;:::-;20690:38;;20739:66;20771:6;20779:10;20791:4;20797:7;20739:31;:66::i;:::-;20816;20848:6;20856:10;20868:4;20874:7;20816:31;:66::i;:::-;20913:4;-1:-1:-1::0;;;;;20905:18:0::1;;20924:2;20905:22;;;;;;;;;;;;;-1:-1:-1::0;;;;;20905:22:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20905:22:0;20230:705;;;;-1:-1:-1;20905:22:0;;-1:-1:-1;20230:705:0;;-1:-1:-1;;;;;;;;;20230:705:0:o;1860:244::-;1137:12;:10;:12::i;:::-;1127:6;;-1:-1:-1;;;;;1127:6:0;;;:22;;;1119:67;;;;;-1:-1:-1;;;1119:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1949:22:0;::::1;1941:73;;;;-1:-1:-1::0;;;1941:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2051:6;::::0;;2030:38:::1;::::0;-1:-1:-1;;;;;2030:38:0;;::::1;::::0;2051:6;::::1;::::0;2030:38:::1;::::0;::::1;2079:6;:17:::0;;-1:-1:-1;;;;;;2079:17:0::1;-1:-1:-1::0;;;;;2079:17:0;;;::::1;::::0;;;::::1;::::0;;1860:244::o;20943:936::-;21196:16;21214:14;21230;21177:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;21284:175:::1;21312:5;21332:3;21350:18;21383:9;21407:14;21436:12;21284:13;:175::i;:::-;21257:202:::0;;-1:-1:-1;21257:202:0;-1:-1:-1;21470:12:0::1;21485:19;21493:5:::0;21500:3:::1;21485:7;:19::i;:::-;21470:34;;21515:69;21547:5;21554:10;21566:4;21572:11;21515:31;:69::i;:::-;21600:3;-1:-1:-1::0;;;;;21595:17:0::1;;21621:9;21595:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;21656:3;-1:-1:-1::0;;;;;21651:18:0::1;;21670:4;21676:9;21651:35;;;;;;;;;;;;;-1:-1:-1::0;;;;;21651:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21651:35:0;21644:43:::1;;;;21718:4;-1:-1:-1::0;;;;;21710:18:0::1;;21729:2;21710:22;;;;;;;;;;;;;-1:-1:-1::0;;;;;21710:22:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21710:22:0;;-1:-1:-1;21783:9:0::1;:21:::0;-1:-1:-1;21779:92:0::1;;;21806:65;21837:10;21861:9;21849;:21;21806:30;:65::i;:::-;18279:1;20943:936:::0;;;;;;;;;;;:::o;31061:736::-;31250:21;31226:8;18231:15;18219:8;:27;;18211:57;;;;;-1:-1:-1;;;18211:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18211:57:0;;;;;;;;;;;;;;;31308:3:::1;-1:-1:-1::0;;;;;31297:14:0::1;:4;;31302:1;31297:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31297:7:0::1;-1:-1:-1::0;;;;;31297:14:0::1;;31289:49;;;::::0;;-1:-1:-1;;;31289:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;31289:49:0;;;;;;;;;;;;;::::1;;31359;::::0;;-1:-1:-1;;;31359:49:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31370:7:0::1;31359:32;::::0;::::1;::::0;31392:9;;31403:4;;;;31359:49;;31403:4;31359:49:::1;::::0;::::1;::::0;31403:4;31359:49;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;31359:49:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;31359:49:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;31359:49:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;31359:49:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;31349:59;;31441:9;31427:7;31435:1;31427:10;;;;;;;;;;;;;;:23;;31419:68;;;::::0;;-1:-1:-1;;;31419:68:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31503:3;-1:-1:-1::0;;;;;31498:17:0::1;;31524:7;31532:1;31524:10;;;;;;;;;;;;;;31498:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;31560:3;-1:-1:-1::0;;;;;31555:18:0::1;;31574:25;31582:4;;31587:1;31582:7;;;;;;31574:25;31601:7;31609:1;31601:10;;;;;;;;;;;;;;31555:57;;;;;;;;;;;;;-1:-1:-1::0;;;;;31555:57:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31555:57:0;31548:65:::1;;;;31624:24;31630:7;31639:4;;31624:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31645:2:0;;-1:-1:-1;31624:5:0::1;::::0;-1:-1:-1;;31624:24:0:i:1;:::-;31711:7;31719:1;31711:10;;;;;;;;;;;;;;31699:9;:22;31695:94;;;31723:66;31754:10;31778:7;31786:1;31778:10;;;;;;;;;;;;;;31766:9;:22;31723:30;:66::i;37148:361::-:0;37343:45;;;-1:-1:-1;;;;;37343:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37343:45:0;-1:-1:-1;;;37343:45:0;;;37332:57;;;;37297:12;;37311:17;;37332:10;;;;37343:45;37332:57;;;37343:45;37332:57;;37343:45;37332:57;;;;;;;;;;-1:-1:-1;;37332:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37296:93;;;;37408:7;:57;;;;-1:-1:-1;37420:11:0;;:16;;:44;;;37451:4;37440:24;;;;;;;;;;;;;;;-1:-1:-1;37440:24:0;37420:44;37400:101;;;;;-1:-1:-1;;;37400:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37148:361;;;;;:::o;37927:197::-;38037:12;;;37997;38037;;;;;;;;;-1:-1:-1;;;;;38014:7:0;;;38030:5;;38014:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38014:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37996:54;;;38069:7;38061:55;;;;-1:-1:-1;;;38061:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37927:197;;;:::o;37517:402::-;37742:51;;;-1:-1:-1;;;;;37742:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37742:51:0;-1:-1:-1;;;37742:51:0;;;37731:63;;;;37696:12;;37710:17;;37731:10;;;;37742:51;37731:63;;;37742:51;37731:63;;37742:51;37731:63;;;;;;;;;;-1:-1:-1;;37731:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37695:99;;;;37813:7;:57;;;;-1:-1:-1;37825:11:0;;:16;;:44;;;37856:4;37845:24;;;;;;;;;;;;;;;-1:-1:-1;37845:24:0;37825:44;37805:106;;;;-1:-1:-1;;;37805:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37517:402;;;;;;:::o;26870:824::-;26977:6;26972:715;27003:1;26989:4;:11;:15;26985:1;:19;26972:715;;;27027:13;27042:14;27061:4;27066:1;27061:7;;;;;;;;;;;;;;27070:4;27075:1;27079;27075:5;27070:11;;;;;;;;;;;;;;27026:56;;;;27098:14;27128:7;-1:-1:-1;;;;;27117:30:0;;27148:5;27155:6;27117:45;;;;;;;;;;;;;-1:-1:-1;;;;;27117:45:0;;;;;;-1:-1:-1;;;;;27117:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27117:45:0;27194:14;;27117:45;;-1:-1:-1;27177:14:0;;27194:7;;27206:1;27202:5;;;27194:14;;;;;;;;;;;;;;;;27227:10;;27194:14;;-1:-1:-1;;;;;;27227:10:0;:24;27223:131;;27284:10;;27272:66;;;-1:-1:-1;;;27272:66:0;;27301:10;27272:66;;;;-1:-1:-1;;;;;27272:66:0;;;;;;;;;;;;;;;;;;;;;;27284:10;;;;;27272:28;;:66;;;;;;;;;;;;;;27284:10;;27272:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27223:131:0;27369:15;27386;27414:6;-1:-1:-1;;;;;27405:15:0;:5;-1:-1:-1;;;;;27405:15:0;;:61;;27447:9;27463:1;27405:61;;;27429:1;27433:9;27405:61;27368:98;;;;27481:10;27512:1;27498:4;:11;:15;27494:1;:19;:56;;27547:3;27494:56;;;27516:28;27524:6;27532:4;27537:1;27541;27537:5;27532:11;;;;;;;;;;;;;;27516:7;:28::i;:::-;27481:69;;27573:22;27581:5;27588:6;27573:7;:22::i;:::-;-1:-1:-1;;;;;27565:36:0;;27620:10;27632;27644:2;27658:1;27648:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27648:12:0;;27565:110;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27565:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27006:3:0;;;;;-1:-1:-1;26972:715:0;;-1:-1:-1;;;;;;;;26972:715:0;;;26870:824;;;:::o;60:106::-;148:10;60:106;:::o;31944:1317::-;32057:6;32052:1202;32083:1;32069:4;:11;:15;32065:1;:19;32052:1202;;;32107:13;32122:14;32141:4;32146:1;32141:7;;;;;;;;;;;;;;32150:4;32155:1;32159;32155:5;32150:11;;;;;;;;;;;;;;32106:56;;;;32178:14;32208:7;-1:-1:-1;;;;;32197:30:0;;32228:5;32235:6;32197:45;;;;;;;;;;;;;-1:-1:-1;;;;;32197:45:0;;;;;;-1:-1:-1;;;;;32197:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32197:45:0;;-1:-1:-1;32257:12:0;32280:22;32288:5;32295:6;32280:7;:22::i;:::-;32257:46;;32318:16;32349:17;32440:13;32455;32473:4;-1:-1:-1;;;;;32473:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32473:18:0;;;;;;;32439:52;;;;;-1:-1:-1;32439:52:0;;-1:-1:-1;32511:17:0;;-1:-1:-1;;;;;32552:15:0;;;;;;;:61;;32594:8;32604;32552:61;;;32571:8;32581;32552:61;32510:103;;;;32646:56;32689:12;32653:5;-1:-1:-1;;;;;32646:23:0;;32678:4;32646:38;;;;;;;;;;;;;-1:-1:-1;;;;;32646:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;:56;32632:70;;32747:7;-1:-1:-1;;;;;32736:32:0;;32769:11;32782:12;32796:13;32736:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32736:74:0;32844:10;;32736:74;;-1:-1:-1;;;;;;32844:10:0;:24;;-1:-1:-1;32840:134:0;;-1:-1:-1;;;32840:134:0;32901:10;;32889:69;;;-1:-1:-1;;;32889:69:0;;32918:10;32889:69;;;;-1:-1:-1;;;;;32889:69:0;;;;;;;;;;;;;;;;;;;;;;32901:10;;;;;32889:28;;:69;;;;;;;;;;;;;;32901:10;;32889:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32840:134:0;32989:15;33006;33034:6;-1:-1:-1;;;;;33025:15:0;:5;-1:-1:-1;;;;;33025:15:0;;:67;;33070:12;33089:1;33025:67;;;33049:1;33053:12;33025:67;32988:104;;;;33107:10;33138:1;33124:4;:11;:15;33120:1;:19;:56;;33173:3;33120:56;;;33142:28;33150:6;33158:4;33163:1;33167;33163:5;33158:11;;;;;;;33142:28;33229:12;;;33239:1;33229:12;;;;;;;;;;-1:-1:-1;;;33191:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;33191:51:0;;;;;;;;;;;;;;;;;;;;;;33107:69;;-1:-1:-1;33191:9:0;;;;;;33201:10;;33213;;33107:69;;33229:12;;33191:51;;;;;;;;33229:12;;33191:51;;;;33229:12;;33191:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32086:3:0;;;;;-1:-1:-1;32052:1202:0;;-1:-1:-1;;;;;;;;;;32052:1202:0;2566:136;2624:7;2651:43;2655:1;2658;2651:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2644:50;2566:136;-1:-1:-1;;;2566:136:0:o;18860:1362::-;19078:12;19092;19228:1;-1:-1:-1;;;;;19173:57:0;19184:7;-1:-1:-1;;;;;19173:27:0;;19201:6;19209;19173:43;;;;;;;;;;;;;-1:-1:-1;;;;;19173:43:0;;;;;;-1:-1:-1;;;;;19173:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19173:43:0;-1:-1:-1;;;;;19173:57:0;;19169:136;;;19258:7;-1:-1:-1;;;;;19247:30:0;;19278:6;19286;19247:46;;;;;;;;;;;;;-1:-1:-1;;;;;19247:46:0;;;;;;-1:-1:-1;;;;;19247:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19169:136:0;19316:13;19331;19359:7;-1:-1:-1;;;;;19348:31:0;;19380:6;19388;19348:47;;;;;;;;;;;;;-1:-1:-1;;;;;19348:47:0;;;;;;-1:-1:-1;;;;;19348:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19348:47:0;;;;;;;;;-1:-1:-1;19348:47:0;-1:-1:-1;19410:13:0;;:30;;;;-1:-1:-1;19427:13:0;;19410:30;19406:809;;;19479:14;;-1:-1:-1;19495:14:0;;-1:-1:-1;19406:809:0;;;19543:19;19576:7;-1:-1:-1;;;;;19565:25:0;;19591:14;19607:8;19617;19565:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19565:61:0;;-1:-1:-1;19645:32:0;;;19641:563;;19724:10;19706:14;:28;;19698:72;;;;;-1:-1:-1;;;19698:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19811:14;;-1:-1:-1;19827:14:0;-1:-1:-1;19827:14:0;19641:563;;;19883:19;19916:7;-1:-1:-1;;;;;19905:25:0;;19931:14;19947:8;19957;19905:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19905:61:0;;-1:-1:-1;19992:32:0;;;;19985:40;;;;20070:10;20052:14;:28;;20044:72;;;;;-1:-1:-1;;;20044:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20157:14;-1:-1:-1;20173:14:0;;-1:-1:-1;19641:563:0;19406:809;;18860:1362;;;;;;;;;;;:::o;2710:192::-;2796:7;2832:12;2824:6;;;;2816:29;;;;-1:-1:-1;;;2816:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2868:5:0;;;2710:192::o

Swarm Source

ipfs://aae879dcdfbc926a97b0a4887b576bd29ef42d948f1aecde541f63f4c7dd1d65
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading