{
  "_format": "hh-sol-artifact-1",
  "contractName": "TokenPaymaster",
  "sourceName": "contracts/samples/TokenPaymaster.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract IERC20Metadata",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "contract IEntryPoint",
          "name": "_entryPoint",
          "type": "address"
        },
        {
          "internalType": "contract IERC20",
          "name": "_wrappedNative",
          "type": "address"
        },
        {
          "internalType": "contract ISwapRouter",
          "name": "_uniswap",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "priceMarkup",
              "type": "uint256"
            },
            {
              "internalType": "uint128",
              "name": "minEntryPointBalance",
              "type": "uint128"
            },
            {
              "internalType": "uint48",
              "name": "refundPostopCost",
              "type": "uint48"
            },
            {
              "internalType": "uint48",
              "name": "priceMaxAge",
              "type": "uint48"
            }
          ],
          "internalType": "struct TokenPaymaster.TokenPaymasterConfig",
          "name": "_tokenPaymasterConfig",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint48",
              "name": "cacheTimeToLive",
              "type": "uint48"
            },
            {
              "internalType": "uint48",
              "name": "maxOracleRoundAge",
              "type": "uint48"
            },
            {
              "internalType": "contract IOracle",
              "name": "tokenOracle",
              "type": "address"
            },
            {
              "internalType": "contract IOracle",
              "name": "nativeOracle",
              "type": "address"
            },
            {
              "internalType": "bool",
              "name": "tokenToNativeOracle",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "tokenOracleReverse",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "nativeOracleReverse",
              "type": "bool"
            },
            {
              "internalType": "uint256",
              "name": "priceUpdateThreshold",
              "type": "uint256"
            }
          ],
          "internalType": "struct OracleHelper.OracleHelperConfig",
          "name": "_oracleHelperConfig",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "minSwapAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint24",
              "name": "uniswapPoolFee",
              "type": "uint24"
            },
            {
              "internalType": "uint8",
              "name": "slippage",
              "type": "uint8"
            }
          ],
          "internalType": "struct UniswapHelper.UniswapHelperConfig",
          "name": "_uniswapHelperConfig",
          "type": "tuple"
        },
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "AddressInsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedInnerCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "OwnableInvalidOwner",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "OwnableUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "priceMarkup",
              "type": "uint256"
            },
            {
              "internalType": "uint128",
              "name": "minEntryPointBalance",
              "type": "uint128"
            },
            {
              "internalType": "uint48",
              "name": "refundPostopCost",
              "type": "uint48"
            },
            {
              "internalType": "uint48",
              "name": "priceMaxAge",
              "type": "uint48"
            }
          ],
          "indexed": false,
          "internalType": "struct TokenPaymaster.TokenPaymasterConfig",
          "name": "tokenPaymasterConfig",
          "type": "tuple"
        }
      ],
      "name": "ConfigUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Received",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "currentPrice",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "previousPrice",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "cachedPriceTimestamp",
          "type": "uint256"
        }
      ],
      "name": "TokenPriceUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "tokenIn",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "tokenOut",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountIn",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountOutMin",
          "type": "uint256"
        }
      ],
      "name": "UniswapReverted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "actualTokenCharge",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "actualGasCost",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "actualTokenPriceWithMarkup",
          "type": "uint256"
        }
      ],
      "name": "UserOperationSponsored",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "unstakeDelaySec",
          "type": "uint32"
        }
      ],
      "name": "addStake",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "cachedPrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "cachedPriceTimestamp",
      "outputs": [
        {
          "internalType": "uint48",
          "name": "",
          "type": "uint48"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "deposit",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "entryPoint",
      "outputs": [
        {
          "internalType": "contract IEntryPoint",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum IPaymaster.PostOpMode",
          "name": "mode",
          "type": "uint8"
        },
        {
          "internalType": "bytes",
          "name": "context",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "actualGasCost",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "actualUserOpFeePerGas",
          "type": "uint256"
        }
      ],
      "name": "postOp",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "priceMarkup",
              "type": "uint256"
            },
            {
              "internalType": "uint128",
              "name": "minEntryPointBalance",
              "type": "uint128"
            },
            {
              "internalType": "uint48",
              "name": "refundPostopCost",
              "type": "uint48"
            },
            {
              "internalType": "uint48",
              "name": "priceMaxAge",
              "type": "uint48"
            }
          ],
          "internalType": "struct TokenPaymaster.TokenPaymasterConfig",
          "name": "_tokenPaymasterConfig",
          "type": "tuple"
        }
      ],
      "name": "setTokenPaymasterConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "minSwapAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint24",
              "name": "uniswapPoolFee",
              "type": "uint24"
            },
            {
              "internalType": "uint8",
              "name": "slippage",
              "type": "uint8"
            }
          ],
          "internalType": "struct UniswapHelper.UniswapHelperConfig",
          "name": "_uniswapHelperConfig",
          "type": "tuple"
        }
      ],
      "name": "setUniswapConfiguration",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "tokenPaymasterConfig",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "priceMarkup",
          "type": "uint256"
        },
        {
          "internalType": "uint128",
          "name": "minEntryPointBalance",
          "type": "uint128"
        },
        {
          "internalType": "uint48",
          "name": "refundPostopCost",
          "type": "uint48"
        },
        {
          "internalType": "uint48",
          "name": "priceMaxAge",
          "type": "uint48"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        }
      ],
      "name": "tokenToWei",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "uniswap",
      "outputs": [
        {
          "internalType": "contract ISwapRouter",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unlockStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "force",
          "type": "bool"
        }
      ],
      "name": "updateCachedPrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "sender",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "nonce",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "initCode",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "callData",
              "type": "bytes"
            },
            {
              "internalType": "bytes32",
              "name": "accountGasLimits",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "preVerificationGas",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "gasFees",
              "type": "bytes32"
            },
            {
              "internalType": "bytes",
              "name": "paymasterAndData",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "signature",
              "type": "bytes"
            }
          ],
          "internalType": "struct PackedUserOperation",
          "name": "userOp",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "userOpHash",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "maxCost",
          "type": "uint256"
        }
      ],
      "name": "validatePaymasterUserOp",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "context",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "validationData",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        }
      ],
      "name": "weiToToken",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address payable",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "withdrawEth",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address payable",
          "name": "withdrawAddress",
          "type": "address"
        }
      ],
      "name": "withdrawStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address payable",
          "name": "withdrawAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "withdrawTo",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "withdrawToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "wrappedNative",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "bytecode": "0x6101006040523480156200001257600080fd5b50604051620034fe380380620034fe83398101604081905262000035916200099d565b82888787858b33806200006357604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6200006e816200018b565b506200007a81620001db565b6001600160a01b0390811660805260405163095ea7b360e01b8152838216600482015260001960248201529085169063095ea7b3906044016020604051808303816000875af1158015620000d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000f8919062000ab3565b506001600160a01b0380851660c05283811660e052821660a0526200015081805160015560208101516002805460409093015160ff1663010000000263ffffffff1990931662ffffff90921691909117919091179055565b505060001960035550620001669050816200029e565b5062000172846200059c565b6200017d8162000729565b505050505050505062000c36565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516301ffc9a760e01b815263122a0e9b60e31b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa15801562000227573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024d919062000ab3565b6200029b5760405162461bcd60e51b815260206004820152601e60248201527f49456e747279506f696e7420696e74657266616365206d69736d61746368000060448201526064016200005a565b50565b805160058054602084015160408501516001600160a01b039081166c01000000000000000000000000026001600160601b0365ffffffffffff9384166601000000000000026001600160601b031990951693909616929092179290921793909316929092179055606082015160068054608085015160a086015160c08701511515600160b01b0260ff60b01b19911515600160a81b029190911661ffff60a81b19921515600160a01b026001600160a81b0319909416959096169490941791909117169290921717905560e081015160078190556a52b7d2dcc80cd2e40000001015620003ce5760405162461bcd60e51b815260206004820152601e60248201527f54504d3a20757064617465207468726573686f6c6420746f6f2068696768000060448201526064016200005a565b6005600001600c9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000425573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200044b919062000ad8565b6200045890600a62000c0b565b600880546001600160801b0319166001600160801b0392909216919091179055600654600160a01b900460ff1615620004fe576006546001600160a01b031615620004e65760405162461bcd60e51b815260206004820152601f60248201527f54504d3a206e6174697665206f7261636c65206d757374206265207a65726f0060448201526064016200005a565b600880546001600160801b0316600160801b17905550565b6006546040805163313ce56760e01b815290516001600160a01b039092169163313ce567916004808201926020929091908290030181865afa15801562000549573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200056f919062000ad8565b6200057c90600a62000c0b565b600880546001600160801b03928316600160801b02921691909117905550565b620005a66200076a565b620005be6a52b7d2dcc80cd2e4000000600262000c1c565b81511115620006105760405162461bcd60e51b815260206004820152601a60248201527f54504d3a207072696365206d61726b757020746f6f206869676800000000000060448201526064016200005a565b80516a52b7d2dcc80cd2e400000011156200066e5760405162461bcd60e51b815260206004820152601960248201527f54504d3a207072696365206d61726b757020746f6f206c6f770000000000000060448201526064016200005a565b8051600981905560208083018051600a8054604080880180516060808b01805165ffffffffffff908116600160b01b0265ffffffffffff60b01b19948216600160801b026001600160b01b03199098166001600160801b039a8b161797909717939093169590951790955582519889529551909416958701959095529151831685850152905190911690830152517fcd938817f1c47094d43be3d07e8c67e11766db2e11a2b4376e7ee937b15793a29181900360800190a150565b620007336200076a565b6001600160a01b0381166200075f57604051631e4fbdf760e01b8152600060048201526024016200005a565b6200029b816200018b565b6000546001600160a01b03163314620007995760405163118cdaa760e01b81523360048201526024016200005a565b565b6001600160a01b03811681146200029b57600080fd5b604051608081016001600160401b0381118282101715620007e257634e487b7160e01b600052604160045260246000fd5b60405290565b805165ffffffffffff81168114620007ff57600080fd5b919050565b8051620007ff816200079b565b80518015158114620007ff57600080fd5b60006101008083850312156200083757600080fd5b604051908101906001600160401b03821181831017156200086857634e487b7160e01b600052604160045260246000fd5b816040528092506200087a84620007e8565b81526200088a60208501620007e8565b602082015260408401519150620008a1826200079b565b816040820152620008b56060850162000804565b6060820152620008c86080850162000811565b6080820152620008db60a0850162000811565b60a0820152620008ee60c0850162000811565b60c082015260e084015160e0820152505092915050565b805160ff81168114620007ff57600080fd5b6000606082840312156200092a57600080fd5b604051606081016001600160401b03811182821017156200095b57634e487b7160e01b600052604160045260246000fd5b806040525080915082518152602083015162ffffff811681146200097e57600080fd5b6020820152620009916040840162000905565b60408201525092915050565b600080600080600080600080888a03610280811215620009bc57600080fd5b8951620009c9816200079b565b60208b0151909950620009dc816200079b565b60408b0151909850620009ef816200079b565b60608b015190975062000a02816200079b565b95506080607f198201121562000a1757600080fd5b5062000a22620007b1565b60808a0151815260a08a01516001600160801b038116811462000a4457600080fd5b602082015262000a5760c08b01620007e8565b604082015262000a6a60e08b01620007e8565b6060820152935062000a818a6101008b0162000822565b925062000a938a6102008b0162000917565b915062000aa46102608a0162000804565b90509295985092959890939650565b60006020828403121562000ac657600080fd5b62000ad18262000811565b9392505050565b60006020828403121562000aeb57600080fd5b62000ad18262000905565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000b4d57816000190482111562000b315762000b3162000af6565b8085161562000b3f57918102915b93841c939080029062000b11565b509250929050565b60008262000b665750600162000c05565b8162000b755750600062000c05565b816001811462000b8e576002811462000b995762000bb9565b600191505062000c05565b60ff84111562000bad5762000bad62000af6565b50506001821b62000c05565b5060208310610133831016604e8410600b841016171562000bde575081810a62000c05565b62000bea838362000b0c565b806000190482111562000c015762000c0162000af6565b0290505b92915050565b600062000ad160ff84168362000b55565b808202811582820484141762000c055762000c0562000af6565b60805160a05160c05160e05161281762000ce76000396000818161053f0152611cf50152600081816105c901528181610aaa015281816115d0015281816117b7015281816117f10152611ab001526000818161024201528181611d610152611e110152600081816103bc01528181610627015281816107cd01528181610b4101528181610c0e01528181610c9801528181610d4b0152818161139a01528181611a0a0152611b0e01526128176000f3fe60806040526004361061019a5760003560e01c8063b0d691fe116100e1578063d7a23b3c1161008a578063f14d64ed11610064578063f14d64ed14610561578063f2fde38b14610581578063f60fdcb3146105a1578063fc0c546a146105b757600080fd5b8063d7a23b3c146104d7578063e1d8153c146104f7578063eb6d3a111461052d57600080fd5b8063c399ec88116100bb578063c399ec8814610413578063cb721cfd14610428578063d0e30db0146104cf57600080fd5b8063b0d691fe146103aa578063bb9fe6bf146103de578063c23a5cea146103f357600080fd5b8063715018a6116101435780638da5cb5b1161011d5780638da5cb5b1461033f5780639e281a981461036a578063a0840fa71461038a57600080fd5b8063715018a6146102ea5780637c627b21146102ff5780637c986aac1461031f57600080fd5b80632681f7e4116101745780632681f7e4146102305780633ba9290f1461028e57806352b7512c146102bc57600080fd5b80630396cb60146101db5780631b9a91a4146101f0578063205c28781461021057600080fd5b366101d65760405134815233907f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258749060200160405180910390a2005b600080fd5b6101ee6101e936600461212f565b6105eb565b005b3480156101fc57600080fd5b506101ee61020b366004612177565b61069d565b34801561021c57600080fd5b506101ee61022b366004612177565b610779565b34801561023c57600080fd5b506102647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561029a57600080fd5b506102ae6102a93660046121b1565b610811565b604051908152602001610285565b3480156102c857600080fd5b506102dc6102d73660046121ce565b610a1f565b604051610285929190612246565b3480156102f657600080fd5b506101ee610a42565b34801561030b57600080fd5b506101ee61031a36600461229f565b610a56565b34801561032b57600080fd5b506102ae61033a366004612337565b610a72565b34801561034b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610264565b34801561037657600080fd5b506101ee610385366004612177565b610a9d565b34801561039657600080fd5b506101ee6103a5366004612359565b610ad4565b3480156103b657600080fd5b506102647f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ea57600080fd5b506101ee610b37565b3480156103ff57600080fd5b506101ee61040e3660046123f7565b610bc1565b34801561041f57600080fd5b506102ae610c67565b34801561043457600080fd5b50600954600a5461049091906fffffffffffffffffffffffffffffffff81169065ffffffffffff700100000000000000000000000000000000820481169176010000000000000000000000000000000000000000000090041684565b604080519485526fffffffffffffffffffffffffffffffff909316602085015265ffffffffffff91821692840192909252166060820152608001610285565b6101ee610d1d565b3480156104e357600080fd5b506102ae6104f2366004612337565b610da5565b34801561050357600080fd5b506004546105169065ffffffffffff1681565b60405165ffffffffffff9091168152602001610285565b34801561053957600080fd5b506102647f000000000000000000000000000000000000000000000000000000000000000081565b34801561056d57600080fd5b506101ee61057c36600461242f565b610dbd565b34801561058d57600080fd5b506101ee61059c3660046123f7565b610fcd565b3480156105ad57600080fd5b506102ae60035481565b3480156105c357600080fd5b506102647f000000000000000000000000000000000000000000000000000000000000000081565b6105f361102e565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561068157600080fd5b505af1158015610695573d6000803e3d6000fd5b505050505050565b6106a561102e565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146106ff576040519150601f19603f3d011682016040523d82523d6000602084013e610704565b606091505b5050905080610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7769746864726177206661696c6564000000000000000000000000000000000060448201526064015b60405180910390fd5b505050565b61078161102e565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561068157600080fd5b60055460045460009165ffffffffffff908116918391610832911642612512565b9050831580156108425750818111155b1561085257505060035492915050565b6007546005546006546003546c0100000000000000000000000090920473ffffffffffffffffffffffffffffffffffffffff90811692911690600061089684611081565b60065490915060019074010000000000000000000000000000000000000000900460ff166108ca576108c784611081565b90505b600654600090610916908490849060ff7501000000000000000000000000000000000000000000820481169176010000000000000000000000000000000000000000000090041661127f565b9050600084610930836a52b7d2dcc80cd2e4000000612525565b61093a919061256b565b905060008c8061095d575061095a896a52b7d2dcc80cd2e40000006125a6565b82115b8061097b5750610978896a52b7d2dcc80cd2e4000000612512565b82105b9050806109935750939b9a5050505050505050505050565b6003839055600480547fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000164265ffffffffffff169081179091556040805185815260208101899052908101919091527ed4fe314618b73a96886b87817a53a5ed51433b0234c85a5e9dafe2cb7b88429060600160405180910390a150909b9a5050505050505050505050565b60606000610a2b611382565b610a36858585611421565b91509150935093915050565b610a4a61102e565b610a5460006116bd565b565b610a5e611382565b610a6b8585858585611732565b5050505050565b600081610a8a6a52b7d2dcc80cd2e400000085612525565b610a94919061256b565b90505b92915050565b610aa561102e565b610ad07f0000000000000000000000000000000000000000000000000000000000000000838361188a565b5050565b610adc61102e565b610b3481805160015560208101516002805460409093015160ff166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090931662ffffff90921691909117919091179055565b50565b610b3f61102e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050565b610bc961102e565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea906024015b600060405180830381600087803b158015610c5357600080fd5b505af1158015610a6b573d6000803e3d6000fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1891906125b9565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b158015610c5357600080fd5b60006a52b7d2dcc80cd2e4000000610a8a8385612525565b610dc561102e565b610ddb6a52b7d2dcc80cd2e40000006002612525565b81511115610e45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f54504d3a207072696365206d61726b757020746f6f2068696768000000000000604482015260640161076b565b80516a52b7d2dcc80cd2e40000001115610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f54504d3a207072696365206d61726b757020746f6f206c6f7700000000000000604482015260640161076b565b8051600981905560208083018051600a8054604080880180516060808b01805165ffffffffffff908116760100000000000000000000000000000000000000000000027fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff948216700100000000000000000000000000000000027fffffffffffffffffffff000000000000000000000000000000000000000000009098166fffffffffffffffffffffffffffffffff9a8b161797909717939093169590951790955582519889529551909416958701959095529151831685850152905190911690830152517fcd938817f1c47094d43be3d07e8c67e11766db2e11a2b4376e7ee937b15793a29181900360800190a150565b610fd561102e565b73ffffffffffffffffffffffffffffffffffffffff8116611025576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526000600482015260240161076b565b610b34816116bd565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a54576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161076b565b60008060008060008573ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156110d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f891906125ec565b9450945050935093506000831361116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f54504d3a20436861696e6c696e6b207072696365203c3d203000000000000000604482015260640161076b565b60055461118a906601000000000000900465ffffffffffff1642612512565b8210156111f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f54504d3a20496e636f6d706c65746520726f756e640000000000000000000000604482015260640161076b565b8369ffffffffffffffffffff168169ffffffffffffffffffff161015611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f54504d3a205374616c6520707269636500000000000000000000000000000000604482015260640161076b565b5090949350505050565b600082156112c45760085485906112b3906fffffffffffffffffffffffffffffffff166a52b7d2dcc80cd2e4000000612525565b6112bd919061256b565b94506112fb565b6008546fffffffffffffffffffffffffffffffff166112ee866a52b7d2dcc80cd2e4000000612525565b6112f8919061256b565b94505b81156113455760085470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166113348686612525565b61133e919061256b565b905061137a565b60085484906113349070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1687612525565b949350505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610a54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e740000000000000000000000604482015260640161076b565b60095460609060009081603461143a60e089018961263c565b9050039050806000148061144e5750806020145b6114b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f54504d3a20696e76616c69642064617461206c656e6774680000000000000000604482015260640161076b565b60006114bf8861190b565b600a54909150700100000000000000000000000000000000900465ffffffffffff166114ea89611929565b8110611552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f54504d3a20706f73744f704761734c696d697420746f6f206c6f770000000000604482015260640161076b565b6000828202880190506000856a52b7d2dcc80cd2e4000000600354028161157b5761157b61253c565b049050846020036115bd57600061159560e08d018d61263c565b6115a4916054916034916126a8565b6115ad916126d2565b9050818110156115bb578091505b505b60006115c98383610a72565b90506116037f00000000000000000000000000000000000000000000000000000000000000006115fc60208f018f6123f7565b3084611959565b8061161160208e018e6123f7565b60405160200161164192919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052600a54600454919a506116ac91600091760100000000000000000000000000000000000000000000900465ffffffffffff9081169116018161199f565b975050505050505050935093915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546000806117448688018861270e565b9150915060006117546000610811565b90506000846a52b7d2dcc80cd2e40000008302816117745761177461253c565b600a549190049150700100000000000000000000000000000000900465ffffffffffff168602870160006117a88284610a72565b9050808611156117e4576117df7f00000000000000000000000000000000000000000000000000000000000000008683890361188a565b61181a565b8086101561181a5761181a7f00000000000000000000000000000000000000000000000000000000000000008630898503611959565b60408051828152602081018b905290810184905273ffffffffffffffffffffffffffffffffffffffff8616907f46caa0511cf037f06f57a0bf273a2ff04229f5b12fb04675234a6cbe2e7f1a899060600160405180910390a261187c846119d9565b505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83811660248301526044820183905261077491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b86565b60006fffffffffffffffffffffffffffffffff60c083013516610a97565b600061193860e083018361263c565b611947916034916024916126a8565b6119509161273e565b60801c92915050565b60405173ffffffffffffffffffffffffffffffffffffffff8481166024830152838116604483015260648201839052610bbb9186918216906323b872dd906084016118c4565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b856119c75760006119ca565b60015b60ff16171790505b9392505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8a91906125b9565b600a549091506fffffffffffffffffffffffffffffffff16811015610ad0576000611ad57f000000000000000000000000000000000000000000000000000000000000000084611c1c565b9050611ae081611d2c565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99047906024016000604051808303818588803b158015611b6857600080fd5b505af1158015611b7c573d6000803e3d6000fd5b5050505050505050565b6000611ba873ffffffffffffffffffffffffffffffffffffffff841683611da5565b90508051600014158015611bcd575080806020019051810190611bcb9190612786565b155b15610774576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260240161076b565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611caf91906125b9565b90506000611cd2611cc08386610da5565b6002546301000000900460ff16611db3565b600154909150811015611cea57600092505050610a97565b600254611d239086907f0000000000000000000000000000000000000000000000000000000000000000908590859062ffffff16611dd3565b95945050505050565b6040517f49404b7c000000000000000000000000000000000000000000000000000000008152600481018290523060248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906349404b7c90604401610c39565b6060610a9483836000611f9b565b60006103e8611dc560ff8416826127a3565b610a8a9061ffff1685612525565b604080516101008101825273ffffffffffffffffffffffffffffffffffffffff87811682528681166020830190815262ffffff8581168486019081527f0000000000000000000000000000000000000000000000000000000000000000841660608601818152426080880190815260a088018c815260c089018c8152600060e08b018181529b517f414bf3890000000000000000000000000000000000000000000000000000000081528b518b16600482015298518a1660248a0152955190961660448801529151871660648701525160848601525160a4850152915160c4840152945190921660e482015263414bf38990610104016020604051808303816000875af1925050508015611f22575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f1f918101906125b9565b60015b611f8e576040805173ffffffffffffffffffffffffffffffffffffffff808a16825288166020820152908101869052606081018590527ff7edd4c6ec425decf715a8b8eaa3b65d3d86e31ad0ff750aa60fa834190f515f9060800160405180910390a160009150611f91565b91505b5095945050505050565b606081471015611fd9576040517fcd78605900000000000000000000000000000000000000000000000000000000815230600482015260240161076b565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161200291906127c5565b60006040518083038185875af1925050503d806000811461203f576040519150601f19603f3d011682016040523d82523d6000602084013e612044565b606091505b509150915061205486838361205e565b9695505050505050565b6060826120735761206e826120ed565b6119d2565b8151158015612097575073ffffffffffffffffffffffffffffffffffffffff84163b155b156120e6576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161076b565b50806119d2565b8051156120fd5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561214157600080fd5b813563ffffffff811681146119d257600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610b3457600080fd5b6000806040838503121561218a57600080fd5b823561219581612155565b946020939093013593505050565b8015158114610b3457600080fd5b6000602082840312156121c357600080fd5b81356119d2816121a3565b6000806000606084860312156121e357600080fd5b833567ffffffffffffffff8111156121fa57600080fd5b8401610120818703121561220d57600080fd5b95602085013595506040909401359392505050565b60005b8381101561223d578181015183820152602001612225565b50506000910152565b6040815260008351806040840152612265816060850160208801612222565b602083019390935250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b6000806000806000608086880312156122b757600080fd5b8535600381106122c657600080fd5b9450602086013567ffffffffffffffff808211156122e357600080fd5b818801915088601f8301126122f757600080fd5b81358181111561230657600080fd5b89602082850101111561231857600080fd5b9699602092909201985095966040810135965060600135945092505050565b6000806040838503121561234a57600080fd5b50508035926020909101359150565b60006060828403121561236b57600080fd5b6040516060810181811067ffffffffffffffff821117156123b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282358152602083013562ffffff811681146123d257600080fd5b6020820152604083013560ff811681146123eb57600080fd5b60408201529392505050565b60006020828403121561240957600080fd5b81356119d281612155565b803565ffffffffffff8116811461242a57600080fd5b919050565b60006080828403121561244157600080fd5b6040516080810181811067ffffffffffffffff8211171561248b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528235815260208301356fffffffffffffffffffffffffffffffff811681146124b557600080fd5b60208201526124c660408401612414565b60408201526124d760608401612414565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610a9757610a976124e3565b8082028115828204841417610a9757610a976124e3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826125a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115610a9757610a976124e3565b6000602082840312156125cb57600080fd5b5051919050565b805169ffffffffffffffffffff8116811461242a57600080fd5b600080600080600060a0868803121561260457600080fd5b61260d866125d2565b9450602086015193506040860151925060608601519150612630608087016125d2565b90509295509295909350565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261267157600080fd5b83018035915067ffffffffffffffff82111561268c57600080fd5b6020019150368190038213156126a157600080fd5b9250929050565b600080858511156126b857600080fd5b838611156126c557600080fd5b5050820193919092039150565b80356020831015610a97577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b6000806040838503121561272157600080fd5b82359150602083013561273381612155565b809150509250929050565b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000813581811691601085101561277e5780818660100360031b1b83161692505b505092915050565b60006020828403121561279857600080fd5b81516119d2816121a3565b61ffff8281168282160390808211156127be576127be6124e3565b5092915050565b600082516127d7818460208701612222565b919091019291505056fea2646970667358221220dbce82cc867ef768bacc89d7139e557f7b2f8478314e8b57234acb574df4ccb164736f6c63430008170033",
  "deployedBytecode": "0x60806040526004361061019a5760003560e01c8063b0d691fe116100e1578063d7a23b3c1161008a578063f14d64ed11610064578063f14d64ed14610561578063f2fde38b14610581578063f60fdcb3146105a1578063fc0c546a146105b757600080fd5b8063d7a23b3c146104d7578063e1d8153c146104f7578063eb6d3a111461052d57600080fd5b8063c399ec88116100bb578063c399ec8814610413578063cb721cfd14610428578063d0e30db0146104cf57600080fd5b8063b0d691fe146103aa578063bb9fe6bf146103de578063c23a5cea146103f357600080fd5b8063715018a6116101435780638da5cb5b1161011d5780638da5cb5b1461033f5780639e281a981461036a578063a0840fa71461038a57600080fd5b8063715018a6146102ea5780637c627b21146102ff5780637c986aac1461031f57600080fd5b80632681f7e4116101745780632681f7e4146102305780633ba9290f1461028e57806352b7512c146102bc57600080fd5b80630396cb60146101db5780631b9a91a4146101f0578063205c28781461021057600080fd5b366101d65760405134815233907f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258749060200160405180910390a2005b600080fd5b6101ee6101e936600461212f565b6105eb565b005b3480156101fc57600080fd5b506101ee61020b366004612177565b61069d565b34801561021c57600080fd5b506101ee61022b366004612177565b610779565b34801561023c57600080fd5b506102647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561029a57600080fd5b506102ae6102a93660046121b1565b610811565b604051908152602001610285565b3480156102c857600080fd5b506102dc6102d73660046121ce565b610a1f565b604051610285929190612246565b3480156102f657600080fd5b506101ee610a42565b34801561030b57600080fd5b506101ee61031a36600461229f565b610a56565b34801561032b57600080fd5b506102ae61033a366004612337565b610a72565b34801561034b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610264565b34801561037657600080fd5b506101ee610385366004612177565b610a9d565b34801561039657600080fd5b506101ee6103a5366004612359565b610ad4565b3480156103b657600080fd5b506102647f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ea57600080fd5b506101ee610b37565b3480156103ff57600080fd5b506101ee61040e3660046123f7565b610bc1565b34801561041f57600080fd5b506102ae610c67565b34801561043457600080fd5b50600954600a5461049091906fffffffffffffffffffffffffffffffff81169065ffffffffffff700100000000000000000000000000000000820481169176010000000000000000000000000000000000000000000090041684565b604080519485526fffffffffffffffffffffffffffffffff909316602085015265ffffffffffff91821692840192909252166060820152608001610285565b6101ee610d1d565b3480156104e357600080fd5b506102ae6104f2366004612337565b610da5565b34801561050357600080fd5b506004546105169065ffffffffffff1681565b60405165ffffffffffff9091168152602001610285565b34801561053957600080fd5b506102647f000000000000000000000000000000000000000000000000000000000000000081565b34801561056d57600080fd5b506101ee61057c36600461242f565b610dbd565b34801561058d57600080fd5b506101ee61059c3660046123f7565b610fcd565b3480156105ad57600080fd5b506102ae60035481565b3480156105c357600080fd5b506102647f000000000000000000000000000000000000000000000000000000000000000081565b6105f361102e565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561068157600080fd5b505af1158015610695573d6000803e3d6000fd5b505050505050565b6106a561102e565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146106ff576040519150601f19603f3d011682016040523d82523d6000602084013e610704565b606091505b5050905080610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7769746864726177206661696c6564000000000000000000000000000000000060448201526064015b60405180910390fd5b505050565b61078161102e565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561068157600080fd5b60055460045460009165ffffffffffff908116918391610832911642612512565b9050831580156108425750818111155b1561085257505060035492915050565b6007546005546006546003546c0100000000000000000000000090920473ffffffffffffffffffffffffffffffffffffffff90811692911690600061089684611081565b60065490915060019074010000000000000000000000000000000000000000900460ff166108ca576108c784611081565b90505b600654600090610916908490849060ff7501000000000000000000000000000000000000000000820481169176010000000000000000000000000000000000000000000090041661127f565b9050600084610930836a52b7d2dcc80cd2e4000000612525565b61093a919061256b565b905060008c8061095d575061095a896a52b7d2dcc80cd2e40000006125a6565b82115b8061097b5750610978896a52b7d2dcc80cd2e4000000612512565b82105b9050806109935750939b9a5050505050505050505050565b6003839055600480547fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000164265ffffffffffff169081179091556040805185815260208101899052908101919091527ed4fe314618b73a96886b87817a53a5ed51433b0234c85a5e9dafe2cb7b88429060600160405180910390a150909b9a5050505050505050505050565b60606000610a2b611382565b610a36858585611421565b91509150935093915050565b610a4a61102e565b610a5460006116bd565b565b610a5e611382565b610a6b8585858585611732565b5050505050565b600081610a8a6a52b7d2dcc80cd2e400000085612525565b610a94919061256b565b90505b92915050565b610aa561102e565b610ad07f0000000000000000000000000000000000000000000000000000000000000000838361188a565b5050565b610adc61102e565b610b3481805160015560208101516002805460409093015160ff166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090931662ffffff90921691909117919091179055565b50565b610b3f61102e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050565b610bc961102e565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea906024015b600060405180830381600087803b158015610c5357600080fd5b505af1158015610a6b573d6000803e3d6000fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1891906125b9565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b158015610c5357600080fd5b60006a52b7d2dcc80cd2e4000000610a8a8385612525565b610dc561102e565b610ddb6a52b7d2dcc80cd2e40000006002612525565b81511115610e45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f54504d3a207072696365206d61726b757020746f6f2068696768000000000000604482015260640161076b565b80516a52b7d2dcc80cd2e40000001115610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f54504d3a207072696365206d61726b757020746f6f206c6f7700000000000000604482015260640161076b565b8051600981905560208083018051600a8054604080880180516060808b01805165ffffffffffff908116760100000000000000000000000000000000000000000000027fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff948216700100000000000000000000000000000000027fffffffffffffffffffff000000000000000000000000000000000000000000009098166fffffffffffffffffffffffffffffffff9a8b161797909717939093169590951790955582519889529551909416958701959095529151831685850152905190911690830152517fcd938817f1c47094d43be3d07e8c67e11766db2e11a2b4376e7ee937b15793a29181900360800190a150565b610fd561102e565b73ffffffffffffffffffffffffffffffffffffffff8116611025576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526000600482015260240161076b565b610b34816116bd565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a54576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161076b565b60008060008060008573ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156110d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f891906125ec565b9450945050935093506000831361116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f54504d3a20436861696e6c696e6b207072696365203c3d203000000000000000604482015260640161076b565b60055461118a906601000000000000900465ffffffffffff1642612512565b8210156111f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f54504d3a20496e636f6d706c65746520726f756e640000000000000000000000604482015260640161076b565b8369ffffffffffffffffffff168169ffffffffffffffffffff161015611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f54504d3a205374616c6520707269636500000000000000000000000000000000604482015260640161076b565b5090949350505050565b600082156112c45760085485906112b3906fffffffffffffffffffffffffffffffff166a52b7d2dcc80cd2e4000000612525565b6112bd919061256b565b94506112fb565b6008546fffffffffffffffffffffffffffffffff166112ee866a52b7d2dcc80cd2e4000000612525565b6112f8919061256b565b94505b81156113455760085470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166113348686612525565b61133e919061256b565b905061137a565b60085484906113349070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1687612525565b949350505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610a54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e740000000000000000000000604482015260640161076b565b60095460609060009081603461143a60e089018961263c565b9050039050806000148061144e5750806020145b6114b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f54504d3a20696e76616c69642064617461206c656e6774680000000000000000604482015260640161076b565b60006114bf8861190b565b600a54909150700100000000000000000000000000000000900465ffffffffffff166114ea89611929565b8110611552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f54504d3a20706f73744f704761734c696d697420746f6f206c6f770000000000604482015260640161076b565b6000828202880190506000856a52b7d2dcc80cd2e4000000600354028161157b5761157b61253c565b049050846020036115bd57600061159560e08d018d61263c565b6115a4916054916034916126a8565b6115ad916126d2565b9050818110156115bb578091505b505b60006115c98383610a72565b90506116037f00000000000000000000000000000000000000000000000000000000000000006115fc60208f018f6123f7565b3084611959565b8061161160208e018e6123f7565b60405160200161164192919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052600a54600454919a506116ac91600091760100000000000000000000000000000000000000000000900465ffffffffffff9081169116018161199f565b975050505050505050935093915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546000806117448688018861270e565b9150915060006117546000610811565b90506000846a52b7d2dcc80cd2e40000008302816117745761177461253c565b600a549190049150700100000000000000000000000000000000900465ffffffffffff168602870160006117a88284610a72565b9050808611156117e4576117df7f00000000000000000000000000000000000000000000000000000000000000008683890361188a565b61181a565b8086101561181a5761181a7f00000000000000000000000000000000000000000000000000000000000000008630898503611959565b60408051828152602081018b905290810184905273ffffffffffffffffffffffffffffffffffffffff8616907f46caa0511cf037f06f57a0bf273a2ff04229f5b12fb04675234a6cbe2e7f1a899060600160405180910390a261187c846119d9565b505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83811660248301526044820183905261077491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b86565b60006fffffffffffffffffffffffffffffffff60c083013516610a97565b600061193860e083018361263c565b611947916034916024916126a8565b6119509161273e565b60801c92915050565b60405173ffffffffffffffffffffffffffffffffffffffff8481166024830152838116604483015260648201839052610bbb9186918216906323b872dd906084016118c4565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b856119c75760006119ca565b60015b60ff16171790505b9392505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8a91906125b9565b600a549091506fffffffffffffffffffffffffffffffff16811015610ad0576000611ad57f000000000000000000000000000000000000000000000000000000000000000084611c1c565b9050611ae081611d2c565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99047906024016000604051808303818588803b158015611b6857600080fd5b505af1158015611b7c573d6000803e3d6000fd5b5050505050505050565b6000611ba873ffffffffffffffffffffffffffffffffffffffff841683611da5565b90508051600014158015611bcd575080806020019051810190611bcb9190612786565b155b15610774576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260240161076b565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611caf91906125b9565b90506000611cd2611cc08386610da5565b6002546301000000900460ff16611db3565b600154909150811015611cea57600092505050610a97565b600254611d239086907f0000000000000000000000000000000000000000000000000000000000000000908590859062ffffff16611dd3565b95945050505050565b6040517f49404b7c000000000000000000000000000000000000000000000000000000008152600481018290523060248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906349404b7c90604401610c39565b6060610a9483836000611f9b565b60006103e8611dc560ff8416826127a3565b610a8a9061ffff1685612525565b604080516101008101825273ffffffffffffffffffffffffffffffffffffffff87811682528681166020830190815262ffffff8581168486019081527f0000000000000000000000000000000000000000000000000000000000000000841660608601818152426080880190815260a088018c815260c089018c8152600060e08b018181529b517f414bf3890000000000000000000000000000000000000000000000000000000081528b518b16600482015298518a1660248a0152955190961660448801529151871660648701525160848601525160a4850152915160c4840152945190921660e482015263414bf38990610104016020604051808303816000875af1925050508015611f22575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f1f918101906125b9565b60015b611f8e576040805173ffffffffffffffffffffffffffffffffffffffff808a16825288166020820152908101869052606081018590527ff7edd4c6ec425decf715a8b8eaa3b65d3d86e31ad0ff750aa60fa834190f515f9060800160405180910390a160009150611f91565b91505b5095945050505050565b606081471015611fd9576040517fcd78605900000000000000000000000000000000000000000000000000000000815230600482015260240161076b565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161200291906127c5565b60006040518083038185875af1925050503d806000811461203f576040519150601f19603f3d011682016040523d82523d6000602084013e612044565b606091505b509150915061205486838361205e565b9695505050505050565b6060826120735761206e826120ed565b6119d2565b8151158015612097575073ffffffffffffffffffffffffffffffffffffffff84163b155b156120e6576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161076b565b50806119d2565b8051156120fd5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561214157600080fd5b813563ffffffff811681146119d257600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610b3457600080fd5b6000806040838503121561218a57600080fd5b823561219581612155565b946020939093013593505050565b8015158114610b3457600080fd5b6000602082840312156121c357600080fd5b81356119d2816121a3565b6000806000606084860312156121e357600080fd5b833567ffffffffffffffff8111156121fa57600080fd5b8401610120818703121561220d57600080fd5b95602085013595506040909401359392505050565b60005b8381101561223d578181015183820152602001612225565b50506000910152565b6040815260008351806040840152612265816060850160208801612222565b602083019390935250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b6000806000806000608086880312156122b757600080fd5b8535600381106122c657600080fd5b9450602086013567ffffffffffffffff808211156122e357600080fd5b818801915088601f8301126122f757600080fd5b81358181111561230657600080fd5b89602082850101111561231857600080fd5b9699602092909201985095966040810135965060600135945092505050565b6000806040838503121561234a57600080fd5b50508035926020909101359150565b60006060828403121561236b57600080fd5b6040516060810181811067ffffffffffffffff821117156123b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282358152602083013562ffffff811681146123d257600080fd5b6020820152604083013560ff811681146123eb57600080fd5b60408201529392505050565b60006020828403121561240957600080fd5b81356119d281612155565b803565ffffffffffff8116811461242a57600080fd5b919050565b60006080828403121561244157600080fd5b6040516080810181811067ffffffffffffffff8211171561248b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528235815260208301356fffffffffffffffffffffffffffffffff811681146124b557600080fd5b60208201526124c660408401612414565b60408201526124d760608401612414565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610a9757610a976124e3565b8082028115828204841417610a9757610a976124e3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826125a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115610a9757610a976124e3565b6000602082840312156125cb57600080fd5b5051919050565b805169ffffffffffffffffffff8116811461242a57600080fd5b600080600080600060a0868803121561260457600080fd5b61260d866125d2565b9450602086015193506040860151925060608601519150612630608087016125d2565b90509295509295909350565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261267157600080fd5b83018035915067ffffffffffffffff82111561268c57600080fd5b6020019150368190038213156126a157600080fd5b9250929050565b600080858511156126b857600080fd5b838611156126c557600080fd5b5050820193919092039150565b80356020831015610a97577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b6000806040838503121561272157600080fd5b82359150602083013561273381612155565b809150509250929050565b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000813581811691601085101561277e5780818660100360031b1b83161692505b505092915050565b60006020828403121561279857600080fd5b81516119d2816121a3565b61ffff8281168282160390808211156127be576127be6124e3565b5092915050565b600082516127d7818460208701612222565b919091019291505056fea2646970667358221220dbce82cc867ef768bacc89d7139e557f7b2f8478314e8b57234acb574df4ccb164736f6c63430008170033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
