{
  "_format": "hh-sol-artifact-1",
  "contractName": "Exchange",
  "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": "marketTwap",
          "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": [],
      "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": "baseToken",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "twapInterval",
          "type": "uint32"
        }
      ],
      "name": "getSqrtMarketTwapX96",
      "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": [
        {
          "internalType": "address",
          "name": "baseToken",
          "type": "address"
        }
      ],
      "name": "isOverPriceSpread",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "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": "uint24",
              "name": "closedRatio",
              "type": "uint24"
            }
          ],
          "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": "0x608060405234801561001057600080fd5b50614c6d806100206000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80638da5cb5b116100c3578063c575ff791161007c578063c575ff79146102b3578063c66b8ed2146102bb578063cb379aa2146102c3578063dc7e7e1614610275578063fa461e33146102d6578063ff818011146102e957610158565b80638da5cb5b1461026d57806399e4a77114610275578063aa2a829414610288578063b248c4ef14610290578063bc5920ba14610298578063c0c53b8b146102a057610158565b8063449323d811610115578063449323d81461020f5780635eb8a4e6146102225780636896fabf146102355780636c8381f81461024a578063715018a61461025257806380f57f111461025a57610158565b80631393a4691461015d57806313af403514610186578063199387cc1461019b5780631e81ac33146101ae57806329386b7b146101cf5780634314ca1c146101ef575b600080fd5b61017061016b366004614276565b610309565b60405161017d919061462f565b60405180910390f35b610199610194366004613e4e565b61042f565b005b6101996101a9366004613e4e565b61058a565b6101c16101bc366004613e86565b61066c565b60405161017d929190614675565b6101e26101dd366004613e4e565b610b36565b60405161017d9190614a0a565b6102026101fd36600461433c565b610b56565b60405161017d9190614972565b61019961021d366004613e4e565b610f27565b610199610230366004613f08565b610fce565b61023d61118b565b60405161017d9190614508565b61023d61119a565b6101996111a9565b610170610268366004613e4e565b61124a565b61023d61131c565b61023d610283366004613f35565b61132b565b61023d611340565b61023d61134f565b61019961135e565b6101996102ae366004613ebe565b61144a565b61023d61158c565b61023d61159b565b6101706102d1366004613e86565b6115aa565b6101996102e4366004614118565b611761565b6102fc6102f7366004613e4e565b611901565b60405161017d9190614624565b60ce54815160208301516040516331997f7b60e11b815260009384936001600160a01b0390911692636332fef69261034592919060040161451c565b60606040518083038186803b15801561035d57600080fd5b505afa158015610371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103959190614192565b6020810151815191925090600081156103bb5760408601516000808412911214156103be565b60005b9050806103cc576000610423565b6104236040518060c0016040528088600001516001600160a01b0316815260200188602001516001600160a01b031681526020018481526020018581526020018860400151815260200188606001518152506119aa565b9450505050505b919050565b610437611a5f565b6001600160a01b031661044861131c565b6001600160a01b03161461048c576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6001600160a01b0381166104d0576040805162461bcd60e51b81526020600482015260066024820152650534f5f4e57360d41b604482015290519081900360640190fd5b6033546001600160a01b038281169116141561051c576040805162461bcd60e51b8152602060048201526006602482015265534f5f53414f60d01b604482015290519081900360640190fd5b6034546001600160a01b0382811691161415610568576040805162461bcd60e51b8152602060048201526006602482015265534f5f53414360d01b604482015290519081900360640190fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b610592611a5f565b6001600160a01b03166105a361131c565b6001600160a01b0316146105e7576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6001600160a01b0381166106165760405162461bcd60e51b815260040161060d906146ed565b60405180910390fd5b60ce80546001600160a01b0319166001600160a01b0383161790556040517f2b28168781da733c8a034f84683b9c955f156de5e07e24920b1348f51445d3e690610661908390614508565b60405180910390a150565b6000610676613ce1565b61067e611a63565b609a54604051631246dbf560e01b81526001600160a01b0390911690631246dbf5906106ae908690600401614508565b60206040518083038186803b1580156106c657600080fd5b505afa1580156106da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fe91906140c1565b61071a5760405162461bcd60e51b815260040161060d90614689565b60cf546040805163b0a336a760e01b815281516000936001600160a01b03169263b0a336a79260048082019391829003018186803b15801561075b57600080fd5b505afa15801561076f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079391906144a8565b604051630e8d088d60e11b81529092506001600160a01b0386169150631d1a111a906107c3908490600401614a28565b600060405180830381600087803b1580156107dd57600080fd5b505af19250505080156107ee575060015b506000806107fb86611a9f565b60ce546040516359deb70960e11b8152939750919450925061091991899189916001600160a01b039091169063b3bd6e129061083d908590859060040161451c565b60206040518083038186803b15801561085557600080fd5b505afa158015610869573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088d91906140dd565b60ce546040516331997f7b60e11b81526001600160a01b0390911690636332fef6906108bf908e908e9060040161451c565b60606040518083038186803b1580156108d757600080fd5b505afa1580156108eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090f9190614192565b6040015188611f4a565b94506000866001600160a01b03166347535d7b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561095657600080fd5b505afa15801561096a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098e91906140c1565b610a0857866001600160a01b031663fe3434616040518163ffffffff1660e01b815260040160206040518083038186803b1580156109cb57600080fd5b505afa1580156109df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0391906140dd565b610a10565b610a10611fee565b6001600160a01b038816600090815260d260205260409020549091508114610aa8576001600160a01b038716600081815260d36020908152604080832089518a84015160d290945293829020600182019390935592835590849055519091907f54e4482fe1d38392effe5d53f0e9e72f60221a75a10cea7abbb684bfb03519bf90610a9e9087908790614a1a565b60405180910390a2505b6001600160a01b038716600090815260d66020526040902054610acc81600f611ff2565b8210610b2a576001600160a01b038816600090815260d660205260409020829055610af68861204c565b6001600160a01b038916600090815260d060205260409020805460029290920b62ffffff1662ffffff199092169190911790555b50505050509250929050565b6001600160a01b0316600090815260d4602052604090205462ffffff1690565b610b5e613cfb565b610b66611a63565b6020808301516001600160a01b0316600090815260d4909152604090205462ffffff16610ba55760405162461bcd60e51b815260040161060d90614829565b60ce548251602084015160405163165c4e2960e31b81526000936001600160a01b03169263b2e2714892610bdb9260040161451c565b60206040518083038186803b158015610bf357600080fd5b505afa158015610c07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2b91906140dd565b60ce548451602086015160405163d50d01b760e01b81529394506000936001600160a01b039093169263d50d01b792610c6892909160040161451c565b60206040518083038186803b158015610c8057600080fd5b505afa158015610c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb891906140dd565b608085015190915060008312908015610cd057508215155b15610cf757610ce88560200151828760c00151612091565b6001600160a01b031660c08601525b6000610d0286612192565b9050610d1686602001518260c00151612695565b15610d335760405162461bcd60e51b815260040161060d906146cb565b60008415610d4c57866040015115158315151415610d4f565b60005b905060008115610db357610db06040518060c001604052808a600001516001600160a01b031681526020018a602001516001600160a01b031681526020018881526020018781526020018560000151815260200185602001518152506119aa565b90505b609a54602089015160405163bbe4f6db60e01b8152600092610e42926001600160a01b039091169163bbe4f6db91610ded91600401614508565b60206040518083038186803b158015610e0557600080fd5b505afa158015610e19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3d9190613e6a565b61271e565b5050505050506001600160a01b031690506000610e6285600001516127b1565b9050604051806101600160405280828152602001610e8387602001516127b1565b81526020018660400151815260200186606001518152602001866080015181526020018660a0015181526020018481526020018381526020018660c0015160020b81526020018b60800151610ed9576000610ee1565b8b60a0015183105b151581526020018b60800151610ef8576000610f12565b610f12610f0d84620f42408f60a001516127da565b612889565b62ffffff1690529a9950505050505050505050565b610f2f611a5f565b6001600160a01b0316610f4061131c565b6001600160a01b031614610f84576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b606780546001600160a01b0319166001600160a01b0383169081179091556040517fd0654f5900f9e7e4e605a19334306e6a2786bbf960ac0484a4c12feb6428fe2f90600090a250565b610fd6611a5f565b6001600160a01b0316610fe761131c565b6001600160a01b03161461102b576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b61103d826001600160a01b03166128cd565b6110595760405162461bcd60e51b815260040161060d90614849565b609a54604051631246dbf560e01b81526001600160a01b0390911690631246dbf590611089908590600401614508565b60206040518083038186803b1580156110a157600080fd5b505afa1580156110b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d991906140c1565b6110f55760405162461bcd60e51b815260040161060d90614689565b6110fd6128d3565b62ffffff168162ffffff1611156111265760405162461bcd60e51b815260040161060d9061474d565b6001600160a01b038216600081815260d4602052604090819020805462ffffff191662ffffff8516179055517f998d553f208e581d188c66da9e7d19bac5ca64d002753791210c4271c8e955d09061117f908490614a0a565b60405180910390a25050565b60ce546001600160a01b031690565b6034546001600160a01b031690565b6111b1611a5f565b6001600160a01b03166111c261131c565b6001600160a01b031614611206576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6033546040516000916001600160a01b031690600080516020614b59833981519152908390a3603380546001600160a01b0319908116909155603480549091169055565b60ce546040516357ba739b60e11b815260009182916001600160a01b039091169063af74e7369061127f908690600401614508565b60006040518083038186803b15801561129757600080fd5b505afa1580156112ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112d39190810190613f62565b805190915060005b818110156113145761130a611303868584815181106112f657fe5b60200260200101516115aa565b85906128d9565b93506001016112db565b505050919050565b6033546001600160a01b031690565b6000611337838361293e565b90505b92915050565b60cf546001600160a01b031690565b60cd546001600160a01b031690565b6034546001600160a01b03166113a3576040805162461bcd60e51b81526020600482015260056024820152640534f5f43360dc1b604482015290519081900360640190fd5b6113ab611a5f565b6034546001600160a01b039081169116146113f6576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4360d01b604482015290519081900360640190fd5b6034546033546040516001600160a01b039283169290911690600080516020614b5983398151915290600090a360348054603380546001600160a01b03199081166001600160a01b03841617909155169055565b600054610100900460ff168061146357506114636129cb565b80611471575060005460ff16155b6114ac5760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff161580156114d7576000805460ff1961ff0019909116610100171660011790555b6114df6129dc565b6114e884612a86565b6114fa836001600160a01b03166128cd565b6115165760405162461bcd60e51b815260040161060d9061472d565b611528826001600160a01b03166128cd565b6115445760405162461bcd60e51b815260040161060d906147e9565b60cd80546001600160a01b038086166001600160a01b03199283161790925560cf8054928516929091169190911790558015611586576000805461ff00191690555b50505050565b6067546001600160a01b031690565b609a546001600160a01b031690565b6000806115b683611a9f565b505060cd546040516347b52fb760e01b81529192506000916001600160a01b03909116906347b52fb7906115f290889088908790600401614536565b60206040518083038186803b15801561160a57600080fd5b505afa15801561161e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164291906140dd565b60ce546040516359deb70960e11b8152919250611758916001600160a01b039091169063b3bd6e129061167b908990899060040161451c565b60206040518083038186803b15801561169357600080fd5b505afa1580156116a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cb91906140dd565b60ce546040516331997f7b60e11b81526001600160a01b0390911690636332fef6906116fd908a908a9060040161451c565b60606040518083038186803b15801561171557600080fd5b505afa158015611729573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174d9190614192565b604001518484612b4c565b95945050505050565b600061176b611a5f565b90506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156117a857600080fd5b505afa1580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e09190613e6a565b609a5460405163bbe4f6db60e01b81529192506001600160a01b03169063bbe4f6db90611811908490600401614508565b60206040518083038186803b15801561182957600080fd5b505afa15801561183d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118619190613e6a565b6001600160a01b0316826001600160a01b0316146118915760405162461bcd60e51b815260040161060d90614771565b60675460405163fa461e3360e01b81526001600160a01b039091169063fa461e33906118c7908990899089908990600401614638565b600060405180830381600087803b1580156118e157600080fd5b505af11580156118f5573d6000803e3d6000fd5b50505050505050505050565b6000620186a062ffffff166119a361199e8460cf60009054906101000a90046001600160a01b03166001600160a01b0316633e742e3b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561196157600080fd5b505afa158015611975573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611999919061448c565b612b99565b6127b1565b1192915050565b6000806119d86119bd84608001516127b1565b670de0b6b3a76400006119d386604001516127b1565b6127da565b90506000670de0b6b3a76400008211611a27576000611a0d6119f984612c76565b606087015190670de0b6b3a7640000612cc2565b60a0860151909150611a1f90826128d9565b915050611a58565b60a0840151600090611a4290670de0b6b3a764000085612cc2565b6060860151909150611a5490826128d9565b9150505b9392505050565b3390565b6067546001600160a01b0316611a77611a5f565b6001600160a01b031614611a9d5760405162461bcd60e51b815260040161060d906146aa565b565b611aa7613ce1565b6000806000846001600160a01b03166347535d7b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae557600080fd5b505afa158015611af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1d91906140c1565b9050600081611b9c57856001600160a01b031663fe3434616040518163ffffffff1660e01b815260040160206040518083038186803b158015611b5f57600080fd5b505afa158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9791906140dd565b611ba4565b611ba4611fee565b6001600160a01b038716600090815260d160205260408120549192509015611c9e5760cf60009054906101000a90046001600160a01b03166001600160a01b0316633e742e3b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c1457600080fd5b505afa158015611c28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4c919061448c565b6001600160a01b038816600090815260d1602052604081205491925090611c7d90611c78908590612d5a565b612db7565b90508063ffffffff168263ffffffff1611611c985781611c9a565b805b9150505b60008315611d4757611cc1611cb3898461293e565b6001600160a01b0316612dfc565b604051631208064760e01b81529091506001600160a01b03891690631208064790611cf0908590600401614a28565b60206040518083038186803b158015611d0857600080fd5b505afa158015611d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4091906140dd565b9450611e65565b6000611d5e611c7885611d58611fee565b90612d5a565b609a5460405163bbe4f6db60e01b8152919250611dee91611cb3916001600160a01b03169063bbe4f6db90611d97908e90600401614508565b60206040518083038186803b158015611daf57600080fd5b505afa158015611dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de79190613e6a565b8386612e16565b9150886001600160a01b0316631c2ab4056040518163ffffffff1660e01b815260040160206040518083038186803b158015611e2957600080fd5b505afa158015611e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6191906140dd565b9550505b611e6e81612f7b565b6001600160a01b038916600090815260d2602090815260408083205460d39092529091209197509084821480611ea2575081155b15611ec6576040805180820190915281548152600182015460208201529850611f3d565b6000611ef5611edd611ed88886612d5a565b612c76565b611eef86611eea8c612f94565b612fad565b906130b4565b8254909150611f0490826128d9565b8a52611f36611f2b82600160601b611f1d8f600061293e565b6001600160a01b0316612cc2565b6001840154906128d9565b60208b0152505b5050505050509193909250565b60cd54604051633fe1339b60e11b815260009182916001600160a01b0390911690637fc2673690611f83908a908a908890600401614536565b602060405180830381600087803b158015611f9d57600080fd5b505af1158015611fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd591906140dd565b9050611fe385858584612b4c565b979650505050505050565b4290565b600082820183811015611337576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b609a5460405163bbe4f6db60e01b81526000918291612083916001600160a01b03169063bbe4f6db90610ded908790600401614508565b509398975050505050505050565b6001600160a01b038316600090815260d0602090815260408083205460d490925282205460029190910b9062ffffff1682856120cf578183036120d3565b8183015b9050620d89e8600282900b136120e957806120ee565b620d89e75b9050620d89e719600282900b12612105578061210b565b620d89e6195b905060006121188261315d565b90506001600160a01b038616612133579350611a5892505050565b861561216557856001600160a01b0316816001600160a01b031611612158578061215a565b855b945050505050611a58565b856001600160a01b0316816001600160a01b0316106121845780612186565b855b98975050505050505050565b61219a613d5f565b609a5482516020840151604051638866c9dd60e01b81526000936001600160a01b031692638866c9dd926121d09260040161451c565b60a06040518083038186803b1580156121e857600080fd5b505afa1580156121fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222091906141e6565b9050600080612246856040015186606001518760a0015186602001518760400151613485565b9150915060006122598660200151611a9f565b50509050600060cd60009054906101000a90046001600160a01b03166001600160a01b03166367267e8a6040518061014001604052808a602001516001600160a01b031681526020018a60400151151581526020016001151581526020018681526020018a60c001516001600160a01b03168152602001886020015162ffffff168152602001886040015162ffffff16815260200185815260200188600001516001600160a01b03168152602001886060015162ffffff168152506040518263ffffffff1660e01b81526004016123309190614869565b606060405180830381600087803b15801561234a57600080fd5b505af115801561235e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238291906142e3565b9050600061239588602001516000612b99565b905060006124916040518060e0016040528089600001516001600160a01b03168152602001606760009054906101000a90046001600160a01b03166001600160a01b031681526020018b60400151151581526020018b60600151151581526020018881526020018b60c001516001600160a01b031681526020016040518060a001604052808d600001516001600160a01b031681526020018d602001516001600160a01b031681526020018b600001516001600160a01b031681526020018b6040015162ffffff168152602001876020015181525060405160200161247a9190614928565b604051602081830303815290604052815250613511565b905060006124a2886000015161373b565b9050836000015160020b8160020b146124cd5760405162461bcd60e51b815260040161060d9061470c565b60006124de8b602001516000612b99565b905060006124f48a6080015162ffffff16612c76565b90508161250986612504846137bb565b6137e7565b13158015612520575061251c85826137fd565b8213155b61253c5760405162461bcd60e51b815260040161060d906147c9565b50506000808b604001511561257d5761256761256285600001518c60400151600061380d565b613854565b91506125768460200151612c76565b90506125e3565b835161258890612c76565b91508b60600151801561259e5750888460200151145b156125c9576125766125c4611ed888602001518f60a00151612d5a90919063ffffffff16565b6137bb565b6125e061256285602001518c60400151600061380d565b90505b6020808d01516001600160a01b0316600090815260d1909152604090205461262c5761260d611fee565b6020808e01516001600160a01b0316600090815260d190915260409020555b6040518060e0016040528083815260200161265461264d8960200151612c76565b8490613868565b81526020018381526020018281526020018760200151815260200187604001518152602001876000015160020b8152509a5050505050505050505050919050565b6001600160a01b038216600090815260d4602090815260408083205460d090925282205462ffffff90911690600290810b9083906126df906126da9084900b856128d9565b6138cd565b905060006126f96126da600285900b62ffffff8716613868565b90508060020b8660020b1280611fe357508160020b8660020b13979650505050505050565b6000806000806000806000876001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561276257600080fd5b505afa158015612776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279a91906143dd565b959e949d50929b5090995097509550909350915050565b6000808212156127d1576127cc6127c7836137bb565b613910565b61133a565b61133a82613910565b6000808060001985870986860292508281109083900303905080612810576000841161280557600080fd5b508290049050611a58565b80841161281c57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b8062ffffff8116811461042a5760405162461bcd60e51b8152600401808060200182810382526026815260200180614c126026913960400191505060405180910390fd5b3b151590565b6103e890565b60008282018183128015906128ee5750838112155b80612903575060008312801561290357508381125b6113375760405162461bcd60e51b8152600401808060200182810382526021815260200180614ac06021913960400191505060405180910390fd5b609a5460405163bbe4f6db60e01b8152600091611337916001600160a01b039091169063bbe4f6db90612975908790600401614508565b60206040518083038186803b15801561298d57600080fd5b505afa1580156129a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c59190613e6a565b83613967565b60006129d6306128cd565b15905090565b600054610100900460ff16806129f557506129f56129cb565b80612a03575060005460ff16155b612a3e5760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff16158015612a69576000805460ff1961ff0019909116610100171660011790555b612a71613975565b8015612a83576000805461ff00191690555b50565b600054610100900460ff1680612a9f5750612a9f6129cb565b80612aad575060005460ff16155b612ae85760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff16158015612b13576000805460ff1961ff0019909116610100171660011790555b612b1b613a64565b609a80546001600160a01b0319166001600160a01b0384161790558015612b48576000805461ff00191690555b5050565b600080612b7486612b6a87876000015161386890919063ffffffff16565b600160601b612cc2565b9050612b8d62015180612b8785846128d9565b90613af9565b9150505b949350505050565b600080612bb2612bad611cb386600061293e565b612f7b565b90506000846001600160a01b03166312080647856040518263ffffffff1660e01b8152600401612be29190614a28565b60206040518083038186803b158015612bfa57600080fd5b505afa158015612c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c3291906140dd565b90506000818311612c4f57612c4a6125628385612d5a565b612c5c565b612c5c611ed88484612d5a565b9050612c6c81620f424084612cc2565b9695505050505050565b60006001600160ff1b03821115612cbe5760405162461bcd60e51b8152600401808060200182810382526028815260200180614bc66028913960400191505060405180910390fd5b5090565b60008060008512612cd35784612cdc565b612cdc856137bb565b90506000808512612ced5784612cf6565b612cf6856137bb565b905060008087128015612d095750600086135b80612d1f5750600087138015612d1f5750600086125b612d2a576000612d2d565b60015b90506000612d3c8484886127da565b905081612d5157612d4c81612c76565b612186565b61218681613854565b600082821115612db1576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b8063ffffffff8116811461042a5760405162461bcd60e51b8152600401808060200182810382526026815260200180614ba06026913960400191505060405180910390fd5b600061133a6001600160a01b03831680600160601b6127da565b6000600a8263ffffffff161015612e42576000612e328561271e565b50949650611a5895505050505050565b60408051600280825260608201835260009260208301908036833701905050905082840181600081518110612e7357fe5b602002602001019063ffffffff16908163ffffffff16815250508381600181518110612e9b57fe5b63ffffffff9092166020928302919091019091015260405163883bdbfd60e01b81526000906001600160a01b0387169063883bdbfd90612edf9085906004016145da565b60006040518083038186803b158015612ef757600080fd5b505afa158015612f0b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f339190810190613ffa565b509050612c6c8463ffffffff1682600081518110612f4d57fe5b602002602001015183600181518110612f6257fe5b60200260200101510360060b81612f7557fe5b0561315d565b600061133a82670de0b6b3a7640000600160601b6127da565b600061133a82600160601b670de0b6b3a76400006127da565b60008060cf60009054906101000a90046001600160a01b03166001600160a01b0316636e1d2dd26040518163ffffffff1660e01b815260040160206040518083038186803b158015612ffe57600080fd5b505afa158015613012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130369190614470565b905060006130448483613bb1565b90506000848611156130815761305a8686612d5a565b90508181116130715761306c81612c76565b61307a565b61307a82612c76565b93506130ab565b61308b8587612d5a565b90508181116130a25761309d81613854565b612c6c565b612c6c82613854565b50505092915050565b6000826130c35750600061133a565b826000191480156130d75750600160ff1b82145b156131135760405162461bcd60e51b8152600401808060200182810382526027815260200180614b796027913960400191505060405180910390fd5b8282028284828161312057fe5b05146113375760405162461bcd60e51b8152600401808060200182810382526027815260200180614b796027913960400191505060405180910390fd5b60008060008360020b12613174578260020b61317c565b8260020b6000035b9050620d89e88111156131ba576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b6000600182166131ce57600160801b6131e0565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b03169050600282161561320a576ffff97272373d413259a46990580e213a0260801c5b6004821615613229576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615613248576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615613267576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615613286576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156132a5576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156132c4576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156132e4576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615613304576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615613324576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615613344576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615613364576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615613384576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156133a4576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156133c4576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156133e5576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615613405576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615613424576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615613441576b048a170391f7dc42444e8fa20260801c5b60008460020b131561345c57806000198161345857fe5b0490505b640100000000810615613470576001613473565b60005b60ff16602082901c0192505050919050565b60008086156134b757856134a45761349f8585600161380d565b6134b0565b6134b08584600161380d565b91506134d2565b856134c257846134cf565b6134cf8584866001613bc6565b91505b866134e5576134e085612c76565b6134ee565b6134ee82612c76565b905085613503576134fe816137bb565b613505565b805b90509550959350505050565b613519613ce1565b60008260600151613536576135318360800151613854565b613543565b6135438360800151612c76565b905060008084600001516001600160a01b031663128acb0886602001518760400151868960a001516001600160a01b0316600014613585578960a001516135af565b89604001516135a85773fffd8963efd1fc6a506488495d951d5263988d256135af565b6401000276a45b8a60c001516040518663ffffffff1660e01b81526004016135d495949392919061455b565b6040805180830381600087803b1580156135ed57600080fd5b505af1158015613601573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061362591906140f5565b91509150600080613635846127b1565b61363e846127b1565b91509150600087604001511515886060015115151461365d578161365f565b825b9050876060015115801561367e575060a08801516001600160a01b0316155b1561371f57600a886080015182116136a457608089015161369f9083612d5a565b6136b4565b60808901516136b4908390612d5a565b106136d15760405162461bcd60e51b815260040161060d90614809565b87604001516136f85760405180604001604052808960800151815260200183815250613712565b604051806040016040528084815260200189608001518152505b965050505050505061042a565b5060408051808201909152918252602082015295945050505050565b6000816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561377657600080fd5b505afa15801561378a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ae91906143dd565b5093979650505050505050565b6000600160ff1b82136137e05760405162461bcd60e51b815260040161060d90614792565b5060000390565b60008183126137f65781611337565b5090919050565b6000818312156137f65781611337565b600081613838576138338461382a620f424062ffffff8716612d5a565b620f42406127da565b612b91565b612b9184620f424061384f8162ffffff8816612d5a565b613c07565b600061385f82612c76565b60000392915050565b600081830381831280159061387d5750838113155b80613892575060008312801561389257508381135b6113375760405162461bcd60e51b8152600401808060200182810382526024815260200180614bee6024913960400191505060405180910390fd5b80600281900b811461042a5760405162461bcd60e51b8152600401808060200182810382526029815260200180614ae16029913960400191505060405180910390fd5b600080821215612cbe576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b600061133783600084612e16565b600054610100900460ff168061398e575061398e6129cb565b8061399c575060005460ff16155b6139d75760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff16158015613a02576000805460ff1961ff0019909116610100171660011790555b613a0a613a64565b6000613a14611a5f565b603380546001600160a01b0319166001600160a01b03831690811790915560405191925090600090600080516020614b59833981519152908290a3508015612a83576000805461ff001916905550565b600054610100900460ff1680613a7d5750613a7d6129cb565b80613a8b575060005460ff16155b613ac65760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff16158015613af1576000805460ff1961ff0019909116610100171660011790555b612a71613c41565b600081613b4d576040805162461bcd60e51b815260206004820181905260248201527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604482015290519081900360640190fd5b81600019148015613b615750600160ff1b83145b15613b9d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614b386021913960400191505060405180910390fd5b6000828481613ba857fe5b05949350505050565b6000611337838362ffffff16620f42406127da565b600080600083613bd7578585613bda565b84865b9092509050611fe387613bf5620f424062ffffff8616612d5a565b61384f620f424062ffffff8616612d5a565b6000613c148484846127da565b905060008280613c2057fe5b8486091115611a58576000198110613c3757600080fd5b6001019392505050565b600054610100900460ff1680613c5a5750613c5a6129cb565b80613c68575060005460ff16155b613ca35760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff16158015612a71576000805460ff1961ff0019909116610100171660011790558015612a83576000805461ff001916905550565b604051806040016040528060008152602001600081525090565b6040518061016001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060020b8152602001600015158152602001600062ffffff1681525090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060020b81525090565b803561042a81614a79565b600082601f830112613dba578081fd5b81516020613dcf613dca83614a5c565b614a39565b8281528181019085830183850287018401881015613deb578586fd5b855b85811015613e12578151613e0081614a79565b84529284019290840190600101613ded565b5090979650505050505050565b803561042a81614a8e565b8051600281900b811461042a57600080fd5b805161ffff8116811461042a57600080fd5b600060208284031215613e5f578081fd5b813561133781614a79565b600060208284031215613e7b578081fd5b815161133781614a79565b60008060408385031215613e98578081fd5b8235613ea381614a79565b91506020830135613eb381614a79565b809150509250929050565b600080600060608486031215613ed2578081fd5b8335613edd81614a79565b92506020840135613eed81614a79565b91506040840135613efd81614a79565b809150509250925092565b60008060408385031215613f1a578182fd5b8235613f2581614a79565b91506020830135613eb381614a9c565b60008060408385031215613f47578182fd5b8235613f5281614a79565b91506020830135613eb381614aad565b60006020808385031215613f74578182fd5b82516001600160401b03811115613f89578283fd5b8301601f81018513613f99578283fd5b8051613fa7613dca82614a5c565b8181528381019083850185840285018601891015613fc3578687fd5b8694505b83851015613fee578051613fda81614a79565b835260019490940193918501918501613fc7565b50979650505050505050565b6000806040838503121561400c578182fd5b82516001600160401b0380821115614022578384fd5b818501915085601f830112614035578384fd5b81516020614045613dca83614a5c565b82815281810190858301838502870184018b1015614061578889fd5b8896505b848710156140915780518060060b811461407d57898afd5b835260019690960195918301918301614065565b50918801519196509093505050808211156140aa578283fd5b506140b785828601613daa565b9150509250929050565b6000602082840312156140d2578081fd5b815161133781614a8e565b6000602082840312156140ee578081fd5b5051919050565b60008060408385031215614107578182fd5b505080516020909101519092909150565b6000806000806060858703121561412d578182fd5b843593506020850135925060408501356001600160401b0380821115614151578384fd5b818701915087601f830112614164578384fd5b813581811115614172578485fd5b886020828501011115614183578485fd5b95989497505060200194505050565b6000606082840312156141a3578081fd5b604051606081018181106001600160401b03821117156141bf57fe5b80604052508251815260208301516020820152604083015160408201528091505092915050565b600060a082840312156141f7578081fd5b60405160a081018181106001600160401b038211171561421357fe5b604052825161422181614a79565b8152602083015161423181614a9c565b6020820152604083015161424481614a9c565b6040820152606083015161425781614a9c565b6060820152608083015161426a81614a9c565b60808201529392505050565b600060808284031215614287578081fd5b604051608081018181106001600160401b03821117156142a357fe5b60405282356142b181614a79565b815260208301356142c181614a79565b6020820152604083810135908201526060928301359281019290925250919050565b6000606082840312156142f4578081fd5b604051606081018181106001600160401b038211171561431057fe5b60405261431c83613e2a565b815260208301516020820152604083015160408201528091505092915050565b600060e0828403121561434d578081fd5b60405160e081018181106001600160401b038211171561436957fe5b60405261437583613d9f565b815261438360208401613d9f565b602082015261439460408401613e1f565b60408201526143a560608401613e1f565b60608201526143b660808401613e1f565b608082015260a083013560a08201526143d160c08401613d9f565b60c08201529392505050565b600080600080600080600060e0888a0312156143f7578485fd5b875161440281614a79565b965061441060208901613e2a565b955061441e60408901613e3c565b945061442c60608901613e3c565b935061443a60808901613e3c565b925060a088015160ff8116811461444f578283fd5b60c089015190925061446081614a8e565b8091505092959891949750929550565b600060208284031215614481578081fd5b815161133781614a9c565b60006020828403121561449d578081fd5b815161133781614aad565b600080604083850312156144ba578182fd5b82516144c581614aad565b6020840151909250613eb381614aad565b6001600160a01b03169052565b15159052565b60020b9052565b80518252602090810151910152565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0384811682528316602082015260808101612b9160408301846144f0565b600060018060a01b038088168352602087151581850152866040850152818616606085015260a06080850152845191508160a0850152825b828110156145af5785810182015185820160c001528101614593565b828111156145c0578360c084870101525b5050601f01601f19169190910160c0019695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561461857835163ffffffff16835292840192918401916001016145f6565b50909695505050505050565b901515815260200190565b90815260200190565b60008582528460208301526060604083015282606083015282846080840137818301608090810191909152601f909201601f191601019392505050565b82815260608101611a5860208301846144f0565b60208082526007908201526645585f42544e4560c81b604082015260600190565b6020808252600790820152660869088be9e86960cb1b604082015260600190565b60208082526008908201526745585f4f504c415360c01b604082015260600190565b6020808252600590820152640455f4142360dc1b604082015260600190565b60208082526007908201526645585f544b4d4d60c81b604082015260600190565b602080825260069082015265455f4f424e4360d01b604082015260600190565b6020808252600a908201526922ac2fa6aa21a627a7a960b11b604082015260600190565b6020808252600790820152662aa1a12fa321ab60c91b604082015260600190565b6020808252601c908201527f506572704d6174683a20696e76657273696f6e206f766572666c6f7700000000604082015260600190565b60208082526006908201526522ac2fa7a82160d11b604082015260600190565b602080825260069082015265455f43484e4360d01b604082015260600190565b60208082526006908201526555425f554f4160d01b604082015260600190565b602080825260069082015265045585f4d49560d41b604082015260600190565b60208082526006908201526545585f424e4360d01b604082015260600190565b60006101608201905061487d8284516144d6565b602083015161488f60208401826144e3565b5060408301516148a260408401826144e3565b506060830151606083015260808301516148bf60808401826144d6565b5060a08301516148d260a08401826144ff565b5060c08301516148e560c08401826144ff565b5060e08301516148f860e08401826144f0565b5061010083015161012061490e818501836144d6565b84015190506149216101408401826144ff565b5092915050565b81516001600160a01b0390811682526020808401518216908301526040808401519091169082015260608083015162ffffff16908201526080918201519181019190915260a00190565b600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e0830152610100808401516149d8828501826144e9565b5050610120808401516149ed828501826144e3565b505061014080840151614a02828501826144ff565b505092915050565b62ffffff91909116815260200190565b918252602082015260400190565b63ffffffff91909116815260200190565b6040518181016001600160401b0381118282101715614a5457fe5b604052919050565b60006001600160401b03821115614a6f57fe5b5060209081020190565b6001600160a01b0381168114612a8357600080fd5b8015158114612a8357600080fd5b62ffffff81168114612a8357600080fd5b63ffffffff81168114612a8357600080fdfe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20616e2032342062697473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65645369676e6564536166654d6174683a206469766973696f6e206f766572666c6f778be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e203332206269747353616665436173743a2076616c756520646f65736e27742066697420696e20616e20696e743235365369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e2032342062697473a2646970667358221220d929b893509a3a906eaf97a0938c2686b12714c7b4bbd75ada057e4aef378aab64736f6c63430007060033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101585760003560e01c80638da5cb5b116100c3578063c575ff791161007c578063c575ff79146102b3578063c66b8ed2146102bb578063cb379aa2146102c3578063dc7e7e1614610275578063fa461e33146102d6578063ff818011146102e957610158565b80638da5cb5b1461026d57806399e4a77114610275578063aa2a829414610288578063b248c4ef14610290578063bc5920ba14610298578063c0c53b8b146102a057610158565b8063449323d811610115578063449323d81461020f5780635eb8a4e6146102225780636896fabf146102355780636c8381f81461024a578063715018a61461025257806380f57f111461025a57610158565b80631393a4691461015d57806313af403514610186578063199387cc1461019b5780631e81ac33146101ae57806329386b7b146101cf5780634314ca1c146101ef575b600080fd5b61017061016b366004614276565b610309565b60405161017d919061462f565b60405180910390f35b610199610194366004613e4e565b61042f565b005b6101996101a9366004613e4e565b61058a565b6101c16101bc366004613e86565b61066c565b60405161017d929190614675565b6101e26101dd366004613e4e565b610b36565b60405161017d9190614a0a565b6102026101fd36600461433c565b610b56565b60405161017d9190614972565b61019961021d366004613e4e565b610f27565b610199610230366004613f08565b610fce565b61023d61118b565b60405161017d9190614508565b61023d61119a565b6101996111a9565b610170610268366004613e4e565b61124a565b61023d61131c565b61023d610283366004613f35565b61132b565b61023d611340565b61023d61134f565b61019961135e565b6101996102ae366004613ebe565b61144a565b61023d61158c565b61023d61159b565b6101706102d1366004613e86565b6115aa565b6101996102e4366004614118565b611761565b6102fc6102f7366004613e4e565b611901565b60405161017d9190614624565b60ce54815160208301516040516331997f7b60e11b815260009384936001600160a01b0390911692636332fef69261034592919060040161451c565b60606040518083038186803b15801561035d57600080fd5b505afa158015610371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103959190614192565b6020810151815191925090600081156103bb5760408601516000808412911214156103be565b60005b9050806103cc576000610423565b6104236040518060c0016040528088600001516001600160a01b0316815260200188602001516001600160a01b031681526020018481526020018581526020018860400151815260200188606001518152506119aa565b9450505050505b919050565b610437611a5f565b6001600160a01b031661044861131c565b6001600160a01b03161461048c576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6001600160a01b0381166104d0576040805162461bcd60e51b81526020600482015260066024820152650534f5f4e57360d41b604482015290519081900360640190fd5b6033546001600160a01b038281169116141561051c576040805162461bcd60e51b8152602060048201526006602482015265534f5f53414f60d01b604482015290519081900360640190fd5b6034546001600160a01b0382811691161415610568576040805162461bcd60e51b8152602060048201526006602482015265534f5f53414360d01b604482015290519081900360640190fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b610592611a5f565b6001600160a01b03166105a361131c565b6001600160a01b0316146105e7576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6001600160a01b0381166106165760405162461bcd60e51b815260040161060d906146ed565b60405180910390fd5b60ce80546001600160a01b0319166001600160a01b0383161790556040517f2b28168781da733c8a034f84683b9c955f156de5e07e24920b1348f51445d3e690610661908390614508565b60405180910390a150565b6000610676613ce1565b61067e611a63565b609a54604051631246dbf560e01b81526001600160a01b0390911690631246dbf5906106ae908690600401614508565b60206040518083038186803b1580156106c657600080fd5b505afa1580156106da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fe91906140c1565b61071a5760405162461bcd60e51b815260040161060d90614689565b60cf546040805163b0a336a760e01b815281516000936001600160a01b03169263b0a336a79260048082019391829003018186803b15801561075b57600080fd5b505afa15801561076f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079391906144a8565b604051630e8d088d60e11b81529092506001600160a01b0386169150631d1a111a906107c3908490600401614a28565b600060405180830381600087803b1580156107dd57600080fd5b505af19250505080156107ee575060015b506000806107fb86611a9f565b60ce546040516359deb70960e11b8152939750919450925061091991899189916001600160a01b039091169063b3bd6e129061083d908590859060040161451c565b60206040518083038186803b15801561085557600080fd5b505afa158015610869573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088d91906140dd565b60ce546040516331997f7b60e11b81526001600160a01b0390911690636332fef6906108bf908e908e9060040161451c565b60606040518083038186803b1580156108d757600080fd5b505afa1580156108eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090f9190614192565b6040015188611f4a565b94506000866001600160a01b03166347535d7b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561095657600080fd5b505afa15801561096a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098e91906140c1565b610a0857866001600160a01b031663fe3434616040518163ffffffff1660e01b815260040160206040518083038186803b1580156109cb57600080fd5b505afa1580156109df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0391906140dd565b610a10565b610a10611fee565b6001600160a01b038816600090815260d260205260409020549091508114610aa8576001600160a01b038716600081815260d36020908152604080832089518a84015160d290945293829020600182019390935592835590849055519091907f54e4482fe1d38392effe5d53f0e9e72f60221a75a10cea7abbb684bfb03519bf90610a9e9087908790614a1a565b60405180910390a2505b6001600160a01b038716600090815260d66020526040902054610acc81600f611ff2565b8210610b2a576001600160a01b038816600090815260d660205260409020829055610af68861204c565b6001600160a01b038916600090815260d060205260409020805460029290920b62ffffff1662ffffff199092169190911790555b50505050509250929050565b6001600160a01b0316600090815260d4602052604090205462ffffff1690565b610b5e613cfb565b610b66611a63565b6020808301516001600160a01b0316600090815260d4909152604090205462ffffff16610ba55760405162461bcd60e51b815260040161060d90614829565b60ce548251602084015160405163165c4e2960e31b81526000936001600160a01b03169263b2e2714892610bdb9260040161451c565b60206040518083038186803b158015610bf357600080fd5b505afa158015610c07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2b91906140dd565b60ce548451602086015160405163d50d01b760e01b81529394506000936001600160a01b039093169263d50d01b792610c6892909160040161451c565b60206040518083038186803b158015610c8057600080fd5b505afa158015610c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb891906140dd565b608085015190915060008312908015610cd057508215155b15610cf757610ce88560200151828760c00151612091565b6001600160a01b031660c08601525b6000610d0286612192565b9050610d1686602001518260c00151612695565b15610d335760405162461bcd60e51b815260040161060d906146cb565b60008415610d4c57866040015115158315151415610d4f565b60005b905060008115610db357610db06040518060c001604052808a600001516001600160a01b031681526020018a602001516001600160a01b031681526020018881526020018781526020018560000151815260200185602001518152506119aa565b90505b609a54602089015160405163bbe4f6db60e01b8152600092610e42926001600160a01b039091169163bbe4f6db91610ded91600401614508565b60206040518083038186803b158015610e0557600080fd5b505afa158015610e19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3d9190613e6a565b61271e565b5050505050506001600160a01b031690506000610e6285600001516127b1565b9050604051806101600160405280828152602001610e8387602001516127b1565b81526020018660400151815260200186606001518152602001866080015181526020018660a0015181526020018481526020018381526020018660c0015160020b81526020018b60800151610ed9576000610ee1565b8b60a0015183105b151581526020018b60800151610ef8576000610f12565b610f12610f0d84620f42408f60a001516127da565b612889565b62ffffff1690529a9950505050505050505050565b610f2f611a5f565b6001600160a01b0316610f4061131c565b6001600160a01b031614610f84576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b606780546001600160a01b0319166001600160a01b0383169081179091556040517fd0654f5900f9e7e4e605a19334306e6a2786bbf960ac0484a4c12feb6428fe2f90600090a250565b610fd6611a5f565b6001600160a01b0316610fe761131c565b6001600160a01b03161461102b576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b61103d826001600160a01b03166128cd565b6110595760405162461bcd60e51b815260040161060d90614849565b609a54604051631246dbf560e01b81526001600160a01b0390911690631246dbf590611089908590600401614508565b60206040518083038186803b1580156110a157600080fd5b505afa1580156110b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d991906140c1565b6110f55760405162461bcd60e51b815260040161060d90614689565b6110fd6128d3565b62ffffff168162ffffff1611156111265760405162461bcd60e51b815260040161060d9061474d565b6001600160a01b038216600081815260d4602052604090819020805462ffffff191662ffffff8516179055517f998d553f208e581d188c66da9e7d19bac5ca64d002753791210c4271c8e955d09061117f908490614a0a565b60405180910390a25050565b60ce546001600160a01b031690565b6034546001600160a01b031690565b6111b1611a5f565b6001600160a01b03166111c261131c565b6001600160a01b031614611206576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6033546040516000916001600160a01b031690600080516020614b59833981519152908390a3603380546001600160a01b0319908116909155603480549091169055565b60ce546040516357ba739b60e11b815260009182916001600160a01b039091169063af74e7369061127f908690600401614508565b60006040518083038186803b15801561129757600080fd5b505afa1580156112ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112d39190810190613f62565b805190915060005b818110156113145761130a611303868584815181106112f657fe5b60200260200101516115aa565b85906128d9565b93506001016112db565b505050919050565b6033546001600160a01b031690565b6000611337838361293e565b90505b92915050565b60cf546001600160a01b031690565b60cd546001600160a01b031690565b6034546001600160a01b03166113a3576040805162461bcd60e51b81526020600482015260056024820152640534f5f43360dc1b604482015290519081900360640190fd5b6113ab611a5f565b6034546001600160a01b039081169116146113f6576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4360d01b604482015290519081900360640190fd5b6034546033546040516001600160a01b039283169290911690600080516020614b5983398151915290600090a360348054603380546001600160a01b03199081166001600160a01b03841617909155169055565b600054610100900460ff168061146357506114636129cb565b80611471575060005460ff16155b6114ac5760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff161580156114d7576000805460ff1961ff0019909116610100171660011790555b6114df6129dc565b6114e884612a86565b6114fa836001600160a01b03166128cd565b6115165760405162461bcd60e51b815260040161060d9061472d565b611528826001600160a01b03166128cd565b6115445760405162461bcd60e51b815260040161060d906147e9565b60cd80546001600160a01b038086166001600160a01b03199283161790925560cf8054928516929091169190911790558015611586576000805461ff00191690555b50505050565b6067546001600160a01b031690565b609a546001600160a01b031690565b6000806115b683611a9f565b505060cd546040516347b52fb760e01b81529192506000916001600160a01b03909116906347b52fb7906115f290889088908790600401614536565b60206040518083038186803b15801561160a57600080fd5b505afa15801561161e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164291906140dd565b60ce546040516359deb70960e11b8152919250611758916001600160a01b039091169063b3bd6e129061167b908990899060040161451c565b60206040518083038186803b15801561169357600080fd5b505afa1580156116a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cb91906140dd565b60ce546040516331997f7b60e11b81526001600160a01b0390911690636332fef6906116fd908a908a9060040161451c565b60606040518083038186803b15801561171557600080fd5b505afa158015611729573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174d9190614192565b604001518484612b4c565b95945050505050565b600061176b611a5f565b90506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156117a857600080fd5b505afa1580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e09190613e6a565b609a5460405163bbe4f6db60e01b81529192506001600160a01b03169063bbe4f6db90611811908490600401614508565b60206040518083038186803b15801561182957600080fd5b505afa15801561183d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118619190613e6a565b6001600160a01b0316826001600160a01b0316146118915760405162461bcd60e51b815260040161060d90614771565b60675460405163fa461e3360e01b81526001600160a01b039091169063fa461e33906118c7908990899089908990600401614638565b600060405180830381600087803b1580156118e157600080fd5b505af11580156118f5573d6000803e3d6000fd5b50505050505050505050565b6000620186a062ffffff166119a361199e8460cf60009054906101000a90046001600160a01b03166001600160a01b0316633e742e3b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561196157600080fd5b505afa158015611975573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611999919061448c565b612b99565b6127b1565b1192915050565b6000806119d86119bd84608001516127b1565b670de0b6b3a76400006119d386604001516127b1565b6127da565b90506000670de0b6b3a76400008211611a27576000611a0d6119f984612c76565b606087015190670de0b6b3a7640000612cc2565b60a0860151909150611a1f90826128d9565b915050611a58565b60a0840151600090611a4290670de0b6b3a764000085612cc2565b6060860151909150611a5490826128d9565b9150505b9392505050565b3390565b6067546001600160a01b0316611a77611a5f565b6001600160a01b031614611a9d5760405162461bcd60e51b815260040161060d906146aa565b565b611aa7613ce1565b6000806000846001600160a01b03166347535d7b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae557600080fd5b505afa158015611af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1d91906140c1565b9050600081611b9c57856001600160a01b031663fe3434616040518163ffffffff1660e01b815260040160206040518083038186803b158015611b5f57600080fd5b505afa158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9791906140dd565b611ba4565b611ba4611fee565b6001600160a01b038716600090815260d160205260408120549192509015611c9e5760cf60009054906101000a90046001600160a01b03166001600160a01b0316633e742e3b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c1457600080fd5b505afa158015611c28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4c919061448c565b6001600160a01b038816600090815260d1602052604081205491925090611c7d90611c78908590612d5a565b612db7565b90508063ffffffff168263ffffffff1611611c985781611c9a565b805b9150505b60008315611d4757611cc1611cb3898461293e565b6001600160a01b0316612dfc565b604051631208064760e01b81529091506001600160a01b03891690631208064790611cf0908590600401614a28565b60206040518083038186803b158015611d0857600080fd5b505afa158015611d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4091906140dd565b9450611e65565b6000611d5e611c7885611d58611fee565b90612d5a565b609a5460405163bbe4f6db60e01b8152919250611dee91611cb3916001600160a01b03169063bbe4f6db90611d97908e90600401614508565b60206040518083038186803b158015611daf57600080fd5b505afa158015611dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de79190613e6a565b8386612e16565b9150886001600160a01b0316631c2ab4056040518163ffffffff1660e01b815260040160206040518083038186803b158015611e2957600080fd5b505afa158015611e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6191906140dd565b9550505b611e6e81612f7b565b6001600160a01b038916600090815260d2602090815260408083205460d39092529091209197509084821480611ea2575081155b15611ec6576040805180820190915281548152600182015460208201529850611f3d565b6000611ef5611edd611ed88886612d5a565b612c76565b611eef86611eea8c612f94565b612fad565b906130b4565b8254909150611f0490826128d9565b8a52611f36611f2b82600160601b611f1d8f600061293e565b6001600160a01b0316612cc2565b6001840154906128d9565b60208b0152505b5050505050509193909250565b60cd54604051633fe1339b60e11b815260009182916001600160a01b0390911690637fc2673690611f83908a908a908890600401614536565b602060405180830381600087803b158015611f9d57600080fd5b505af1158015611fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd591906140dd565b9050611fe385858584612b4c565b979650505050505050565b4290565b600082820183811015611337576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b609a5460405163bbe4f6db60e01b81526000918291612083916001600160a01b03169063bbe4f6db90610ded908790600401614508565b509398975050505050505050565b6001600160a01b038316600090815260d0602090815260408083205460d490925282205460029190910b9062ffffff1682856120cf578183036120d3565b8183015b9050620d89e8600282900b136120e957806120ee565b620d89e75b9050620d89e719600282900b12612105578061210b565b620d89e6195b905060006121188261315d565b90506001600160a01b038616612133579350611a5892505050565b861561216557856001600160a01b0316816001600160a01b031611612158578061215a565b855b945050505050611a58565b856001600160a01b0316816001600160a01b0316106121845780612186565b855b98975050505050505050565b61219a613d5f565b609a5482516020840151604051638866c9dd60e01b81526000936001600160a01b031692638866c9dd926121d09260040161451c565b60a06040518083038186803b1580156121e857600080fd5b505afa1580156121fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222091906141e6565b9050600080612246856040015186606001518760a0015186602001518760400151613485565b9150915060006122598660200151611a9f565b50509050600060cd60009054906101000a90046001600160a01b03166001600160a01b03166367267e8a6040518061014001604052808a602001516001600160a01b031681526020018a60400151151581526020016001151581526020018681526020018a60c001516001600160a01b03168152602001886020015162ffffff168152602001886040015162ffffff16815260200185815260200188600001516001600160a01b03168152602001886060015162ffffff168152506040518263ffffffff1660e01b81526004016123309190614869565b606060405180830381600087803b15801561234a57600080fd5b505af115801561235e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238291906142e3565b9050600061239588602001516000612b99565b905060006124916040518060e0016040528089600001516001600160a01b03168152602001606760009054906101000a90046001600160a01b03166001600160a01b031681526020018b60400151151581526020018b60600151151581526020018881526020018b60c001516001600160a01b031681526020016040518060a001604052808d600001516001600160a01b031681526020018d602001516001600160a01b031681526020018b600001516001600160a01b031681526020018b6040015162ffffff168152602001876020015181525060405160200161247a9190614928565b604051602081830303815290604052815250613511565b905060006124a2886000015161373b565b9050836000015160020b8160020b146124cd5760405162461bcd60e51b815260040161060d9061470c565b60006124de8b602001516000612b99565b905060006124f48a6080015162ffffff16612c76565b90508161250986612504846137bb565b6137e7565b13158015612520575061251c85826137fd565b8213155b61253c5760405162461bcd60e51b815260040161060d906147c9565b50506000808b604001511561257d5761256761256285600001518c60400151600061380d565b613854565b91506125768460200151612c76565b90506125e3565b835161258890612c76565b91508b60600151801561259e5750888460200151145b156125c9576125766125c4611ed888602001518f60a00151612d5a90919063ffffffff16565b6137bb565b6125e061256285602001518c60400151600061380d565b90505b6020808d01516001600160a01b0316600090815260d1909152604090205461262c5761260d611fee565b6020808e01516001600160a01b0316600090815260d190915260409020555b6040518060e0016040528083815260200161265461264d8960200151612c76565b8490613868565b81526020018381526020018281526020018760200151815260200187604001518152602001876000015160020b8152509a5050505050505050505050919050565b6001600160a01b038216600090815260d4602090815260408083205460d090925282205462ffffff90911690600290810b9083906126df906126da9084900b856128d9565b6138cd565b905060006126f96126da600285900b62ffffff8716613868565b90508060020b8660020b1280611fe357508160020b8660020b13979650505050505050565b6000806000806000806000876001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561276257600080fd5b505afa158015612776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279a91906143dd565b959e949d50929b5090995097509550909350915050565b6000808212156127d1576127cc6127c7836137bb565b613910565b61133a565b61133a82613910565b6000808060001985870986860292508281109083900303905080612810576000841161280557600080fd5b508290049050611a58565b80841161281c57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b8062ffffff8116811461042a5760405162461bcd60e51b8152600401808060200182810382526026815260200180614c126026913960400191505060405180910390fd5b3b151590565b6103e890565b60008282018183128015906128ee5750838112155b80612903575060008312801561290357508381125b6113375760405162461bcd60e51b8152600401808060200182810382526021815260200180614ac06021913960400191505060405180910390fd5b609a5460405163bbe4f6db60e01b8152600091611337916001600160a01b039091169063bbe4f6db90612975908790600401614508565b60206040518083038186803b15801561298d57600080fd5b505afa1580156129a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c59190613e6a565b83613967565b60006129d6306128cd565b15905090565b600054610100900460ff16806129f557506129f56129cb565b80612a03575060005460ff16155b612a3e5760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff16158015612a69576000805460ff1961ff0019909116610100171660011790555b612a71613975565b8015612a83576000805461ff00191690555b50565b600054610100900460ff1680612a9f5750612a9f6129cb565b80612aad575060005460ff16155b612ae85760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff16158015612b13576000805460ff1961ff0019909116610100171660011790555b612b1b613a64565b609a80546001600160a01b0319166001600160a01b0384161790558015612b48576000805461ff00191690555b5050565b600080612b7486612b6a87876000015161386890919063ffffffff16565b600160601b612cc2565b9050612b8d62015180612b8785846128d9565b90613af9565b9150505b949350505050565b600080612bb2612bad611cb386600061293e565b612f7b565b90506000846001600160a01b03166312080647856040518263ffffffff1660e01b8152600401612be29190614a28565b60206040518083038186803b158015612bfa57600080fd5b505afa158015612c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c3291906140dd565b90506000818311612c4f57612c4a6125628385612d5a565b612c5c565b612c5c611ed88484612d5a565b9050612c6c81620f424084612cc2565b9695505050505050565b60006001600160ff1b03821115612cbe5760405162461bcd60e51b8152600401808060200182810382526028815260200180614bc66028913960400191505060405180910390fd5b5090565b60008060008512612cd35784612cdc565b612cdc856137bb565b90506000808512612ced5784612cf6565b612cf6856137bb565b905060008087128015612d095750600086135b80612d1f5750600087138015612d1f5750600086125b612d2a576000612d2d565b60015b90506000612d3c8484886127da565b905081612d5157612d4c81612c76565b612186565b61218681613854565b600082821115612db1576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b8063ffffffff8116811461042a5760405162461bcd60e51b8152600401808060200182810382526026815260200180614ba06026913960400191505060405180910390fd5b600061133a6001600160a01b03831680600160601b6127da565b6000600a8263ffffffff161015612e42576000612e328561271e565b50949650611a5895505050505050565b60408051600280825260608201835260009260208301908036833701905050905082840181600081518110612e7357fe5b602002602001019063ffffffff16908163ffffffff16815250508381600181518110612e9b57fe5b63ffffffff9092166020928302919091019091015260405163883bdbfd60e01b81526000906001600160a01b0387169063883bdbfd90612edf9085906004016145da565b60006040518083038186803b158015612ef757600080fd5b505afa158015612f0b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f339190810190613ffa565b509050612c6c8463ffffffff1682600081518110612f4d57fe5b602002602001015183600181518110612f6257fe5b60200260200101510360060b81612f7557fe5b0561315d565b600061133a82670de0b6b3a7640000600160601b6127da565b600061133a82600160601b670de0b6b3a76400006127da565b60008060cf60009054906101000a90046001600160a01b03166001600160a01b0316636e1d2dd26040518163ffffffff1660e01b815260040160206040518083038186803b158015612ffe57600080fd5b505afa158015613012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130369190614470565b905060006130448483613bb1565b90506000848611156130815761305a8686612d5a565b90508181116130715761306c81612c76565b61307a565b61307a82612c76565b93506130ab565b61308b8587612d5a565b90508181116130a25761309d81613854565b612c6c565b612c6c82613854565b50505092915050565b6000826130c35750600061133a565b826000191480156130d75750600160ff1b82145b156131135760405162461bcd60e51b8152600401808060200182810382526027815260200180614b796027913960400191505060405180910390fd5b8282028284828161312057fe5b05146113375760405162461bcd60e51b8152600401808060200182810382526027815260200180614b796027913960400191505060405180910390fd5b60008060008360020b12613174578260020b61317c565b8260020b6000035b9050620d89e88111156131ba576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b6000600182166131ce57600160801b6131e0565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b03169050600282161561320a576ffff97272373d413259a46990580e213a0260801c5b6004821615613229576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615613248576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615613267576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615613286576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156132a5576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156132c4576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156132e4576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615613304576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615613324576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615613344576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615613364576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615613384576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156133a4576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156133c4576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156133e5576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615613405576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615613424576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615613441576b048a170391f7dc42444e8fa20260801c5b60008460020b131561345c57806000198161345857fe5b0490505b640100000000810615613470576001613473565b60005b60ff16602082901c0192505050919050565b60008086156134b757856134a45761349f8585600161380d565b6134b0565b6134b08584600161380d565b91506134d2565b856134c257846134cf565b6134cf8584866001613bc6565b91505b866134e5576134e085612c76565b6134ee565b6134ee82612c76565b905085613503576134fe816137bb565b613505565b805b90509550959350505050565b613519613ce1565b60008260600151613536576135318360800151613854565b613543565b6135438360800151612c76565b905060008084600001516001600160a01b031663128acb0886602001518760400151868960a001516001600160a01b0316600014613585578960a001516135af565b89604001516135a85773fffd8963efd1fc6a506488495d951d5263988d256135af565b6401000276a45b8a60c001516040518663ffffffff1660e01b81526004016135d495949392919061455b565b6040805180830381600087803b1580156135ed57600080fd5b505af1158015613601573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061362591906140f5565b91509150600080613635846127b1565b61363e846127b1565b91509150600087604001511515886060015115151461365d578161365f565b825b9050876060015115801561367e575060a08801516001600160a01b0316155b1561371f57600a886080015182116136a457608089015161369f9083612d5a565b6136b4565b60808901516136b4908390612d5a565b106136d15760405162461bcd60e51b815260040161060d90614809565b87604001516136f85760405180604001604052808960800151815260200183815250613712565b604051806040016040528084815260200189608001518152505b965050505050505061042a565b5060408051808201909152918252602082015295945050505050565b6000816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561377657600080fd5b505afa15801561378a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ae91906143dd565b5093979650505050505050565b6000600160ff1b82136137e05760405162461bcd60e51b815260040161060d90614792565b5060000390565b60008183126137f65781611337565b5090919050565b6000818312156137f65781611337565b600081613838576138338461382a620f424062ffffff8716612d5a565b620f42406127da565b612b91565b612b9184620f424061384f8162ffffff8816612d5a565b613c07565b600061385f82612c76565b60000392915050565b600081830381831280159061387d5750838113155b80613892575060008312801561389257508381135b6113375760405162461bcd60e51b8152600401808060200182810382526024815260200180614bee6024913960400191505060405180910390fd5b80600281900b811461042a5760405162461bcd60e51b8152600401808060200182810382526029815260200180614ae16029913960400191505060405180910390fd5b600080821215612cbe576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b600061133783600084612e16565b600054610100900460ff168061398e575061398e6129cb565b8061399c575060005460ff16155b6139d75760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff16158015613a02576000805460ff1961ff0019909116610100171660011790555b613a0a613a64565b6000613a14611a5f565b603380546001600160a01b0319166001600160a01b03831690811790915560405191925090600090600080516020614b59833981519152908290a3508015612a83576000805461ff001916905550565b600054610100900460ff1680613a7d5750613a7d6129cb565b80613a8b575060005460ff16155b613ac65760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff16158015613af1576000805460ff1961ff0019909116610100171660011790555b612a71613c41565b600081613b4d576040805162461bcd60e51b815260206004820181905260248201527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604482015290519081900360640190fd5b81600019148015613b615750600160ff1b83145b15613b9d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614b386021913960400191505060405180910390fd5b6000828481613ba857fe5b05949350505050565b6000611337838362ffffff16620f42406127da565b600080600083613bd7578585613bda565b84865b9092509050611fe387613bf5620f424062ffffff8616612d5a565b61384f620f424062ffffff8616612d5a565b6000613c148484846127da565b905060008280613c2057fe5b8486091115611a58576000198110613c3757600080fd5b6001019392505050565b600054610100900460ff1680613c5a5750613c5a6129cb565b80613c68575060005460ff16155b613ca35760405162461bcd60e51b815260040180806020018281038252602e815260200180614b0a602e913960400191505060405180910390fd5b600054610100900460ff16158015612a71576000805460ff1961ff0019909116610100171660011790558015612a83576000805461ff001916905550565b604051806040016040528060008152602001600081525090565b6040518061016001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060020b8152602001600015158152602001600062ffffff1681525090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060020b81525090565b803561042a81614a79565b600082601f830112613dba578081fd5b81516020613dcf613dca83614a5c565b614a39565b8281528181019085830183850287018401881015613deb578586fd5b855b85811015613e12578151613e0081614a79565b84529284019290840190600101613ded565b5090979650505050505050565b803561042a81614a8e565b8051600281900b811461042a57600080fd5b805161ffff8116811461042a57600080fd5b600060208284031215613e5f578081fd5b813561133781614a79565b600060208284031215613e7b578081fd5b815161133781614a79565b60008060408385031215613e98578081fd5b8235613ea381614a79565b91506020830135613eb381614a79565b809150509250929050565b600080600060608486031215613ed2578081fd5b8335613edd81614a79565b92506020840135613eed81614a79565b91506040840135613efd81614a79565b809150509250925092565b60008060408385031215613f1a578182fd5b8235613f2581614a79565b91506020830135613eb381614a9c565b60008060408385031215613f47578182fd5b8235613f5281614a79565b91506020830135613eb381614aad565b60006020808385031215613f74578182fd5b82516001600160401b03811115613f89578283fd5b8301601f81018513613f99578283fd5b8051613fa7613dca82614a5c565b8181528381019083850185840285018601891015613fc3578687fd5b8694505b83851015613fee578051613fda81614a79565b835260019490940193918501918501613fc7565b50979650505050505050565b6000806040838503121561400c578182fd5b82516001600160401b0380821115614022578384fd5b818501915085601f830112614035578384fd5b81516020614045613dca83614a5c565b82815281810190858301838502870184018b1015614061578889fd5b8896505b848710156140915780518060060b811461407d57898afd5b835260019690960195918301918301614065565b50918801519196509093505050808211156140aa578283fd5b506140b785828601613daa565b9150509250929050565b6000602082840312156140d2578081fd5b815161133781614a8e565b6000602082840312156140ee578081fd5b5051919050565b60008060408385031215614107578182fd5b505080516020909101519092909150565b6000806000806060858703121561412d578182fd5b843593506020850135925060408501356001600160401b0380821115614151578384fd5b818701915087601f830112614164578384fd5b813581811115614172578485fd5b886020828501011115614183578485fd5b95989497505060200194505050565b6000606082840312156141a3578081fd5b604051606081018181106001600160401b03821117156141bf57fe5b80604052508251815260208301516020820152604083015160408201528091505092915050565b600060a082840312156141f7578081fd5b60405160a081018181106001600160401b038211171561421357fe5b604052825161422181614a79565b8152602083015161423181614a9c565b6020820152604083015161424481614a9c565b6040820152606083015161425781614a9c565b6060820152608083015161426a81614a9c565b60808201529392505050565b600060808284031215614287578081fd5b604051608081018181106001600160401b03821117156142a357fe5b60405282356142b181614a79565b815260208301356142c181614a79565b6020820152604083810135908201526060928301359281019290925250919050565b6000606082840312156142f4578081fd5b604051606081018181106001600160401b038211171561431057fe5b60405261431c83613e2a565b815260208301516020820152604083015160408201528091505092915050565b600060e0828403121561434d578081fd5b60405160e081018181106001600160401b038211171561436957fe5b60405261437583613d9f565b815261438360208401613d9f565b602082015261439460408401613e1f565b60408201526143a560608401613e1f565b60608201526143b660808401613e1f565b608082015260a083013560a08201526143d160c08401613d9f565b60c08201529392505050565b600080600080600080600060e0888a0312156143f7578485fd5b875161440281614a79565b965061441060208901613e2a565b955061441e60408901613e3c565b945061442c60608901613e3c565b935061443a60808901613e3c565b925060a088015160ff8116811461444f578283fd5b60c089015190925061446081614a8e565b8091505092959891949750929550565b600060208284031215614481578081fd5b815161133781614a9c565b60006020828403121561449d578081fd5b815161133781614aad565b600080604083850312156144ba578182fd5b82516144c581614aad565b6020840151909250613eb381614aad565b6001600160a01b03169052565b15159052565b60020b9052565b80518252602090810151910152565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0384811682528316602082015260808101612b9160408301846144f0565b600060018060a01b038088168352602087151581850152866040850152818616606085015260a06080850152845191508160a0850152825b828110156145af5785810182015185820160c001528101614593565b828111156145c0578360c084870101525b5050601f01601f19169190910160c0019695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561461857835163ffffffff16835292840192918401916001016145f6565b50909695505050505050565b901515815260200190565b90815260200190565b60008582528460208301526060604083015282606083015282846080840137818301608090810191909152601f909201601f191601019392505050565b82815260608101611a5860208301846144f0565b60208082526007908201526645585f42544e4560c81b604082015260600190565b6020808252600790820152660869088be9e86960cb1b604082015260600190565b60208082526008908201526745585f4f504c415360c01b604082015260600190565b6020808252600590820152640455f4142360dc1b604082015260600190565b60208082526007908201526645585f544b4d4d60c81b604082015260600190565b602080825260069082015265455f4f424e4360d01b604082015260600190565b6020808252600a908201526922ac2fa6aa21a627a7a960b11b604082015260600190565b6020808252600790820152662aa1a12fa321ab60c91b604082015260600190565b6020808252601c908201527f506572704d6174683a20696e76657273696f6e206f766572666c6f7700000000604082015260600190565b60208082526006908201526522ac2fa7a82160d11b604082015260600190565b602080825260069082015265455f43484e4360d01b604082015260600190565b60208082526006908201526555425f554f4160d01b604082015260600190565b602080825260069082015265045585f4d49560d41b604082015260600190565b60208082526006908201526545585f424e4360d01b604082015260600190565b60006101608201905061487d8284516144d6565b602083015161488f60208401826144e3565b5060408301516148a260408401826144e3565b506060830151606083015260808301516148bf60808401826144d6565b5060a08301516148d260a08401826144ff565b5060c08301516148e560c08401826144ff565b5060e08301516148f860e08401826144f0565b5061010083015161012061490e818501836144d6565b84015190506149216101408401826144ff565b5092915050565b81516001600160a01b0390811682526020808401518216908301526040808401519091169082015260608083015162ffffff16908201526080918201519181019190915260a00190565b600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e0830152610100808401516149d8828501826144e9565b5050610120808401516149ed828501826144e3565b505061014080840151614a02828501826144ff565b505092915050565b62ffffff91909116815260200190565b918252602082015260400190565b63ffffffff91909116815260200190565b6040518181016001600160401b0381118282101715614a5457fe5b604052919050565b60006001600160401b03821115614a6f57fe5b5060209081020190565b6001600160a01b0381168114612a8357600080fd5b8015158114612a8357600080fd5b62ffffff81168114612a8357600080fd5b63ffffffff81168114612a8357600080fdfe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20616e2032342062697473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65645369676e6564536166654d6174683a206469766973696f6e206f766572666c6f778be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e203332206269747353616665436173743a2076616c756520646f65736e27742066697420696e20616e20696e743235365369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e2032342062697473a2646970667358221220d929b893509a3a906eaf97a0938c2686b12714c7b4bbd75ada057e4aef378aab64736f6c63430007060033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
