{
  "_format": "hh-sol-artifact-1",
  "contractName": "PerpV2Exchange",
  "sourceName": "contracts/Exchange.sol",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "accountBalance",
          "type": "address"
        }
      ],
      "name": "AccountBalanceChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "clearingHouse",
          "type": "address"
        }
      ],
      "name": "ClearingHouseChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "baseToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "markTwap",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "indexTwap",
          "type": "uint256"
        }
      ],
      "name": "FundingUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "baseToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint24",
          "name": "maxTickCrossedWithinBlock",
          "type": "uint24"
        }
      ],
      "name": "MaxTickCrossedWithinBlockChanged",
      "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"
    },
    {
      "inputs": [],
      "name": "candidate",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getAccountBalance",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "trader",
          "type": "address"
        }
      ],
      "name": "getAllPendingFundingPayment",
      "outputs": [
        {
          "internalType": "int256",
          "name": "pendingFundingPayment",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getClearingHouse",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getClearingHouseConfig",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "baseToken",
          "type": "address"
        }
      ],
      "name": "getFundingGrowthGlobalAndTwaps",
      "outputs": [
        {
          "components": [
            {
              "internalType": "int256",
              "name": "twPremiumX96",
              "type": "int256"
            },
            {
              "internalType": "int256",
              "name": "twPremiumDivBySqrtPriceX96",
              "type": "int256"
            }
          ],
          "internalType": "struct Funding.Growth",
          "name": "fundingGrowthGlobal",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "markTwap",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "indexTwap",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getMarketRegistry",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "baseToken",
          "type": "address"
        }
      ],
      "name": "getMaxTickCrossedWithinBlock",
      "outputs": [
        {
          "internalType": "uint24",
          "name": "",
          "type": "uint24"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getOrderBook",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "trader",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "baseToken",
          "type": "address"
        }
      ],
      "name": "getPendingFundingPayment",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "trader",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "baseToken",
              "type": "address"
            },
            {
              "internalType": "int256",
              "name": "base",
              "type": "int256"
            },
            {
              "internalType": "int256",
              "name": "quote",
              "type": "int256"
            }
          ],
          "internalType": "struct IExchange.RealizePnlParams",
          "name": "params",
          "type": "tuple"
        }
      ],
      "name": "getPnlToBeRealized",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "baseToken",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "twapInterval",
          "type": "uint32"
        }
      ],
      "name": "getSqrtMarkTwapX96",
      "outputs": [
        {
          "internalType": "uint160",
          "name": "",
          "type": "uint160"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "marketRegistryArg",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "orderBookArg",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "clearingHouseConfigArg",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "accountBalanceArg",
          "type": "address"
        }
      ],
      "name": "setAccountBalance",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "clearingHouseArg",
          "type": "address"
        }
      ],
      "name": "setClearingHouse",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "baseToken",
          "type": "address"
        },
        {
          "internalType": "uint24",
          "name": "maxTickCrossedWithinBlock",
          "type": "uint24"
        }
      ],
      "name": "setMaxTickCrossedWithinBlock",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "setOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "trader",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "baseToken",
          "type": "address"
        }
      ],
      "name": "settleFunding",
      "outputs": [
        {
          "internalType": "int256",
          "name": "fundingPayment",
          "type": "int256"
        },
        {
          "components": [
            {
              "internalType": "int256",
              "name": "twPremiumX96",
              "type": "int256"
            },
            {
              "internalType": "int256",
              "name": "twPremiumDivBySqrtPriceX96",
              "type": "int256"
            }
          ],
          "internalType": "struct Funding.Growth",
          "name": "fundingGrowthGlobal",
          "type": "tuple"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "trader",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "baseToken",
              "type": "address"
            },
            {
              "internalType": "bool",
              "name": "isBaseToQuote",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "isExactInput",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "isClose",
              "type": "bool"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "uint160",
              "name": "sqrtPriceLimitX96",
              "type": "uint160"
            }
          ],
          "internalType": "struct IExchange.SwapParams",
          "name": "params",
          "type": "tuple"
        }
      ],
      "name": "swap",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "base",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "quote",
              "type": "uint256"
            },
            {
              "internalType": "int256",
              "name": "exchangedPositionSize",
              "type": "int256"
            },
            {
              "internalType": "int256",
              "name": "exchangedPositionNotional",
              "type": "int256"
            },
            {
              "internalType": "uint256",
              "name": "fee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "insuranceFundFee",
              "type": "uint256"
            },
            {
              "internalType": "int256",
              "name": "pnlToBeRealized",
              "type": "int256"
            },
            {
              "internalType": "uint256",
              "name": "sqrtPriceAfterX96",
              "type": "uint256"
            },
            {
              "internalType": "int24",
              "name": "tick",
              "type": "int24"
            },
            {
              "internalType": "bool",
              "name": "isPartialClose",
              "type": "bool"
            }
          ],
          "internalType": "struct IExchange.SwapResponse",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "amount0Delta",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "amount1Delta",
          "type": "int256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "uniswapV3SwapCallback",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "updateOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b5061467f806100206000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806380f57f11116100c3578063c0c53b8b1161007c578063c0c53b8b14610295578063c575ff79146102a8578063c66b8ed2146102b0578063cb379aa2146102b8578063f9cbb471146102cb578063fa461e33146102ed5761014d565b806380f57f111461024f5780638da5cb5b1461026257806399e4a7711461026a578063aa2a82941461027d578063b248c4ef14610285578063bc5920ba1461028d5761014d565b80634314ca1c116101155780634314ca1c146101e4578063449323d8146102045780635eb8a4e6146102175780636896fabf1461022a5780636c8381f81461023f578063715018a6146102475761014d565b80631393a4691461015257806313af40351461017b578063199387cc146101905780631e81ac33146101a357806329386b7b146101c4575b600080fd5b610165610160366004613cff565b610300565b6040516101729190614072565b60405180910390f35b61018e6101893660046138ea565b610426565b005b61018e61019e3660046138ea565b610581565b6101b66101b1366004613922565b610663565b6040516101729291906140b8565b6101d76101d23660046138ea565b61091d565b60405161017291906143ff565b6101f76101f2366004613dc5565b61093d565b604051610172919061437c565b61018e6102123660046138ea565b610de1565b61018e6102253660046139a4565b610e88565b610232611056565b6040516101729190613f56565b610232611065565b61018e611074565b61016561025d3660046138ea565b611115565b6102326111e7565b6102326102783660046139d1565b6111f6565b61023261128c565b61023261129b565b61018e6112aa565b61018e6102a336600461395a565b611396565b6102326114d8565b6102326114e7565b6101656102c6366004613922565b6114f6565b6102de6102d93660046138ea565b6116ad565b6040516101729392919061428f565b61018e6102fb366004613bb4565b6116ce565b60ce54815160208301516040516331997f7b60e11b815260009384936001600160a01b0390911692636332fef69261033c929190600401613f6a565b60606040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190613c2e565b6020810151815191925090600081156103b25760408601516000808412911214156103b5565b60005b9050806103c357600061041a565b61041a6040518060c0016040528088600001516001600160a01b0316815260200188602001516001600160a01b0316815260200184815260200185815260200188604001518152602001886060015181525061186e565b9450505050505b919050565b61042e611923565b6001600160a01b031661043f6111e7565b6001600160a01b031614610483576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6001600160a01b0381166104c7576040805162461bcd60e51b81526020600482015260066024820152650534f5f4e57360d41b604482015290519081900360640190fd5b6033546001600160a01b0382811691161415610513576040805162461bcd60e51b8152602060048201526006602482015265534f5f53414f60d01b604482015290519081900360640190fd5b6034546001600160a01b038281169116141561055f576040805162461bcd60e51b8152602060048201526006602482015265534f5f53414360d01b604482015290519081900360640190fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b610589611923565b6001600160a01b031661059a6111e7565b6001600160a01b0316146105de576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6001600160a01b03811661060d5760405162461bcd60e51b815260040161060490614174565b60405180910390fd5b60ce80546001600160a01b0319166001600160a01b0383161790556040517f2b28168781da733c8a034f84683b9c955f156de5e07e24920b1348f51445d3e690610658908390613f56565b60405180910390a150565b600061066d613789565b609a54604051631246dbf560e01b81526001600160a01b0390911690631246dbf59061069d908690600401613f56565b60206040518083038186803b1580156106b557600080fd5b505afa1580156106c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ed9190613b5d565b6107095760405162461bcd60e51b8152600401610604906140ee565b60008061071585611927565b60ce546040516359deb70960e11b8152939650919450925061083391889188916001600160a01b039091169063b3bd6e12906107579085908590600401613f6a565b60206040518083038186803b15801561076f57600080fd5b505afa158015610783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a79190613b79565b60ce546040516331997f7b60e11b81526001600160a01b0390911690636332fef6906107d9908d908d90600401613f6a565b60606040518083038186803b1580156107f157600080fd5b505afa158015610805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108299190613c2e565b6040015187611bb8565b9350600061083f611c5c565b6001600160a01b038716600090815260d260205260409020549091508114610913576001600160a01b038616600081815260d36020908152604080832088518984015160d290945293829020600182019390935592835590849055519091907f54e4482fe1d38392effe5d53f0e9e72f60221a75a10cea7abbb684bfb03519bf906108cd908790879061440f565b60405180910390a26108de87611c60565b6001600160a01b038816600090815260d060205260409020805460029290920b62ffffff1662ffffff19909216919091179055505b5050509250929050565b6001600160a01b0316600090815260d4602052604090205462ffffff1690565b6109456137a3565b61094d611ca5565b60ce548251602084015160405163165c4e2960e31b81526000936001600160a01b03169263b2e271489261098392600401613f6a565b60206040518083038186803b15801561099b57600080fd5b505afa1580156109af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d39190613b79565b9050600081156109ef57604084015115156000831214156109f2565b60005b9050600084608001518015610a0657508215155b15610b5257610a188560200151611ce1565b80610a345750610a348560200151600085128760a00151611cf9565b15610b4d576000610a43611c5c565b86516001600160a01b03908116600090815260d560209081526040808320828c015190941683529290522054909150811415610a915760405162461bcd60e51b815260040161060490614130565b85516001600160a01b03908116600090815260d560209081526040808320828b015185168452825280832085905560cf548151633a14199b60e11b8152915193941692637428333692600480840193919291829003018186803b158015610af757600080fd5b505afa158015610b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2f9190613ef9565b60a0880151909150610b419082611d5b565b60a08801525060019150505b610b82565b8115610b8257610b658560200151611ce1565b15610b825760405162461bcd60e51b8152600401610604906140cc565b60ce548551602087015160405163d50d01b760e01b81526000936001600160a01b03169263d50d01b792610bb892600401613f6a565b60206040518083038186803b158015610bd057600080fd5b505afa158015610be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c089190613b79565b90506000610c1587611d70565b90508660800151158015610c265750835b15610c5a57610c3d87602001518260c00151612151565b15610c5a5760405162461bcd60e51b815260040161060490614152565b60008415610cbc57610cb96040518060c001604052808a600001516001600160a01b031681526020018a602001516001600160a01b0316815260200188815260200185815260200184600001518152602001846020015181525061186e565b90505b609a54602089015160405163bbe4f6db60e01b8152600092610d4b926001600160a01b039091169163bbe4f6db91610cf691600401613f56565b60206040518083038186803b158015610d0e57600080fd5b505afa158015610d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d469190613906565b6121f8565b5050505050506001600160a01b03169050604051806101400160405280610d75856000015161228b565b8152602001610d87856020015161228b565b81526020018460400151815260200184606001518152602001846080015181526020018460a0015181526020018381526020018281526020018460c0015160020b8152602001861515815250975050505050505050919050565b610de9611923565b6001600160a01b0316610dfa6111e7565b6001600160a01b031614610e3e576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b606780546001600160a01b0319166001600160a01b0383169081179091556040517fd0654f5900f9e7e4e605a19334306e6a2786bbf960ac0484a4c12feb6428fe2f90600090a250565b610e90611923565b6001600160a01b0316610ea16111e7565b6001600160a01b031614610ee5576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b610ef7826001600160a01b03166122b4565b610f135760405162461bcd60e51b81526004016106049061426f565b609a54604051631246dbf560e01b81526001600160a01b0390911690631246dbf590610f43908590600401613f56565b60206040518083038186803b158015610f5b57600080fd5b505afa158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f939190613b5d565b610faf5760405162461bcd60e51b8152600401610604906140ee565b610fc8610fc3620d89e8620d89e7196122ba565b61231f565b62ffffff168162ffffff161115610ff15760405162461bcd60e51b8152600401610604906141b3565b6001600160a01b038216600081815260d4602052604090819020805462ffffff191662ffffff8516179055517f998d553f208e581d188c66da9e7d19bac5ca64d002753791210c4271c8e955d09061104a9084906143ff565b60405180910390a25050565b60ce546001600160a01b031690565b6034546001600160a01b031690565b61107c611923565b6001600160a01b031661108d6111e7565b6001600160a01b0316146110d1576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6033546040516000916001600160a01b031690600080516020614591833981519152908390a3603380546001600160a01b0319908116909155603480549091169055565b60ce546040516357ba739b60e11b815260009182916001600160a01b039091169063af74e7369061114a908690600401613f56565b60006040518083038186803b15801561116257600080fd5b505afa158015611176573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261119e91908101906139fe565b805190915060005b818110156111df576111d56111ce868584815181106111c157fe5b60200260200101516114f6565b8590612363565b93506001016111a6565b505050919050565b6033546001600160a01b031690565b609a5460405163bbe4f6db60e01b8152600091611283916001600160a01b039091169063bbe4f6db9061122d908790600401613f56565b60206040518083038186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127d9190613906565b836123c8565b90505b92915050565b60cf546001600160a01b031690565b60cd546001600160a01b031690565b6034546001600160a01b03166112ef576040805162461bcd60e51b81526020600482015260056024820152640534f5f43360dc1b604482015290519081900360640190fd5b6112f7611923565b6034546001600160a01b03908116911614611342576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4360d01b604482015290519081900360640190fd5b6034546033546040516001600160a01b03928316929091169060008051602061459183398151915290600090a360348054603380546001600160a01b03199081166001600160a01b03841617909155169055565b600054610100900460ff16806113af57506113af61252c565b806113bd575060005460ff16155b6113f85760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff16158015611423576000805460ff1961ff0019909116610100171660011790555b61142b61253d565b611434846125e7565b611446836001600160a01b03166122b4565b6114625760405162461bcd60e51b815260040161060490614193565b611474826001600160a01b03166122b4565b6114905760405162461bcd60e51b81526004016106049061422f565b60cd80546001600160a01b038086166001600160a01b03199283161790925560cf80549285169290911691909117905580156114d2576000805461ff00191690555b50505050565b6067546001600160a01b031690565b609a546001600160a01b031690565b60008061150283611927565b505060cd546040516347b52fb760e01b81529192506000916001600160a01b03909116906347b52fb79061153e90889088908790600401613f84565b60206040518083038186803b15801561155657600080fd5b505afa15801561156a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158e9190613b79565b60ce546040516359deb70960e11b81529192506116a4916001600160a01b039091169063b3bd6e12906115c79089908990600401613f6a565b60206040518083038186803b1580156115df57600080fd5b505afa1580156115f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116179190613b79565b60ce546040516331997f7b60e11b81526001600160a01b0390911690636332fef690611649908a908a90600401613f6a565b60606040518083038186803b15801561166157600080fd5b505afa158015611675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116999190613c2e565b6040015184846126ad565b95945050505050565b6116b5613789565b6000806116c184611927565b9250925092509193909250565b60006116d8611923565b90506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561171557600080fd5b505afa158015611729573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174d9190613906565b609a5460405163bbe4f6db60e01b81529192506001600160a01b03169063bbe4f6db9061177e908490600401613f56565b60206040518083038186803b15801561179657600080fd5b505afa1580156117aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ce9190613906565b6001600160a01b0316826001600160a01b0316146117fe5760405162461bcd60e51b8152600401610604906141d7565b60675460405163fa461e3360e01b81526001600160a01b039091169063fa461e339061183490899089908990899060040161407b565b600060405180830381600087803b15801561184e57600080fd5b505af1158015611862573d6000803e3d6000fd5b50505050505050505050565b60008061189c611881846080015161228b565b670de0b6b3a7640000611897866040015161228b565b6126f8565b90506000670de0b6b3a764000082116118eb5760006118d16118bd846127a7565b606087015190670de0b6b3a76400006127f3565b60a08601519091506118e39082612363565b91505061191c565b60a084015160009061190690670de0b6b3a7640000856127f3565b60608601519091506119189082612363565b9150505b9392505050565b3390565b61192f613789565b60008060008061193d611c5c565b6001600160a01b038716600090815260d1602052604090205490915015611a365760cf60009054906101000a90046001600160a01b03166001600160a01b0316633e742e3b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119ac57600080fd5b505afa1580156119c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e49190613f15565b6001600160a01b038716600090815260d1602052604081205491935090611a1590611a10908490612897565b6128f4565b90508063ffffffff168363ffffffff1611611a305782611a32565b805b9250505b6000611a53611a4588856111f6565b6001600160a01b0316612939565b9050611a5e81612953565b604051631208064760e01b81529095506001600160a01b03881690631208064790611a8d90869060040161441d565b60206040518083038186803b158015611aa557600080fd5b505afa158015611ab9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611add9190613b79565b6001600160a01b038816600090815260d2602090815260408083205460d39092529091209195509083821480611b11575081155b15611b35576040805180820190915281548152600182015460208201529750611bac565b6000611b64611b4c611b478786612897565b6127a7565b611b5e86611b598b61296c565b612985565b90612a8f565b8254909150611b739082612363565b8952611ba5611b9a82600160601b611b8c8e60006111f6565b6001600160a01b03166127f3565b600184015490612363565b60208a0152505b50505050509193909250565b60cd54604051633fe1339b60e11b815260009182916001600160a01b0390911690637fc2673690611bf1908a908a908890600401613f84565b602060405180830381600087803b158015611c0b57600080fd5b505af1158015611c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c439190613b79565b9050611c51858585846126ad565b979650505050505050565b4290565b609a5460405163bbe4f6db60e01b81526000918291611c97916001600160a01b03169063bbe4f6db90610cf6908790600401613f56565b509398975050505050505050565b6067546001600160a01b0316611cb9611923565b6001600160a01b031614611cdf5760405162461bcd60e51b81526004016106049061410f565b565b600080611ced83611c60565b905061191c8382612151565b6000611d5384611d4e6040518060a00160405280886001600160a01b03168152602001871515158152602001871515158152602001868152602001611d3e8989612b38565b6001600160a01b03169052612b8b565b612151565b949350505050565b6000611283838362ffffff16620f42406126f8565b611d786137fb565b609a54602083015160405163033e16f360e21b81526000926001600160a01b031691630cf85bcc91611dad9190600401613f56565b60806040518083038186803b158015611dc557600080fd5b505afa158015611dd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfd9190613c82565b9050600080611e23856040015186606001518760a0015186602001518760400151612d33565b915091506000611e368660200151611927565b50509050600060cd60009054906101000a90046001600160a01b03166001600160a01b031663a3bf0df86040518061010001604052808a602001516001600160a01b031681526020018a60400151151581526020016001151581526020018681526020018a60c001516001600160a01b03168152602001886020015162ffffff168152602001886040015162ffffff168152602001858152506040518263ffffffff1660e01b8152600401611eeb91906142ae565b606060405180830381600087803b158015611f0557600080fd5b505af1158015611f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3d9190613d6c565b905060006120396040518060e0016040528088600001516001600160a01b03168152602001606760009054906101000a90046001600160a01b03166001600160a01b031681526020018a60400151151581526020018a60600151151581526020018781526020018a60c001516001600160a01b031681526020016040518060a001604052808c600001516001600160a01b031681526020018c602001516001600160a01b031681526020018a600001516001600160a01b031681526020018a6040015162ffffff16815260200186602001518152506040516020016120229190614332565b604051602081830303815290604052815250612dbf565b905060008089604001511561207a5761206461205f84600001518a604001516000612fe9565b613030565b915061207383602001516127a7565b90506120a1565b8251612085906127a7565b915061209e61205f84602001518a604001516000612fe9565b90505b6020808b01516001600160a01b0316600090815260d190915260409020546120ea576120cb611c5c565b6020808c01516001600160a01b0316600090815260d190915260409020555b6040518060e0016040528083815260200161211261210b87602001516127a7565b84906122ba565b81526020018381526020018281526020018560200151815260200185604001518152602001856000015160020b81525098505050505050505050919050565b6001600160a01b038216600090815260d4602052604081205462ffffff168061217e576000915050611286565b6001600160a01b038416600090815260d06020526040812054600290810b91906121b9906121b49084900b62ffffff8616612363565b613044565b905060006121d36121b4600285900b62ffffff87166122ba565b90508060020b8660020b1280611c5157508160020b8660020b13979650505050505050565b6000806000806000806000876001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561223c57600080fd5b505afa158015612250573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122749190613e66565b959e949d50929b5090995097509550909350915050565b6000808212156122ab576122a66122a183613087565b6130b3565b611286565b611286826130b3565b3b151590565b60008183038183128015906122cf5750838113155b806122e457506000831280156122e457508381135b6112835760405162461bcd60e51b81526004018080602001828103825260248152602001806146266024913960400191505060405180910390fd5b8062ffffff811681146104215760405162461bcd60e51b815260040180806020018281038252604381526020018061454e6043913960600191505060405180910390fd5b60008282018183128015906123785750838112155b8061238d575060008312801561238d57508381125b6112835760405162461bcd60e51b81526004018080602001828103825260218152602001806144b56021913960400191505060405180910390fd5b6000600a8263ffffffff1610156123f45760006123e4846121f8565b5094965061128695505050505050565b604080516002808252606082018352600092602083019080368337019050509050828160008151811061242357fe5b602002602001019063ffffffff16908163ffffffff168152505060008160018151811061244c57fe5b63ffffffff9092166020928302919091019091015260405163883bdbfd60e01b81526000906001600160a01b0386169063883bdbfd90612490908590600401614028565b60006040518083038186803b1580156124a857600080fd5b505afa1580156124bc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124e49190810190613a96565b5090506116a48463ffffffff16826000815181106124fe57fe5b60200260200101518360018151811061251357fe5b60200260200101510360060b8161252657fe5b0561310a565b6000612537306122b4565b15905090565b600054610100900460ff1680612556575061255661252c565b80612564575060005460ff16155b61259f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff161580156125ca576000805460ff1961ff0019909116610100171660011790555b6125d2613432565b80156125e4576000805461ff00191690555b50565b600054610100900460ff1680612600575061260061252c565b8061260e575060005460ff16155b6126495760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff16158015612674576000805460ff1961ff0019909116610100171660011790555b61267c613521565b609a80546001600160a01b0319166001600160a01b03841617905580156126a9576000805461ff00191690555b5050565b6000806126d5866126cb8787600001516122ba90919063ffffffff16565b600160601b6127f3565b90506126ee620151806126e88584612363565b906135b6565b9695505050505050565b600080806000198587098686029250828110908390030390508061272e576000841161272357600080fd5b50829004905061191c565b80841161273a57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b60006001600160ff1b038211156127ef5760405162461bcd60e51b81526004018080602001828103825260288152602001806145fe6028913960400191505060405180910390fd5b5090565b60008060008512612804578461280d565b61280d85613087565b9050600080851261281e5784612827565b61282785613087565b90506000808712801561283a5750600086135b8061285057506000871380156128505750600086125b61285b57600061285e565b60015b9050600061286d8484886126f8565b9050816128825761287d816127a7565b61288b565b61288b81613030565b98975050505050505050565b6000828211156128ee576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b8063ffffffff811681146104215760405162461bcd60e51b81526004018080602001828103825260268152602001806145d86026913960400191505060405180910390fd5b60006112866001600160a01b03831680600160601b6126f8565b600061128682670de0b6b3a7640000600160601b6126f8565b600061128682600160601b670de0b6b3a76400006126f8565b60008060cf60009054906101000a90046001600160a01b03166001600160a01b0316636e1d2dd26040518163ffffffff1660e01b815260040160206040518083038186803b1580156129d657600080fd5b505afa1580156129ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0e9190613ef9565b90506000612a1c8483611d5b565b9050600084861115612a5957612a328686612897565b9050818111612a4957612a44816127a7565b612a52565b612a52826127a7565b9350612a86565b612a638587612897565b9050818111612a7a57612a7581613030565b612a83565b612a8382613030565b93505b50505092915050565b600082612a9e57506000611286565b82600019148015612ab25750600160ff1b82145b15612aee5760405162461bcd60e51b81526004018080602001828103825260278152602001806145b16027913960400191505060405180910390fd5b82820282848281612afb57fe5b05146112835760405162461bcd60e51b81526004018080602001828103825260278152602001806145b16027913960400191505060405180910390fd5b6001600160a01b038216600090815260d0602090815260408083205460d490925282205460029190910b9062ffffff168284612b7957600182840303612b80565b8183016001015b9050612a838161310a565b609a54815160405163033e16f360e21b815260009283926001600160a01b0390911691630cf85bcc91612bc091600401613f56565b60806040518083038186803b158015612bd857600080fd5b505afa158015612bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c109190613c82565b90506000816020015190506000826040015190506000612c3f8660200151876040015188606001518686612d33565b60cd5460408051610100810182528a516001600160a01b0390811682526020808d01511515818401526000838501819052606084018790526080808f015184169085015262ffffff808c1660a08601528a1660c08501528451808601865281815291820181905260e08401919091529251631477e1bf60e31b815294965091945091169163a3bf0df891612cd5916004016142ae565b606060405180830381600087803b158015612cef57600080fd5b505af1158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190613d6c565b51979650505050505050565b6000808615612d655785612d5257612d4d85856001612fe9565b612d5e565b612d5e85846001612fe9565b9150612d80565b85612d705784612d7d565b612d7d858486600161366e565b91505b86612d9357612d8e856127a7565b612d9c565b612d9c826127a7565b905085612db157612dac81613087565b612db3565b805b90509550959350505050565b612dc7613789565b60008260600151612de457612ddf8360800151613030565b612df1565b612df183608001516127a7565b905060008084600001516001600160a01b031663128acb0886602001518760400151868960a001516001600160a01b0316600014612e33578960a00151612e5d565b8960400151612e565773fffd8963efd1fc6a506488495d951d5263988d25612e5d565b6401000276a45b8a60c001516040518663ffffffff1660e01b8152600401612e82959493929190613fa9565b6040805180830381600087803b158015612e9b57600080fd5b505af1158015612eaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed39190613b91565b91509150600080612ee38461228b565b612eec8461228b565b915091506000876040015115158860600151151514612f0b5781612f0d565b825b90508760600151158015612f2c575060a08801516001600160a01b0316155b15612fcd57600a88608001518211612f52576080890151612f4d9083612897565b612f62565b6080890151612f62908390612897565b10612f7f5760405162461bcd60e51b81526004016106049061424f565b8760400151612fa65760405180604001604052808960800151815260200183815250612fc0565b604051806040016040528084815260200189608001518152505b9650505050505050610421565b5060408051808201909152918252602082015295945050505050565b6000816130145761300f84613006620f424062ffffff8716612897565b620f42406126f8565b611d53565b611d5384620f424061302b8162ffffff8816612897565b6136af565b600061303b826127a7565b60000392915050565b80600281900b81146104215760405162461bcd60e51b81526004018080602001828103825260298152602001806144d66029913960400191505060405180910390fd5b6000600160ff1b82136130ac5760405162461bcd60e51b8152600401610604906141f8565b5060000390565b6000808212156127ef576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b60008060008360020b12613121578260020b613129565b8260020b6000035b9050620d89e8811115613167576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b60006001821661317b57600160801b61318d565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b0316905060028216156131b7576ffff97272373d413259a46990580e213a0260801c5b60048216156131d6576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156131f5576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615613214576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615613233576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615613252576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615613271576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615613291576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156132b1576ff987a7253ac413176f2b074cf7815e540260801c5b6104008216156132d1576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156132f1576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615613311576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615613331576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615613351576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615613371576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615613392576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b620200008216156133b2576e5d6af8dedb81196699c329225ee6040260801c5b620400008216156133d1576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156133ee576b048a170391f7dc42444e8fa20260801c5b60008460020b131561340957806000198161340557fe5b0490505b64010000000081061561341d576001613420565b60005b60ff16602082901c0192505050919050565b600054610100900460ff168061344b575061344b61252c565b80613459575060005460ff16155b6134945760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff161580156134bf576000805460ff1961ff0019909116610100171660011790555b6134c7613521565b60006134d1611923565b603380546001600160a01b0319166001600160a01b03831690811790915560405191925090600090600080516020614591833981519152908290a35080156125e4576000805461ff001916905550565b600054610100900460ff168061353a575061353a61252c565b80613548575060005460ff16155b6135835760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff161580156135ae576000805460ff1961ff0019909116610100171660011790555b6125d26136e9565b60008161360a576040805162461bcd60e51b815260206004820181905260248201527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604482015290519081900360640190fd5b8160001914801561361e5750600160ff1b83145b1561365a5760405162461bcd60e51b815260040180806020018281038252602181526020018061452d6021913960400191505060405180910390fd5b600082848161366557fe5b05949350505050565b60008060008361367f578585613682565b84865b9092509050611c518761369d620f424062ffffff8616612897565b61302b620f424062ffffff8616612897565b60006136bc8484846126f8565b9050600082806136c857fe5b848609111561191c5760001981106136df57600080fd5b6001019392505050565b600054610100900460ff1680613702575061370261252c565b80613710575060005460ff16155b61374b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff161580156125d2576000805460ff1961ff00199091166101001716600117905580156125e4576000805461ff001916905550565b604051806040016040528060008152602001600081525090565b6040518061014001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060020b81526020016000151581525090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060020b81525090565b80356104218161446e565b600082601f830112613856578081fd5b8151602061386b61386683614451565b61442e565b8281528181019085830183850287018401881015613887578586fd5b855b858110156138ae57815161389c8161446e565b84529284019290840190600101613889565b5090979650505050505050565b803561042181614483565b8051600281900b811461042157600080fd5b805161ffff8116811461042157600080fd5b6000602082840312156138fb578081fd5b81356112838161446e565b600060208284031215613917578081fd5b81516112838161446e565b60008060408385031215613934578081fd5b823561393f8161446e565b9150602083013561394f8161446e565b809150509250929050565b60008060006060848603121561396e578081fd5b83356139798161446e565b925060208401356139898161446e565b915060408401356139998161446e565b809150509250925092565b600080604083850312156139b6578182fd5b82356139c18161446e565b9150602083013561394f81614491565b600080604083850312156139e3578182fd5b82356139ee8161446e565b9150602083013561394f816144a2565b60006020808385031215613a10578182fd5b82516001600160401b03811115613a25578283fd5b8301601f81018513613a35578283fd5b8051613a4361386682614451565b8181528381019083850185840285018601891015613a5f578687fd5b8694505b83851015613a8a578051613a768161446e565b835260019490940193918501918501613a63565b50979650505050505050565b60008060408385031215613aa8578182fd5b82516001600160401b0380821115613abe578384fd5b818501915085601f830112613ad1578384fd5b81516020613ae161386683614451565b82815281810190858301838502870184018b1015613afd578889fd5b8896505b84871015613b2d5780518060060b8114613b1957898afd5b835260019690960195918301918301613b01565b5091880151919650909350505080821115613b46578283fd5b50613b5385828601613846565b9150509250929050565b600060208284031215613b6e578081fd5b815161128381614483565b600060208284031215613b8a578081fd5b5051919050565b60008060408385031215613ba3578182fd5b505080516020909101519092909150565b60008060008060608587031215613bc9578182fd5b843593506020850135925060408501356001600160401b0380821115613bed578384fd5b818701915087601f830112613c00578384fd5b813581811115613c0e578485fd5b886020828501011115613c1f578485fd5b95989497505060200194505050565b600060608284031215613c3f578081fd5b604051606081018181106001600160401b0382111715613c5b57fe5b80604052508251815260208301516020820152604083015160408201528091505092915050565b600060808284031215613c93578081fd5b604051608081018181106001600160401b0382111715613caf57fe5b6040528251613cbd8161446e565b81526020830151613ccd81614491565b60208201526040830151613ce081614491565b60408201526060830151613cf381614491565b60608201529392505050565b600060808284031215613d10578081fd5b604051608081018181106001600160401b0382111715613d2c57fe5b6040528235613d3a8161446e565b81526020830135613d4a8161446e565b6020820152604083810135908201526060928301359281019290925250919050565b600060608284031215613d7d578081fd5b604051606081018181106001600160401b0382111715613d9957fe5b604052613da5836138c6565b815260208301516020820152604083015160408201528091505092915050565b600060e08284031215613dd6578081fd5b60405160e081018181106001600160401b0382111715613df257fe5b604052613dfe8361383b565b8152613e0c6020840161383b565b6020820152613e1d604084016138bb565b6040820152613e2e606084016138bb565b6060820152613e3f608084016138bb565b608082015260a083013560a0820152613e5a60c0840161383b565b60c08201529392505050565b600080600080600080600060e0888a031215613e80578485fd5b8751613e8b8161446e565b9650613e99602089016138c6565b9550613ea7604089016138d8565b9450613eb5606089016138d8565b9350613ec3608089016138d8565b925060a088015160ff81168114613ed8578283fd5b60c0890151909250613ee981614483565b8091505092959891949750929550565b600060208284031215613f0a578081fd5b815161128381614491565b600060208284031215613f26578081fd5b8151611283816144a2565b15159052565b60020b9052565b80518252602090810151910152565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0384811682528316602082015260808101611d536040830184613f3e565b600060018060a01b038088168352602087151581850152866040850152818616606085015260a06080850152845191508160a0850152825b82811015613ffd5785810182015185820160c001528101613fe1565b8281111561400e578360c084870101525b5050601f01601f19169190910160c0019695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561406657835163ffffffff1683529284019291840191600101614044565b50909695505050505050565b90815260200190565b60008582528460208301526060604083015282606083015282846080840137818301608090810191909152601f909201601f191601019392505050565b8281526060810161191c6020830184613f3e565b60208082526008908201526745585f4f504c425360c01b604082015260600190565b60208082526007908201526645585f42544e4560c81b604082015260600190565b6020808252600790820152660869088be9e86960cb1b604082015260600190565b60208082526008908201526745585f414f504c4f60c01b604082015260600190565b60208082526008908201526745585f4f504c415360c01b604082015260600190565b6020808252600590820152640455f4142360dc1b604082015260600190565b602080825260069082015265455f4f424e4360d01b604082015260600190565b6020808252600a908201526922ac2fa6aa21a627a7a960b11b604082015260600190565b6020808252600790820152662aa1a12fa321ab60c91b604082015260600190565b6020808252601c908201527f506572704d6174683a20696e76657273696f6e206f766572666c6f7700000000604082015260600190565b602080825260069082015265455f43484e4360d01b604082015260600190565b60208082526006908201526555425f554f4160d01b604082015260600190565b60208082526006908201526545585f424e4360d01b604082015260600190565b6080810161429d8286613f3e565b604082019390935260600152919050565b60006101208201905060018060a01b03808451168352602084015115156020840152604084015115156040840152606084015160608401528060808501511660808401525060a083015161430560a0840182613f4d565b5060c083015161431860c0840182613f4d565b5060e083015161432b60e0840182613f3e565b5092915050565b81516001600160a01b0390811682526020808401518216908301526040808401519091169082015260608083015162ffffff16908201526080918201519181019190915260a00190565b600061014082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e0830152610100808401516143e282850182613f37565b5050610120808401516143f782850182613f31565b505092915050565b62ffffff91909116815260200190565b918252602082015260400190565b63ffffffff91909116815260200190565b6040518181016001600160401b038111828210171561444957fe5b604052919050565b60006001600160401b0382111561446457fe5b5060209081020190565b6001600160a01b03811681146125e457600080fd5b80151581146125e457600080fd5b62ffffff811681146125e457600080fd5b63ffffffff811681146125e457600080fdfe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20616e2032342062697473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65645369676e6564536166654d6174683a206469766973696f6e206f766572666c6f7753616665436173743a2076616c7565206d75737420626520706f736974697665206f722076616c756520646f65736e27742066697420696e20616e20323420626974738be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e203332206269747353616665436173743a2076616c756520646f65736e27742066697420696e20616e20696e743235365369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f77a2646970667358221220d37816fd03d371f8c5af1db759ef51ec00700a48e9a2a951579265abe7602bdf64736f6c63430007060033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806380f57f11116100c3578063c0c53b8b1161007c578063c0c53b8b14610295578063c575ff79146102a8578063c66b8ed2146102b0578063cb379aa2146102b8578063f9cbb471146102cb578063fa461e33146102ed5761014d565b806380f57f111461024f5780638da5cb5b1461026257806399e4a7711461026a578063aa2a82941461027d578063b248c4ef14610285578063bc5920ba1461028d5761014d565b80634314ca1c116101155780634314ca1c146101e4578063449323d8146102045780635eb8a4e6146102175780636896fabf1461022a5780636c8381f81461023f578063715018a6146102475761014d565b80631393a4691461015257806313af40351461017b578063199387cc146101905780631e81ac33146101a357806329386b7b146101c4575b600080fd5b610165610160366004613cff565b610300565b6040516101729190614072565b60405180910390f35b61018e6101893660046138ea565b610426565b005b61018e61019e3660046138ea565b610581565b6101b66101b1366004613922565b610663565b6040516101729291906140b8565b6101d76101d23660046138ea565b61091d565b60405161017291906143ff565b6101f76101f2366004613dc5565b61093d565b604051610172919061437c565b61018e6102123660046138ea565b610de1565b61018e6102253660046139a4565b610e88565b610232611056565b6040516101729190613f56565b610232611065565b61018e611074565b61016561025d3660046138ea565b611115565b6102326111e7565b6102326102783660046139d1565b6111f6565b61023261128c565b61023261129b565b61018e6112aa565b61018e6102a336600461395a565b611396565b6102326114d8565b6102326114e7565b6101656102c6366004613922565b6114f6565b6102de6102d93660046138ea565b6116ad565b6040516101729392919061428f565b61018e6102fb366004613bb4565b6116ce565b60ce54815160208301516040516331997f7b60e11b815260009384936001600160a01b0390911692636332fef69261033c929190600401613f6a565b60606040518083038186803b15801561035457600080fd5b505afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190613c2e565b6020810151815191925090600081156103b25760408601516000808412911214156103b5565b60005b9050806103c357600061041a565b61041a6040518060c0016040528088600001516001600160a01b0316815260200188602001516001600160a01b0316815260200184815260200185815260200188604001518152602001886060015181525061186e565b9450505050505b919050565b61042e611923565b6001600160a01b031661043f6111e7565b6001600160a01b031614610483576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6001600160a01b0381166104c7576040805162461bcd60e51b81526020600482015260066024820152650534f5f4e57360d41b604482015290519081900360640190fd5b6033546001600160a01b0382811691161415610513576040805162461bcd60e51b8152602060048201526006602482015265534f5f53414f60d01b604482015290519081900360640190fd5b6034546001600160a01b038281169116141561055f576040805162461bcd60e51b8152602060048201526006602482015265534f5f53414360d01b604482015290519081900360640190fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b610589611923565b6001600160a01b031661059a6111e7565b6001600160a01b0316146105de576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6001600160a01b03811661060d5760405162461bcd60e51b815260040161060490614174565b60405180910390fd5b60ce80546001600160a01b0319166001600160a01b0383161790556040517f2b28168781da733c8a034f84683b9c955f156de5e07e24920b1348f51445d3e690610658908390613f56565b60405180910390a150565b600061066d613789565b609a54604051631246dbf560e01b81526001600160a01b0390911690631246dbf59061069d908690600401613f56565b60206040518083038186803b1580156106b557600080fd5b505afa1580156106c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ed9190613b5d565b6107095760405162461bcd60e51b8152600401610604906140ee565b60008061071585611927565b60ce546040516359deb70960e11b8152939650919450925061083391889188916001600160a01b039091169063b3bd6e12906107579085908590600401613f6a565b60206040518083038186803b15801561076f57600080fd5b505afa158015610783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a79190613b79565b60ce546040516331997f7b60e11b81526001600160a01b0390911690636332fef6906107d9908d908d90600401613f6a565b60606040518083038186803b1580156107f157600080fd5b505afa158015610805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108299190613c2e565b6040015187611bb8565b9350600061083f611c5c565b6001600160a01b038716600090815260d260205260409020549091508114610913576001600160a01b038616600081815260d36020908152604080832088518984015160d290945293829020600182019390935592835590849055519091907f54e4482fe1d38392effe5d53f0e9e72f60221a75a10cea7abbb684bfb03519bf906108cd908790879061440f565b60405180910390a26108de87611c60565b6001600160a01b038816600090815260d060205260409020805460029290920b62ffffff1662ffffff19909216919091179055505b5050509250929050565b6001600160a01b0316600090815260d4602052604090205462ffffff1690565b6109456137a3565b61094d611ca5565b60ce548251602084015160405163165c4e2960e31b81526000936001600160a01b03169263b2e271489261098392600401613f6a565b60206040518083038186803b15801561099b57600080fd5b505afa1580156109af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d39190613b79565b9050600081156109ef57604084015115156000831214156109f2565b60005b9050600084608001518015610a0657508215155b15610b5257610a188560200151611ce1565b80610a345750610a348560200151600085128760a00151611cf9565b15610b4d576000610a43611c5c565b86516001600160a01b03908116600090815260d560209081526040808320828c015190941683529290522054909150811415610a915760405162461bcd60e51b815260040161060490614130565b85516001600160a01b03908116600090815260d560209081526040808320828b015185168452825280832085905560cf548151633a14199b60e11b8152915193941692637428333692600480840193919291829003018186803b158015610af757600080fd5b505afa158015610b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2f9190613ef9565b60a0880151909150610b419082611d5b565b60a08801525060019150505b610b82565b8115610b8257610b658560200151611ce1565b15610b825760405162461bcd60e51b8152600401610604906140cc565b60ce548551602087015160405163d50d01b760e01b81526000936001600160a01b03169263d50d01b792610bb892600401613f6a565b60206040518083038186803b158015610bd057600080fd5b505afa158015610be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c089190613b79565b90506000610c1587611d70565b90508660800151158015610c265750835b15610c5a57610c3d87602001518260c00151612151565b15610c5a5760405162461bcd60e51b815260040161060490614152565b60008415610cbc57610cb96040518060c001604052808a600001516001600160a01b031681526020018a602001516001600160a01b0316815260200188815260200185815260200184600001518152602001846020015181525061186e565b90505b609a54602089015160405163bbe4f6db60e01b8152600092610d4b926001600160a01b039091169163bbe4f6db91610cf691600401613f56565b60206040518083038186803b158015610d0e57600080fd5b505afa158015610d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d469190613906565b6121f8565b5050505050506001600160a01b03169050604051806101400160405280610d75856000015161228b565b8152602001610d87856020015161228b565b81526020018460400151815260200184606001518152602001846080015181526020018460a0015181526020018381526020018281526020018460c0015160020b8152602001861515815250975050505050505050919050565b610de9611923565b6001600160a01b0316610dfa6111e7565b6001600160a01b031614610e3e576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b606780546001600160a01b0319166001600160a01b0383169081179091556040517fd0654f5900f9e7e4e605a19334306e6a2786bbf960ac0484a4c12feb6428fe2f90600090a250565b610e90611923565b6001600160a01b0316610ea16111e7565b6001600160a01b031614610ee5576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b610ef7826001600160a01b03166122b4565b610f135760405162461bcd60e51b81526004016106049061426f565b609a54604051631246dbf560e01b81526001600160a01b0390911690631246dbf590610f43908590600401613f56565b60206040518083038186803b158015610f5b57600080fd5b505afa158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f939190613b5d565b610faf5760405162461bcd60e51b8152600401610604906140ee565b610fc8610fc3620d89e8620d89e7196122ba565b61231f565b62ffffff168162ffffff161115610ff15760405162461bcd60e51b8152600401610604906141b3565b6001600160a01b038216600081815260d4602052604090819020805462ffffff191662ffffff8516179055517f998d553f208e581d188c66da9e7d19bac5ca64d002753791210c4271c8e955d09061104a9084906143ff565b60405180910390a25050565b60ce546001600160a01b031690565b6034546001600160a01b031690565b61107c611923565b6001600160a01b031661108d6111e7565b6001600160a01b0316146110d1576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6033546040516000916001600160a01b031690600080516020614591833981519152908390a3603380546001600160a01b0319908116909155603480549091169055565b60ce546040516357ba739b60e11b815260009182916001600160a01b039091169063af74e7369061114a908690600401613f56565b60006040518083038186803b15801561116257600080fd5b505afa158015611176573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261119e91908101906139fe565b805190915060005b818110156111df576111d56111ce868584815181106111c157fe5b60200260200101516114f6565b8590612363565b93506001016111a6565b505050919050565b6033546001600160a01b031690565b609a5460405163bbe4f6db60e01b8152600091611283916001600160a01b039091169063bbe4f6db9061122d908790600401613f56565b60206040518083038186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127d9190613906565b836123c8565b90505b92915050565b60cf546001600160a01b031690565b60cd546001600160a01b031690565b6034546001600160a01b03166112ef576040805162461bcd60e51b81526020600482015260056024820152640534f5f43360dc1b604482015290519081900360640190fd5b6112f7611923565b6034546001600160a01b03908116911614611342576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4360d01b604482015290519081900360640190fd5b6034546033546040516001600160a01b03928316929091169060008051602061459183398151915290600090a360348054603380546001600160a01b03199081166001600160a01b03841617909155169055565b600054610100900460ff16806113af57506113af61252c565b806113bd575060005460ff16155b6113f85760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff16158015611423576000805460ff1961ff0019909116610100171660011790555b61142b61253d565b611434846125e7565b611446836001600160a01b03166122b4565b6114625760405162461bcd60e51b815260040161060490614193565b611474826001600160a01b03166122b4565b6114905760405162461bcd60e51b81526004016106049061422f565b60cd80546001600160a01b038086166001600160a01b03199283161790925560cf80549285169290911691909117905580156114d2576000805461ff00191690555b50505050565b6067546001600160a01b031690565b609a546001600160a01b031690565b60008061150283611927565b505060cd546040516347b52fb760e01b81529192506000916001600160a01b03909116906347b52fb79061153e90889088908790600401613f84565b60206040518083038186803b15801561155657600080fd5b505afa15801561156a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158e9190613b79565b60ce546040516359deb70960e11b81529192506116a4916001600160a01b039091169063b3bd6e12906115c79089908990600401613f6a565b60206040518083038186803b1580156115df57600080fd5b505afa1580156115f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116179190613b79565b60ce546040516331997f7b60e11b81526001600160a01b0390911690636332fef690611649908a908a90600401613f6a565b60606040518083038186803b15801561166157600080fd5b505afa158015611675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116999190613c2e565b6040015184846126ad565b95945050505050565b6116b5613789565b6000806116c184611927565b9250925092509193909250565b60006116d8611923565b90506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561171557600080fd5b505afa158015611729573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174d9190613906565b609a5460405163bbe4f6db60e01b81529192506001600160a01b03169063bbe4f6db9061177e908490600401613f56565b60206040518083038186803b15801561179657600080fd5b505afa1580156117aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ce9190613906565b6001600160a01b0316826001600160a01b0316146117fe5760405162461bcd60e51b8152600401610604906141d7565b60675460405163fa461e3360e01b81526001600160a01b039091169063fa461e339061183490899089908990899060040161407b565b600060405180830381600087803b15801561184e57600080fd5b505af1158015611862573d6000803e3d6000fd5b50505050505050505050565b60008061189c611881846080015161228b565b670de0b6b3a7640000611897866040015161228b565b6126f8565b90506000670de0b6b3a764000082116118eb5760006118d16118bd846127a7565b606087015190670de0b6b3a76400006127f3565b60a08601519091506118e39082612363565b91505061191c565b60a084015160009061190690670de0b6b3a7640000856127f3565b60608601519091506119189082612363565b9150505b9392505050565b3390565b61192f613789565b60008060008061193d611c5c565b6001600160a01b038716600090815260d1602052604090205490915015611a365760cf60009054906101000a90046001600160a01b03166001600160a01b0316633e742e3b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119ac57600080fd5b505afa1580156119c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e49190613f15565b6001600160a01b038716600090815260d1602052604081205491935090611a1590611a10908490612897565b6128f4565b90508063ffffffff168363ffffffff1611611a305782611a32565b805b9250505b6000611a53611a4588856111f6565b6001600160a01b0316612939565b9050611a5e81612953565b604051631208064760e01b81529095506001600160a01b03881690631208064790611a8d90869060040161441d565b60206040518083038186803b158015611aa557600080fd5b505afa158015611ab9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611add9190613b79565b6001600160a01b038816600090815260d2602090815260408083205460d39092529091209195509083821480611b11575081155b15611b35576040805180820190915281548152600182015460208201529750611bac565b6000611b64611b4c611b478786612897565b6127a7565b611b5e86611b598b61296c565b612985565b90612a8f565b8254909150611b739082612363565b8952611ba5611b9a82600160601b611b8c8e60006111f6565b6001600160a01b03166127f3565b600184015490612363565b60208a0152505b50505050509193909250565b60cd54604051633fe1339b60e11b815260009182916001600160a01b0390911690637fc2673690611bf1908a908a908890600401613f84565b602060405180830381600087803b158015611c0b57600080fd5b505af1158015611c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c439190613b79565b9050611c51858585846126ad565b979650505050505050565b4290565b609a5460405163bbe4f6db60e01b81526000918291611c97916001600160a01b03169063bbe4f6db90610cf6908790600401613f56565b509398975050505050505050565b6067546001600160a01b0316611cb9611923565b6001600160a01b031614611cdf5760405162461bcd60e51b81526004016106049061410f565b565b600080611ced83611c60565b905061191c8382612151565b6000611d5384611d4e6040518060a00160405280886001600160a01b03168152602001871515158152602001871515158152602001868152602001611d3e8989612b38565b6001600160a01b03169052612b8b565b612151565b949350505050565b6000611283838362ffffff16620f42406126f8565b611d786137fb565b609a54602083015160405163033e16f360e21b81526000926001600160a01b031691630cf85bcc91611dad9190600401613f56565b60806040518083038186803b158015611dc557600080fd5b505afa158015611dd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfd9190613c82565b9050600080611e23856040015186606001518760a0015186602001518760400151612d33565b915091506000611e368660200151611927565b50509050600060cd60009054906101000a90046001600160a01b03166001600160a01b031663a3bf0df86040518061010001604052808a602001516001600160a01b031681526020018a60400151151581526020016001151581526020018681526020018a60c001516001600160a01b03168152602001886020015162ffffff168152602001886040015162ffffff168152602001858152506040518263ffffffff1660e01b8152600401611eeb91906142ae565b606060405180830381600087803b158015611f0557600080fd5b505af1158015611f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3d9190613d6c565b905060006120396040518060e0016040528088600001516001600160a01b03168152602001606760009054906101000a90046001600160a01b03166001600160a01b031681526020018a60400151151581526020018a60600151151581526020018781526020018a60c001516001600160a01b031681526020016040518060a001604052808c600001516001600160a01b031681526020018c602001516001600160a01b031681526020018a600001516001600160a01b031681526020018a6040015162ffffff16815260200186602001518152506040516020016120229190614332565b604051602081830303815290604052815250612dbf565b905060008089604001511561207a5761206461205f84600001518a604001516000612fe9565b613030565b915061207383602001516127a7565b90506120a1565b8251612085906127a7565b915061209e61205f84602001518a604001516000612fe9565b90505b6020808b01516001600160a01b0316600090815260d190915260409020546120ea576120cb611c5c565b6020808c01516001600160a01b0316600090815260d190915260409020555b6040518060e0016040528083815260200161211261210b87602001516127a7565b84906122ba565b81526020018381526020018281526020018560200151815260200185604001518152602001856000015160020b81525098505050505050505050919050565b6001600160a01b038216600090815260d4602052604081205462ffffff168061217e576000915050611286565b6001600160a01b038416600090815260d06020526040812054600290810b91906121b9906121b49084900b62ffffff8616612363565b613044565b905060006121d36121b4600285900b62ffffff87166122ba565b90508060020b8660020b1280611c5157508160020b8660020b13979650505050505050565b6000806000806000806000876001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561223c57600080fd5b505afa158015612250573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122749190613e66565b959e949d50929b5090995097509550909350915050565b6000808212156122ab576122a66122a183613087565b6130b3565b611286565b611286826130b3565b3b151590565b60008183038183128015906122cf5750838113155b806122e457506000831280156122e457508381135b6112835760405162461bcd60e51b81526004018080602001828103825260248152602001806146266024913960400191505060405180910390fd5b8062ffffff811681146104215760405162461bcd60e51b815260040180806020018281038252604381526020018061454e6043913960600191505060405180910390fd5b60008282018183128015906123785750838112155b8061238d575060008312801561238d57508381125b6112835760405162461bcd60e51b81526004018080602001828103825260218152602001806144b56021913960400191505060405180910390fd5b6000600a8263ffffffff1610156123f45760006123e4846121f8565b5094965061128695505050505050565b604080516002808252606082018352600092602083019080368337019050509050828160008151811061242357fe5b602002602001019063ffffffff16908163ffffffff168152505060008160018151811061244c57fe5b63ffffffff9092166020928302919091019091015260405163883bdbfd60e01b81526000906001600160a01b0386169063883bdbfd90612490908590600401614028565b60006040518083038186803b1580156124a857600080fd5b505afa1580156124bc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124e49190810190613a96565b5090506116a48463ffffffff16826000815181106124fe57fe5b60200260200101518360018151811061251357fe5b60200260200101510360060b8161252657fe5b0561310a565b6000612537306122b4565b15905090565b600054610100900460ff1680612556575061255661252c565b80612564575060005460ff16155b61259f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff161580156125ca576000805460ff1961ff0019909116610100171660011790555b6125d2613432565b80156125e4576000805461ff00191690555b50565b600054610100900460ff1680612600575061260061252c565b8061260e575060005460ff16155b6126495760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff16158015612674576000805460ff1961ff0019909116610100171660011790555b61267c613521565b609a80546001600160a01b0319166001600160a01b03841617905580156126a9576000805461ff00191690555b5050565b6000806126d5866126cb8787600001516122ba90919063ffffffff16565b600160601b6127f3565b90506126ee620151806126e88584612363565b906135b6565b9695505050505050565b600080806000198587098686029250828110908390030390508061272e576000841161272357600080fd5b50829004905061191c565b80841161273a57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b60006001600160ff1b038211156127ef5760405162461bcd60e51b81526004018080602001828103825260288152602001806145fe6028913960400191505060405180910390fd5b5090565b60008060008512612804578461280d565b61280d85613087565b9050600080851261281e5784612827565b61282785613087565b90506000808712801561283a5750600086135b8061285057506000871380156128505750600086125b61285b57600061285e565b60015b9050600061286d8484886126f8565b9050816128825761287d816127a7565b61288b565b61288b81613030565b98975050505050505050565b6000828211156128ee576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b8063ffffffff811681146104215760405162461bcd60e51b81526004018080602001828103825260268152602001806145d86026913960400191505060405180910390fd5b60006112866001600160a01b03831680600160601b6126f8565b600061128682670de0b6b3a7640000600160601b6126f8565b600061128682600160601b670de0b6b3a76400006126f8565b60008060cf60009054906101000a90046001600160a01b03166001600160a01b0316636e1d2dd26040518163ffffffff1660e01b815260040160206040518083038186803b1580156129d657600080fd5b505afa1580156129ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0e9190613ef9565b90506000612a1c8483611d5b565b9050600084861115612a5957612a328686612897565b9050818111612a4957612a44816127a7565b612a52565b612a52826127a7565b9350612a86565b612a638587612897565b9050818111612a7a57612a7581613030565b612a83565b612a8382613030565b93505b50505092915050565b600082612a9e57506000611286565b82600019148015612ab25750600160ff1b82145b15612aee5760405162461bcd60e51b81526004018080602001828103825260278152602001806145b16027913960400191505060405180910390fd5b82820282848281612afb57fe5b05146112835760405162461bcd60e51b81526004018080602001828103825260278152602001806145b16027913960400191505060405180910390fd5b6001600160a01b038216600090815260d0602090815260408083205460d490925282205460029190910b9062ffffff168284612b7957600182840303612b80565b8183016001015b9050612a838161310a565b609a54815160405163033e16f360e21b815260009283926001600160a01b0390911691630cf85bcc91612bc091600401613f56565b60806040518083038186803b158015612bd857600080fd5b505afa158015612bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c109190613c82565b90506000816020015190506000826040015190506000612c3f8660200151876040015188606001518686612d33565b60cd5460408051610100810182528a516001600160a01b0390811682526020808d01511515818401526000838501819052606084018790526080808f015184169085015262ffffff808c1660a08601528a1660c08501528451808601865281815291820181905260e08401919091529251631477e1bf60e31b815294965091945091169163a3bf0df891612cd5916004016142ae565b606060405180830381600087803b158015612cef57600080fd5b505af1158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190613d6c565b51979650505050505050565b6000808615612d655785612d5257612d4d85856001612fe9565b612d5e565b612d5e85846001612fe9565b9150612d80565b85612d705784612d7d565b612d7d858486600161366e565b91505b86612d9357612d8e856127a7565b612d9c565b612d9c826127a7565b905085612db157612dac81613087565b612db3565b805b90509550959350505050565b612dc7613789565b60008260600151612de457612ddf8360800151613030565b612df1565b612df183608001516127a7565b905060008084600001516001600160a01b031663128acb0886602001518760400151868960a001516001600160a01b0316600014612e33578960a00151612e5d565b8960400151612e565773fffd8963efd1fc6a506488495d951d5263988d25612e5d565b6401000276a45b8a60c001516040518663ffffffff1660e01b8152600401612e82959493929190613fa9565b6040805180830381600087803b158015612e9b57600080fd5b505af1158015612eaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed39190613b91565b91509150600080612ee38461228b565b612eec8461228b565b915091506000876040015115158860600151151514612f0b5781612f0d565b825b90508760600151158015612f2c575060a08801516001600160a01b0316155b15612fcd57600a88608001518211612f52576080890151612f4d9083612897565b612f62565b6080890151612f62908390612897565b10612f7f5760405162461bcd60e51b81526004016106049061424f565b8760400151612fa65760405180604001604052808960800151815260200183815250612fc0565b604051806040016040528084815260200189608001518152505b9650505050505050610421565b5060408051808201909152918252602082015295945050505050565b6000816130145761300f84613006620f424062ffffff8716612897565b620f42406126f8565b611d53565b611d5384620f424061302b8162ffffff8816612897565b6136af565b600061303b826127a7565b60000392915050565b80600281900b81146104215760405162461bcd60e51b81526004018080602001828103825260298152602001806144d66029913960400191505060405180910390fd5b6000600160ff1b82136130ac5760405162461bcd60e51b8152600401610604906141f8565b5060000390565b6000808212156127ef576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b60008060008360020b12613121578260020b613129565b8260020b6000035b9050620d89e8811115613167576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b60006001821661317b57600160801b61318d565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b0316905060028216156131b7576ffff97272373d413259a46990580e213a0260801c5b60048216156131d6576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156131f5576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615613214576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615613233576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615613252576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615613271576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615613291576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156132b1576ff987a7253ac413176f2b074cf7815e540260801c5b6104008216156132d1576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156132f1576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615613311576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615613331576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615613351576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615613371576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615613392576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b620200008216156133b2576e5d6af8dedb81196699c329225ee6040260801c5b620400008216156133d1576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156133ee576b048a170391f7dc42444e8fa20260801c5b60008460020b131561340957806000198161340557fe5b0490505b64010000000081061561341d576001613420565b60005b60ff16602082901c0192505050919050565b600054610100900460ff168061344b575061344b61252c565b80613459575060005460ff16155b6134945760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff161580156134bf576000805460ff1961ff0019909116610100171660011790555b6134c7613521565b60006134d1611923565b603380546001600160a01b0319166001600160a01b03831690811790915560405191925090600090600080516020614591833981519152908290a35080156125e4576000805461ff001916905550565b600054610100900460ff168061353a575061353a61252c565b80613548575060005460ff16155b6135835760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff161580156135ae576000805460ff1961ff0019909116610100171660011790555b6125d26136e9565b60008161360a576040805162461bcd60e51b815260206004820181905260248201527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604482015290519081900360640190fd5b8160001914801561361e5750600160ff1b83145b1561365a5760405162461bcd60e51b815260040180806020018281038252602181526020018061452d6021913960400191505060405180910390fd5b600082848161366557fe5b05949350505050565b60008060008361367f578585613682565b84865b9092509050611c518761369d620f424062ffffff8616612897565b61302b620f424062ffffff8616612897565b60006136bc8484846126f8565b9050600082806136c857fe5b848609111561191c5760001981106136df57600080fd5b6001019392505050565b600054610100900460ff1680613702575061370261252c565b80613710575060005460ff16155b61374b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806144ff602e913960400191505060405180910390fd5b600054610100900460ff161580156125d2576000805460ff1961ff00199091166101001716600117905580156125e4576000805461ff001916905550565b604051806040016040528060008152602001600081525090565b6040518061014001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060020b81526020016000151581525090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060020b81525090565b80356104218161446e565b600082601f830112613856578081fd5b8151602061386b61386683614451565b61442e565b8281528181019085830183850287018401881015613887578586fd5b855b858110156138ae57815161389c8161446e565b84529284019290840190600101613889565b5090979650505050505050565b803561042181614483565b8051600281900b811461042157600080fd5b805161ffff8116811461042157600080fd5b6000602082840312156138fb578081fd5b81356112838161446e565b600060208284031215613917578081fd5b81516112838161446e565b60008060408385031215613934578081fd5b823561393f8161446e565b9150602083013561394f8161446e565b809150509250929050565b60008060006060848603121561396e578081fd5b83356139798161446e565b925060208401356139898161446e565b915060408401356139998161446e565b809150509250925092565b600080604083850312156139b6578182fd5b82356139c18161446e565b9150602083013561394f81614491565b600080604083850312156139e3578182fd5b82356139ee8161446e565b9150602083013561394f816144a2565b60006020808385031215613a10578182fd5b82516001600160401b03811115613a25578283fd5b8301601f81018513613a35578283fd5b8051613a4361386682614451565b8181528381019083850185840285018601891015613a5f578687fd5b8694505b83851015613a8a578051613a768161446e565b835260019490940193918501918501613a63565b50979650505050505050565b60008060408385031215613aa8578182fd5b82516001600160401b0380821115613abe578384fd5b818501915085601f830112613ad1578384fd5b81516020613ae161386683614451565b82815281810190858301838502870184018b1015613afd578889fd5b8896505b84871015613b2d5780518060060b8114613b1957898afd5b835260019690960195918301918301613b01565b5091880151919650909350505080821115613b46578283fd5b50613b5385828601613846565b9150509250929050565b600060208284031215613b6e578081fd5b815161128381614483565b600060208284031215613b8a578081fd5b5051919050565b60008060408385031215613ba3578182fd5b505080516020909101519092909150565b60008060008060608587031215613bc9578182fd5b843593506020850135925060408501356001600160401b0380821115613bed578384fd5b818701915087601f830112613c00578384fd5b813581811115613c0e578485fd5b886020828501011115613c1f578485fd5b95989497505060200194505050565b600060608284031215613c3f578081fd5b604051606081018181106001600160401b0382111715613c5b57fe5b80604052508251815260208301516020820152604083015160408201528091505092915050565b600060808284031215613c93578081fd5b604051608081018181106001600160401b0382111715613caf57fe5b6040528251613cbd8161446e565b81526020830151613ccd81614491565b60208201526040830151613ce081614491565b60408201526060830151613cf381614491565b60608201529392505050565b600060808284031215613d10578081fd5b604051608081018181106001600160401b0382111715613d2c57fe5b6040528235613d3a8161446e565b81526020830135613d4a8161446e565b6020820152604083810135908201526060928301359281019290925250919050565b600060608284031215613d7d578081fd5b604051606081018181106001600160401b0382111715613d9957fe5b604052613da5836138c6565b815260208301516020820152604083015160408201528091505092915050565b600060e08284031215613dd6578081fd5b60405160e081018181106001600160401b0382111715613df257fe5b604052613dfe8361383b565b8152613e0c6020840161383b565b6020820152613e1d604084016138bb565b6040820152613e2e606084016138bb565b6060820152613e3f608084016138bb565b608082015260a083013560a0820152613e5a60c0840161383b565b60c08201529392505050565b600080600080600080600060e0888a031215613e80578485fd5b8751613e8b8161446e565b9650613e99602089016138c6565b9550613ea7604089016138d8565b9450613eb5606089016138d8565b9350613ec3608089016138d8565b925060a088015160ff81168114613ed8578283fd5b60c0890151909250613ee981614483565b8091505092959891949750929550565b600060208284031215613f0a578081fd5b815161128381614491565b600060208284031215613f26578081fd5b8151611283816144a2565b15159052565b60020b9052565b80518252602090810151910152565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0384811682528316602082015260808101611d536040830184613f3e565b600060018060a01b038088168352602087151581850152866040850152818616606085015260a06080850152845191508160a0850152825b82811015613ffd5785810182015185820160c001528101613fe1565b8281111561400e578360c084870101525b5050601f01601f19169190910160c0019695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561406657835163ffffffff1683529284019291840191600101614044565b50909695505050505050565b90815260200190565b60008582528460208301526060604083015282606083015282846080840137818301608090810191909152601f909201601f191601019392505050565b8281526060810161191c6020830184613f3e565b60208082526008908201526745585f4f504c425360c01b604082015260600190565b60208082526007908201526645585f42544e4560c81b604082015260600190565b6020808252600790820152660869088be9e86960cb1b604082015260600190565b60208082526008908201526745585f414f504c4f60c01b604082015260600190565b60208082526008908201526745585f4f504c415360c01b604082015260600190565b6020808252600590820152640455f4142360dc1b604082015260600190565b602080825260069082015265455f4f424e4360d01b604082015260600190565b6020808252600a908201526922ac2fa6aa21a627a7a960b11b604082015260600190565b6020808252600790820152662aa1a12fa321ab60c91b604082015260600190565b6020808252601c908201527f506572704d6174683a20696e76657273696f6e206f766572666c6f7700000000604082015260600190565b602080825260069082015265455f43484e4360d01b604082015260600190565b60208082526006908201526555425f554f4160d01b604082015260600190565b60208082526006908201526545585f424e4360d01b604082015260600190565b6080810161429d8286613f3e565b604082019390935260600152919050565b60006101208201905060018060a01b03808451168352602084015115156020840152604084015115156040840152606084015160608401528060808501511660808401525060a083015161430560a0840182613f4d565b5060c083015161431860c0840182613f4d565b5060e083015161432b60e0840182613f3e565b5092915050565b81516001600160a01b0390811682526020808401518216908301526040808401519091169082015260608083015162ffffff16908201526080918201519181019190915260a00190565b600061014082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e0830152610100808401516143e282850182613f37565b5050610120808401516143f782850182613f31565b505092915050565b62ffffff91909116815260200190565b918252602082015260400190565b63ffffffff91909116815260200190565b6040518181016001600160401b038111828210171561444957fe5b604052919050565b60006001600160401b0382111561446457fe5b5060209081020190565b6001600160a01b03811681146125e457600080fd5b80151581146125e457600080fd5b62ffffff811681146125e457600080fd5b63ffffffff811681146125e457600080fdfe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20616e2032342062697473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65645369676e6564536166654d6174683a206469766973696f6e206f766572666c6f7753616665436173743a2076616c7565206d75737420626520706f736974697665206f722076616c756520646f65736e27742066697420696e20616e20323420626974738be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e203332206269747353616665436173743a2076616c756520646f65736e27742066697420696e20616e20696e743235365369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f77a2646970667358221220d37816fd03d371f8c5af1db759ef51ec00700a48e9a2a951579265abe7602bdf64736f6c63430007060033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}