{
  "_format": "hh-sol-artifact-1",
  "contractName": "NegativeAMM",
  "sourceName": "contracts/core/amm/NegativeAMM.sol",
  "abi": [
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "AMMId",
              "name": "ammId",
              "type": "uint24"
            },
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "symbol",
              "type": "string"
            },
            {
              "internalType": "address",
              "name": "router",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "market",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "oracleImpliedRateWindow",
              "type": "uint32"
            },
            {
              "internalType": "uint64",
              "name": "feeRate",
              "type": "uint64"
            },
            {
              "internalType": "uint256",
              "name": "totalSupplyCap",
              "type": "uint256"
            },
            {
              "internalType": "MarketAcc",
              "name": "seeder",
              "type": "bytes26"
            },
            {
              "internalType": "address",
              "name": "permissionController",
              "type": "address"
            }
          ],
          "internalType": "struct AMMCreateParams",
          "name": "createParams",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "totalFloatAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "normFixedAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "totalLp",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "latestFTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maturity",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "seedTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAbsRate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxAbsRate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "cutOffTimestamp",
              "type": "uint256"
            }
          ],
          "internalType": "struct AMMState",
          "name": "initialState",
          "type": "tuple"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AMMCutOffReached",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMInsufficientCashIn",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMInsufficientLiquidity",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMInvalidRateRange",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMNegativeCash",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMSignMismatch",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMTotalSupplyCapExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMWithdrawOnly",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "MarketAcc",
          "name": "account",
          "type": "bytes26"
        },
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "BOROS20NotEnoughBalance",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidFeeRates",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidObservationWindow",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MarketMatured",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MathInvalidExponent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MathOutOfBounds",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Unauthorized",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "minAbsRate",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "maxAbsRate",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "cutOffTimestamp",
          "type": "uint32"
        }
      ],
      "name": "AMMConfigUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "MarketAcc",
          "name": "from",
          "type": "bytes26"
        },
        {
          "indexed": false,
          "internalType": "MarketAcc",
          "name": "to",
          "type": "bytes26"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "BOROS20Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "MarketAcc",
          "name": "payer",
          "type": "bytes26"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "netLpBurned",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "netCashOut",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "netSizeOut",
          "type": "int256"
        }
      ],
      "name": "Burn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newFeeRate",
          "type": "uint256"
        }
      ],
      "name": "FeeRateUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "newWindow",
          "type": "uint32"
        }
      ],
      "name": "ImpliedRateObservationWindowUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "MarketAcc",
          "name": "receiver",
          "type": "bytes26"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "netLpMinted",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "netCashIn",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "netSizeIn",
          "type": "int256"
        }
      ],
      "name": "Mint",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "int256",
          "name": "sizeOut",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "costOut",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fee",
          "type": "uint256"
        }
      ],
      "name": "Swap",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newTotalSupplyCap",
          "type": "uint256"
        }
      ],
      "name": "TotalSupplyCapUpdated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "ACCOUNT_ONE",
      "outputs": [
        {
          "internalType": "MarketAcc",
          "name": "",
          "type": "bytes26"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "AMM_ID",
      "outputs": [
        {
          "internalType": "AMMId",
          "name": "",
          "type": "uint24"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MARKET",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MATURITY",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ROUTER",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SEED_TIME",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SELF_ACC",
      "outputs": [
        {
          "internalType": "MarketAcc",
          "name": "",
          "type": "bytes26"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "_storage",
      "outputs": [
        {
          "internalType": "uint128",
          "name": "minAbsRate",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "maxAbsRate",
          "type": "uint128"
        },
        {
          "internalType": "uint32",
          "name": "cutOffTimestamp",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "oracleImpliedRateWindow",
          "type": "uint32"
        },
        {
          "internalType": "uint64",
          "name": "feeRate",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "totalSupplyCap",
          "type": "uint256"
        },
        {
          "internalType": "uint128",
          "name": "totalFloatAmount",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "normFixedAmount",
          "type": "uint128"
        },
        {
          "internalType": "uint32",
          "name": "lastTradedTime",
          "type": "uint32"
        },
        {
          "internalType": "int128",
          "name": "prevOracleImpliedRate",
          "type": "int128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "MarketAcc",
          "name": "account",
          "type": "bytes26"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "MarketAcc",
          "name": "payer",
          "type": "bytes26"
        },
        {
          "internalType": "int256",
          "name": "totalCash",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "totalSize",
          "type": "int256"
        },
        {
          "internalType": "uint256",
          "name": "lpToBurn",
          "type": "uint256"
        }
      ],
      "name": "burnByBorosRouter",
      "outputs": [
        {
          "internalType": "int256",
          "name": "netCashOut",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "netSizeOut",
          "type": "int256"
        },
        {
          "internalType": "bool",
          "name": "isMatured",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "targetRate",
          "type": "int256"
        }
      ],
      "name": "calcSwapSize",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeRate",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "impliedRate",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "MarketAcc",
          "name": "receiver",
          "type": "bytes26"
        },
        {
          "internalType": "int256",
          "name": "totalCash",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "totalSize",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "maxCashIn",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "exactSizeIn",
          "type": "int256"
        }
      ],
      "name": "mintByBorosRouter",
      "outputs": [
        {
          "internalType": "int256",
          "name": "netCashIn",
          "type": "int256"
        },
        {
          "internalType": "uint256",
          "name": "netLpOut",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oracleImpliedRate",
      "outputs": [
        {
          "internalType": "int128",
          "name": "",
          "type": "int128"
        },
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "readState",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "totalFloatAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "normFixedAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "totalLp",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "latestFTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maturity",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "seedTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAbsRate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxAbsRate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "cutOffTimestamp",
              "type": "uint256"
            }
          ],
          "internalType": "struct AMMState",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint128",
          "name": "minAbsRate",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "maxAbsRate",
          "type": "uint128"
        },
        {
          "internalType": "uint32",
          "name": "cutOffTimestamp",
          "type": "uint32"
        }
      ],
      "name": "setAMMConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "newFeeRate",
          "type": "uint64"
        }
      ],
      "name": "setAMMFeeRate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "newWindow",
          "type": "uint32"
        }
      ],
      "name": "setAMMImpliedRateObservationWindow",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "newTotalSupplyCap",
          "type": "uint256"
        }
      ],
      "name": "setAMMTotalSupplyCap",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "sizeOut",
          "type": "int256"
        }
      ],
      "name": "swapByBorosRouter",
      "outputs": [
        {
          "internalType": "int256",
          "name": "costOut",
          "type": "int256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "sizeOut",
          "type": "int256"
        }
      ],
      "name": "swapView",
      "outputs": [
        {
          "internalType": "int256",
          "name": "costOut",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupplyCap",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x610180604052348015610010575f5ffd5b50604051613cca380380613cca83398101604081905261002f9161094b565b81818161012001518260200151836040015181600290816100509190610af4565b50600361005d8282610af4565b5050506001600160a01b0390811660809081526060840151821660a09081529084015190911660c05281015161009290610237565b63ffffffff1660e05260808101516100a990610237565b63ffffffff1661010052815162ffffff166101605260c0516040805163303e74df60e01b815290515f9283926001600160a01b039091169163303e74df9160048082019260e0929091908290030181865afa15801561010a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061012e9190610bbd565b509396509194506101489350309250859150849050610250565b65ffffffffffff19166101205261016160018383610250565b65ffffffffffff19166101405260c08301516101a2906101809061028a565b60e085015161018e9061028a565b61010086015161019d90610237565b61029e565b60a08401516101b09061038d565b60e08401516101be906103f2565b60c08401516101cc90610427565b6101d5836104b8565b6101f6846101000151620f424085604001516101f19190610c68565b610511565b6101405161020790620f4240610511565b600654600154111561022c57604051637540794960e01b815260040160405180910390fd5b505050505050610c8e565b5f640100000000821061024c5761024c610520565b5090565b5f62ffffff821661ffff84166001600160d01b03600887901b610100600160a81b031660ff1760101b161760181b1760301b949350505050565b5f600160801b821061024c5761024c610520565b5f806102b66001600160801b0380871690861661052d565b915091506101005163ffffffff168363ffffffff1611156102ea5760405163c32bc49360e01b815260040160405180910390fd5b815f1080156102f857508082105b61031457604051620ca50360e31b815260040160405180910390fd5b6001600160801b03858116600160801b91861691820281176004556005805463ffffffff191663ffffffff87169081179091556040805192835260208301939093528183015290517f49465dfaf65a9f995d83e80aaabd038e108086e61a6215bd725f698586d5a2239181900360600190a15050505050565b61039681610556565b6005805463ffffffff60201b191664010000000063ffffffff8416908102919091179091556040519081527f48c052f6bf1f8a513b946b104b98bee186b737ce4e3f364b2aa7401f82e040ec906020015b60405180910390a150565b60068190556040518181527f296dbcad3f3b915b3b636a011bea7d7f633cb1928287f6906ef0ccafe4a7e33f906020016103e7565b670de0b6b3a7640000816001600160401b031611156104595760405163081ca07f60e01b815260040160405180910390fd5b60058054600160401b600160801b031916680100000000000000006001600160401b038416908102919091179091556040519081527f208f1b468d3d61f0f085e975bd9d04367c930d599642faad06695229f3eadcd8906020016103e7565b80516104c39061028a565b600780546001600160801b0319166001600160801b039290921691909117905560208101516104f19061028a565b600780546001600160801b03928316600160801b02921691909117905550565b61051c5f8383610595565b5050565b6335278d125f526004601cfd5b5f8061053d846305f5e1006106bf565b915061054d836305f5e1006106e4565b90509250929050565b63ffffffff8116600a118015906105755750610e1063ffffffff821611155b610592576040516354c2857360e11b815260040160405180910390fd5b50565b61059f835f610700565b156105c0578060015f8282546105b59190610c7b565b909155506106349050565b65ffffffffffff1983165f908152602081905260409020548181101561061657604051637ec2996b60e01b815265ffffffffffff1985166004820152602481018290526044810183905260640160405180910390fd5b65ffffffffffff1984165f9081526020819052604090209082900390555b61063e825f610700565b156106515760018054829003905561066f565b65ffffffffffff1982165f9081526020819052604090208054820190555b6040805165ffffffffffff198086168252841660208201529081018290527f48eeac6987cc7ebd298919de8cefd9769858440e7adc718f7e9cbd31ccb5b82c9060600160405180910390a1505050565b5f6106db836106d684670de0b6b3a7640000610c7b565b610711565b90505b92915050565b5f6106db836106fb84670de0b6b3a7640000610c68565b610747565b65ffffffffffff1990811691161490565b81810281810483146107305781156107305763bac65e5b5f526004601cfd5b670de0b6b3a7640000808206151591040192915050565b5f815f19048311156107665781156107665763bac65e5b5f526004601cfd5b50670de0b6b3a764000091020490565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b03811182821017156107ad576107ad610776565b60405290565b60405161014081016001600160401b03811182821017156107ad576107ad610776565b62ffffff81168114610592575f5ffd5b80516107f1816107d6565b919050565b5f82601f830112610805575f5ffd5b81516001600160401b0381111561081e5761081e610776565b604051601f8201601f19908116603f011681016001600160401b038111828210171561084c5761084c610776565b604052818152838201602001851015610863575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b80516001600160a01b03811681146107f1575f5ffd5b805163ffffffff811681146107f1575f5ffd5b80516001600160401b03811681146107f1575f5ffd5b805165ffffffffffff19811681146107f1575f5ffd5b5f61012082840312156108e5575f5ffd5b6108ed61078a565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e08084015190820152610100928301519281019290925250919050565b5f5f610140838503121561095d575f5ffd5b82516001600160401b03811115610972575f5ffd5b83016101408186031215610984575f5ffd5b61098c6107b3565b610995826107e6565b815260208201516001600160401b038111156109af575f5ffd5b6109bb878285016107f6565b60208301525060408201516001600160401b038111156109d9575f5ffd5b6109e5878285016107f6565b6040830152506109f76060830161087f565b6060820152610a086080830161087f565b6080820152610a1960a08301610895565b60a0820152610a2a60c083016108a8565b60c082015260e08281015190820152610a4661010083016108be565b610100820152610a59610120830161087f565b610120820152925061054d905084602085016108d4565b600181811c90821680610a8457607f821691505b602082108103610aa257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610aef57805f5260205f20601f840160051c81016020851015610acd5750805b601f840160051c820191505b81811015610aec575f8155600101610ad9565b50505b505050565b81516001600160401b03811115610b0d57610b0d610776565b610b2181610b1b8454610a70565b84610aa8565b6020601f821160018114610b53575f8315610b3c5750848201515b5f19600385901b1c1916600184901b178455610aec565b5f84815260208120601f198516915b82811015610b825787850151825560209485019460019092019101610b62565b5084821015610b9f57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b61ffff81168114610592575f5ffd5b5f5f5f5f5f5f5f60e0888a031215610bd3575f5ffd5b87518015158114610be2575f5ffd5b6020890151909750610bf381610bae565b6040890151909650610c04816107d6565b9450610c1260608901610895565b9350608088015160ff81168114610c27575f5ffd5b60a0890151909350610c3881610bae565b9150610c4660c08901610895565b905092959891949750929550565b634e487b7160e01b5f52601160045260245ffd5b818103818111156106de576106de610c54565b808201808211156106de576106de610c54565b60805160a05160c05160e05161010051610120516101405161016051612f71610d595f395f61018001525f6102fe01525f81816101eb015261113501525f818161034c01528181610ffb01526112c101525f81816103d6015261102301525f8181610521015281816107830152818161085001528181610e1101528181610f710152818161110801526113bf01525f81816102b7015281816105e1015281816109100152610b7601525f81816106a8015281816109fb01528181610aba0152610ca70152612f715ff3fe608060405234801561000f575f5ffd5b5060043610610147575f3560e01c806306fdde031461014b57806318160ddd146101695780631c9c28eb1461017b578063224ae0f2146101b657806324d4206b146101e657806326e96ce41461021a5780632778c3341461022f578063313ce567146102a357806332fe7b26146102b25780633317e9be146102f157806375f3c3ce146102f95780637b6addf3146103205780638e12c0cd146103475780639292c42b1461038357806395d89b4114610396578063978bbdb91461039e5780639a3a2e81146103be578063a6aa7b59146103d1578063acf17125146103f8578063b5f1544914610420578063bb102aea14610433578063c3564b151461043b578063c3fb90d614610463578063cb3d6678146104e3578063d7766b39146104f6578063e8f02a0714610509578063f46f16c21461051c575b5f5ffd5b610153610543565b6040516101609190612ab1565b60405180910390f35b6001545b604051908152602001610160565b6101a27f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff9091168152602001610160565b6101c96101c4366004612afc565b6105d3565b604080519384526020840192909252151590820152606001610160565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101609190612b32565b61022d610228366004612b57565b610691565b005b610237610753565b60405161016091905f61012082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b60405160128152602001610160565b6102d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610160565b61016d610768565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b610328610833565b60408051600f9390930b835263ffffffff909116602083015201610160565b61036e7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610160565b61016d610391366004612b72565b610904565b6101536109d5565b600554600160401b90046001600160401b03166040516101609190612b89565b61022d6103cc366004612b9d565b6109e4565b61036e7f000000000000000000000000000000000000000000000000000000000000000081565b61016d610406366004612bc3565b65ffffffffffff19165f9081526020819052604090205490565b61022d61042e366004612bf2565b610aa3565b60065461016d565b61044e610449366004612c36565b610b69565b60408051928352602083019190915201610160565b6004546005546006546007546008546104cd946001600160801b0380821695600160801b9283900482169563ffffffff80831696600160201b808504831697600160401b9095046001600160401b03169693958083169594909204909116929182169104600f0b8a565b6040516101609a99989796959493929190612c74565b61022d6104f1366004612b72565b610c90565b61016d610504366004612b72565b610d4f565b61016d610517366004612b72565b610d73565b6102d97f000000000000000000000000000000000000000000000000000000000000000081565b60606002805461055290612cf0565b80601f016020809104026020016040519081016040528092919081815260200182805461057e90612cf0565b80156105c95780601f106105a0576101008083540402835291602001916105c9565b820191905f5260205f20905b8154815290600101906020018083116105ac57829003601f168201915b5050505050905090565b5f8080336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461061e576040516282b42960e81b815260040160405180910390fd5b610626610dae565b610631868686610e00565b919450925090506106428785610eba565b8665ffffffffffff19167fa4d3bfbe6e7fe6b8d6c00f6cc61e2087b14a629095e6afdd82cb7842c457d77085858560405161067f93929190612d22565b60405180910390a29450945094915050565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b7009613906106ec90339030906001600160e01b03195f351690600401612d38565b602060405180830381865afa158015610707573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b9190612d65565b610747576040516282b42960e81b815260040160405180910390fd5b61075081610ec9565b50565b61075b612a6e565b610763610f2d565b905090565b6005545f9063ffffffff16428111610825578063ffffffff167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190612d84565b63ffffffff16106108255760405163c32bc49360e01b815260040160405180910390fd5b61082d611079565b91505090565b6005545f90819063ffffffff164281116108f2578063ffffffff167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ce9190612d84565b63ffffffff16106108f25760405163c32bc49360e01b815260040160405180910390fd5b6108fb4261109b565b92509250509091565b5f336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094d576040516282b42960e81b815260040160405180910390fd5b610955610dae565b61095d6110ef565b1561097b57604051636b7ae02b60e11b815260040160405180910390fd5b5f61098e83610989856111a8565b6111cf565b60405191935091507f15391ef1cdeab4c973414c6652cf113cb3c8d26819a60aaebaae91bcb82c83da906109c790859085908590612d22565b60405180910390a150919050565b60606003805461055290612cf0565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610a3f90339030906001600160e01b03195f351690600401612d38565b602060405180830381865afa158015610a5a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7e9190612d65565b610a9a576040516282b42960e81b815260040160405180910390fd5b61075081611217565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610afe90339030906001600160e01b03195f351690600401612d38565b602060405180830381865afa158015610b19573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3d9190612d65565b610b59576040516282b42960e81b815260040160405180910390fd5b610b6483838361129d565b505050565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bb3576040516282b42960e81b815260040160405180910390fd5b610bbb610dae565b610bc36110ef565b15610be157604051636b7ae02b60e11b815260040160405180910390fd5b5f8613610c01576040516390f2286360e01b815260040160405180910390fd5b610c0d868686866113af565b9092509050610c1c8782611467565b6006546001541115610c4157604051637540794960e01b815260040160405180910390fd5b8665ffffffffffff19167f89a302decbf25a038eb274f71951f4be62b45c4e96bdf6e4f3bb246770a24bd4828486604051610c7e93929190612d22565b60405180910390a29550959350505050565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610ceb90339030906001600160e01b03195f351690600401612d38565b602060405180830381865afa158015610d06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2a9190612d65565b610d46576040516282b42960e81b815260040160405180910390fd5b61075081611472565b5f610d586110ef565b15610d6457505f919050565b610d6d826114a7565b92915050565b5f610d7c6110ef565b15610d9a57604051636b7ae02b60e11b815260040160405180910390fd5b610da782610989846114c4565b5092915050565b5f610db8426114da565b9050610dc38161109b565b506008805463ffffffff90931663ffffffff196001600160801b03909316600160201b02929092166001600160a01b031990931692909217179055565b5f5f5f5f610e0c610f2d565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fba55856040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610e6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e909190612d9f565b9050610e9f82828a8a8a6114f2565b91965094509250610eaf8261152f565b505093509350939050565b610ec5825f83611588565b5050565b610ed2816116b3565b6005805463ffffffff60201b1916600160201b63ffffffff8416908102919091179091556040519081527f48c052f6bf1f8a513b946b104b98bee186b737ce4e3f364b2aa7401f82e040ec906020015b60405180910390a150565b610f35612a6e565b60408051610120810182526007546001600160801b038082168352600160801b909104166020820152908101610f6a60015490565b81526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fcb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190612d84565b63ffffffff90811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f0000000000000000000000000000000000000000000000000000000000000000811660408301526004546001600160801b038082166060850152600160801b9091041660808301526005541660a090910152919050565b6007545f90610763906001600160801b0380821691600160801b9004166116ef565b6008545f908190600160201b8104600f0b9063ffffffff16826110c46110bf611079565b611703565b600554600160201b900463ffffffff16945090506110e5838584848a611723565b9450505050915091565b6040516308aafaad60e01b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906308aafaad9061115d907f000000000000000000000000000000000000000000000000000000000000000090600401612b32565b602060405180830381865afa158015611178573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119c9190612db6565b62ffffff161515919050565b5f5f6111b2610f2d565b90506111be81846117b4565b91506111c98161152f565b50919050565b6005545f9081906111f990600160401b90046001600160401b03166111f3866117c7565b906117d3565b905061120481611809565b61120e9084612dec565b91509250929050565b670de0b6b3a7640000816001600160401b031611156112495760405163081ca07f60e01b815260040160405180910390fd5b60058054600160401b600160801b031916600160401b6001600160401b038416021790556040517f208f1b468d3d61f0f085e975bd9d04367c930d599642faad06695229f3eadcd890610f22908390612b89565b5f5f6112bb856001600160801b0316856001600160801b0316611815565b915091507f000000000000000000000000000000000000000000000000000000000000000063ffffffff168363ffffffff16111561130c5760405163c32bc49360e01b815260040160405180910390fd5b815f10801561131a57508082105b61133657604051620ca50360e31b815260040160405180910390fd5b6001600160801b03858116600160801b91861691820281176004556005805463ffffffff191663ffffffff87169081179091556040805192835260208301939093528183015290517f49465dfaf65a9f995d83e80aaabd038e108086e61a6215bd725f698586d5a2239181900360600190a15050505050565b5f5f5f6113ba610f2d565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fba55856040518163ffffffff1660e01b81526004016020604051808303815f875af115801561141a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061143e9190612d9f565b905061144e82828a8a8a8a61183e565b909450925061145c8261152f565b505094509492505050565b610ec55f8383611588565b60068190556040518181527f296dbcad3f3b915b3b636a011bea7d7f633cb1928287f6906ef0ccafe4a7e33f90602001610f22565b5f5f6114b1610f2d565b90506114bd8184611875565b9392505050565b5f5f6114ce610f2d565b90506114bd81846117b4565b5f600160201b82106114ee576114ee611888565b5090565b5f80806115128861150289612e13565b8861150c89612e13565b88611895565b9194509250905061152282612e13565b9150955095509592505050565b805161153a906119ff565b600780546001600160801b0319166001600160801b03929092169190911790556020810151611568906119ff565b600780546001600160801b03928316600160801b02921691909117905550565b611592835f611a13565b156115b3578060015f8282546115a89190612e2d565b909155506116289050565b65ffffffffffff1983165f908152602081905260409020548181101561160a57604051637ec2996b60e01b815265ffffffffffff198516600482015260248101829052604481018390526064015b60405180910390fd5b65ffffffffffff1984165f9081526020819052604090209082900390555b611632825f611a13565b1561164557600180548290039055611663565b65ffffffffffff1982165f9081526020819052604090208054820190555b6040805165ffffffffffff198086168252841660208201529081018290527f48eeac6987cc7ebd298919de8cefd9769858440e7adc718f7e9cbd31ccb5b82c9060600160405180910390a1505050565b63ffffffff8116600a118015906116d25750610e1063ffffffff821611155b610750576040516354c2857360e11b815260040160405180910390fd5b5f6116fa8383611a24565b6114bd90612e13565b5f6001607f1b820160801c611716575090565b61171e611888565b919050565b5f63ffffffff8516816117368685612e40565b60030b9050805f0361174c5787925050506117ab565b81811261175d5784925050506117ab565b5f6117688284612e5c565b89600f0b6117769190612e7b565b61178483600f89900b612e7b565b61178e9190612dec565b905061179a8382612ebe565b90506117a581611703565b93505050505b95945050505050565b5f6114bd836117c284612e13565b611a37565b60ff81901d9081011890565b81810281810483146117f25781156117f25763bac65e5b5f526004601cfd5b670de0b6b3a7640000808206151591040192915050565b5f5f8212611716575090565b5f80611825846305f5e100611ba5565b9150611835836305f5e100611bc1565b90509250929050565b5f806118668861184d89612e13565b8861185789612e13565b8861186189612e13565b611bdd565b91509150965096945050505050565b5f6116fa8361188384612e13565b611dbe565b6335278d125f526004601cfd5b5f5f5f6118a58860400151611809565b6118ae85611809565b6118b89088612e7b565b6118c29190612ebe565b9250876060015188608001511115905080156118e0575f91506119f4565b5f6118ea86611eba565b90505f5f6118f78a611ed9565b61190084611ed9565b1490508015611933578a6040015187611918856117c7565b6119229190612eea565b61192c9190612f01565b9150611958565b6119558b6040015188611945866117c7565b61194f9190612eea565b90611efa565b91505b61196183611ed9565b61196a83611809565b6119749190612e7b565b94508a60400151878c5f015161198a9190612eea565b6119949190612f01565b8b518c906119a3908390612f14565b90525060408b015160208c01516119bb908990612eea565b6119c59190612f01565b8b6020018181516119d69190612f14565b90525060408b0180518891906119ed908390612f14565b9052505050505b955095509592505050565b5f600160801b82106114ee576114ee611888565b65ffffffffffff1990811691161490565b5f6114bd611a328385611f19565b611809565b5f5f611a4284611f5b565b90505f5f611a4f856117c7565b90505f851315611a9057611a64816001612e2d565b865111611a8457604051633582eca960e21b815260040160405180910390fd5b85518190039150611aa0565b8551611a9d908290612e2d565b91505b602086015186515f91611abd91611ab79087611fb7565b90612122565b90505f611ad4611acd8587611fb7565b8390611f19565b9050838860c00151611ae69190612eea565b611af8670de0b6b3a764000083612eea565b1015611b1757604051633582eca960e21b815260040160405180910390fd5b838860e00151611b279190612eea565b611b39670de0b6b3a764000083612eea565b1115611b5857604051633582eca960e21b815260040160405180910390fd5b5f611b668960200151611809565b611b6f83611809565b611b799190612e5c565b858a5260208a018390529050611b98611b9187611809565b8290612151565b9998505050505050505050565b5f6114bd83611bbc84670de0b6b3a7640000612e2d565b6117d3565b5f6114bd83611bd884670de0b6b3a7640000612f14565b612122565b606086015160808701515f91829111801590611c0c57604051635f2a407b60e01b815260040160405180910390fd5b5f8713611c1b57611c1b612f27565b5f611c2587611eba565b9050611c3085611ed9565b611c3982611ed9565b14611c575760405163c510544560e01b815260040160405180910390fd5b805f03611c8b5787611c6887611809565b8b60400151611c779190612eea565b611c819190612f01565b9250859350611d36565b5f611c95826117c7565b90505f611ca1876117c7565b90505f611cad8c611ed9565b611cb685611ed9565b1490508015611ce15782828e60400151611cd09190612eea565b611cda9190612f01565b9550611cf8565b611cf583838f6040015161194f9190612eea565b95505b611d0f611a328e60400151888e61194f9190612eea565b965088871315611d325760405163580ca8fd60e01b815260040160405180910390fd5b5050505b60408a01518a51611d48908590612eea565b611d529190612f01565b8a518b90611d61908390612e2d565b90525060408a015160208b0151611d79908590612eea565b611d839190612f01565b8a602001818151611d949190612e2d565b90525060408a018051849190611dab908390612e2d565b9052509299919850909650505050505050565b5f611dc9838361217b565b91505f611ddd845f01518560200151611a24565b9050600a611df3611dee8386612e5c565b6117c7565b1080611e085750610100840151606085015110155b15611e16575f915050610d6d565b5f611e2084611809565b90505f611e2c86611f5b565b90505f611e41670de0b6b3a764000083612e2d565b602088015188519192505f91611e579085611fb7565b611e619190612eea565b90505f611e9a6002611e8e611e7e670de0b6b3a764000087611f19565b611e888987612f01565b90611fb7565b90808218908210021890565b9050611ea581611809565b8951611eb090611809565b611b989190612e5c565b5f6103e8611ec7836117c7565b10611ed25781610d6d565b5f92915050565b5f5f821315611eea57506001919050565b5f821215611ed257505f19919050565b5f81611f0d576365244e4e5f526004601cfd5b50808206151591040190565b5f7812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f2283108202611f4957637c5f487d5f526004601cfd5b50670de0b6b3a7640000919091020490565b61010081015160608201515f9111611f865760405163c32bc49360e01b815260040160405180910390fd5b610d6d8260a001518360800151611f9d9190612f14565b83606001518460800151611fb19190612f14565b90611f19565b5f815f03611fce5750670de0b6b3a7640000610d6d565b825f03611fdc57505f610d6d565b600160ff1b831061200057604051637304657960e01b815260040160405180910390fd5b82770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532831061203957604051637304657960e01b815260040160405180910390fd5b825f670c7d713b49da0000831380156120595750670f43fc2c04ee000083125b1561208f575f612068846121c4565b9050670de0b6b3a764000080820784020583670de0b6b3a76400008305020191505061209d565b81612099846122e1565b0290505b670de0b6b3a76400009005680238fd42c5cf03ffff1981128015906120cb575068070c1cc73b00c800008113155b61210f5760405162461bcd60e51b815260206004820152601560248201527470726f64756374206f7574206f6620626f756e647360581b6044820152606401611601565b6121188161267f565b9695505050505050565b5f815f19048311156121415781156121415763bac65e5b5f526004601cfd5b50670de0b6b3a764000091020490565b670de0b6b3a76400008281029081058314820261217557635c43740d5f526004601cfd5b05919050565b5f5f5f6121908560c001518660e00151611815565b915091506117ab6121a082611809565b6121b86121ac85611809565b80881290881802871890565b90808218908213021890565b670de0b6b3a7640000025f806a0c097ce7bc90715b34b9f160241b808401906ec097ce7bc90715b34b9f0fffffffff198501028161220457612204612eaa565b0590505f6a0c097ce7bc90715b34b9f160241b82800205905081806a0c097ce7bc90715b34b9f160241b81840205915060038205016a0c097ce7bc90715b34b9f160241b82840205915060058205016a0c097ce7bc90715b34b9f160241b82840205915060078205016a0c097ce7bc90715b34b9f160241b82840205915060098205016a0c097ce7bc90715b34b9f160241b828402059150600b8205016a0c097ce7bc90715b34b9f160241b828402059150600d8205016a0c097ce7bc90715b34b9f160241b828402059150600f82050160020295945050505050565b5f670de0b6b3a764000082121561232057612318826a0c097ce7bc90715b34b9f160241b8161231257612312612eaa565b056122e1565b5f0392915050565b5f775803bcc5cb9634ba4cfb2213f784019318ed4dcb6017880f60361b831261236a5772195e54c5dd42177f53a27172fa9ec63026282760241b830592506806f05b59d3b2000000015b6f8bcc0026baae9e45e470190267a230cf60191b83126123a1576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff008400083126123e9576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312612424576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf850831261245b57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e2831261249257690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d0383126124c75768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb4174612111083126124f257680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312612527576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f1775788937937831261255c576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312612590576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac83126125c4576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b5f68056bc75e2d63100000840168056bc75e2d6310000080860302816125ec576125ec612eaa565b0590505f68056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b5f680238fd42c5cf03ffff1982121580156126a3575068070c1cc73b00c800008213155b6126c05760405163739a565d60e11b815260040160405180910390fd5b5f8212156126f6576126d3825f0361267f565b6a0c097ce7bc90715b34b9f160241b816126ef576126ef612eaa565b0592915050565b5f6806f05b59d3b2000000831261273357506806f05b59d3b1ffffff199091019072195e54c5dd42177f53a27172fa9ec63026282760241b612769565b6803782dace9d9000000831261276557506803782dace9d8ffffff19909101906b1425982cf597cd205cef7380612769565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac6200000084126127b95768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d63100000084126127f5576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b18800000841261282f57682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412612869576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac620000084126128a257680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d6310000084126128db5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412612914576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c40000841261294d5768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b6040518061012001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b803565ffffffffffff198116811461171e575f5ffd5b5f5f5f5f60808587031215612b0f575f5ffd5b612b1885612ae6565b966020860135965060408601359560600135945092505050565b65ffffffffffff1991909116815260200190565b63ffffffff81168114610750575f5ffd5b5f60208284031215612b67575f5ffd5b81356114bd81612b46565b5f60208284031215612b82575f5ffd5b5035919050565b6001600160401b0391909116815260200190565b5f60208284031215612bad575f5ffd5b81356001600160401b03811681146114bd575f5ffd5b5f60208284031215612bd3575f5ffd5b6114bd82612ae6565b80356001600160801b038116811461171e575f5ffd5b5f5f5f60608486031215612c04575f5ffd5b612c0d84612bdc565b9250612c1b60208501612bdc565b91506040840135612c2b81612b46565b809150509250925092565b5f5f5f5f5f60a08688031215612c4a575f5ffd5b612c5386612ae6565b97602087013597506040870135966060810135965060800135945092505050565b6001600160801b038b811682528a8116602083015263ffffffff8a8116604084015289811660608401526001600160401b038916608084015260a0830188905286821660c084015290851660e083015283166101008201526101408101612ce1610120830184600f0b9052565b9b9a5050505050505050505050565b600181811c90821680612d0457607f821691505b6020821081036111c957634e487b7160e01b5f52602260045260245ffd5b9283526020830191909152604082015260600190565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f60208284031215612d75575f5ffd5b815180151581146114bd575f5ffd5b5f60208284031215612d94575f5ffd5b81516114bd81612b46565b5f60208284031215612daf575f5ffd5b5051919050565b5f60208284031215612dc6575f5ffd5b815162ffffff811681146114bd575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018281125f831280158216821582161715612e0b57612e0b612dd8565b505092915050565b5f600160ff1b8201612e2757612e27612dd8565b505f0390565b80820180821115610d6d57610d6d612dd8565b63ffffffff8281168282160390811115610d6d57610d6d612dd8565b8181035f831280158383131683831282161715610da757610da7612dd8565b8082025f8212600160ff1b84141615612e9657612e96612dd8565b8181058314821517610d6d57610d6d612dd8565b634e487b7160e01b5f52601260045260245ffd5b5f82612ecc57612ecc612eaa565b600160ff1b82145f1984141615612ee557612ee5612dd8565b500590565b8082028115828204841417610d6d57610d6d612dd8565b5f82612f0f57612f0f612eaa565b500490565b81810381811115610d6d57610d6d612dd8565b634e487b7160e01b5f52600160045260245ffdfea264697066735822122091f989306df538ccd045ae1b6b72261efe30b0e45809b9ccf3606664473f2aae64736f6c634300081c0033",
  "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610147575f3560e01c806306fdde031461014b57806318160ddd146101695780631c9c28eb1461017b578063224ae0f2146101b657806324d4206b146101e657806326e96ce41461021a5780632778c3341461022f578063313ce567146102a357806332fe7b26146102b25780633317e9be146102f157806375f3c3ce146102f95780637b6addf3146103205780638e12c0cd146103475780639292c42b1461038357806395d89b4114610396578063978bbdb91461039e5780639a3a2e81146103be578063a6aa7b59146103d1578063acf17125146103f8578063b5f1544914610420578063bb102aea14610433578063c3564b151461043b578063c3fb90d614610463578063cb3d6678146104e3578063d7766b39146104f6578063e8f02a0714610509578063f46f16c21461051c575b5f5ffd5b610153610543565b6040516101609190612ab1565b60405180910390f35b6001545b604051908152602001610160565b6101a27f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff9091168152602001610160565b6101c96101c4366004612afc565b6105d3565b604080519384526020840192909252151590820152606001610160565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101609190612b32565b61022d610228366004612b57565b610691565b005b610237610753565b60405161016091905f61012082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b60405160128152602001610160565b6102d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610160565b61016d610768565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b610328610833565b60408051600f9390930b835263ffffffff909116602083015201610160565b61036e7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610160565b61016d610391366004612b72565b610904565b6101536109d5565b600554600160401b90046001600160401b03166040516101609190612b89565b61022d6103cc366004612b9d565b6109e4565b61036e7f000000000000000000000000000000000000000000000000000000000000000081565b61016d610406366004612bc3565b65ffffffffffff19165f9081526020819052604090205490565b61022d61042e366004612bf2565b610aa3565b60065461016d565b61044e610449366004612c36565b610b69565b60408051928352602083019190915201610160565b6004546005546006546007546008546104cd946001600160801b0380821695600160801b9283900482169563ffffffff80831696600160201b808504831697600160401b9095046001600160401b03169693958083169594909204909116929182169104600f0b8a565b6040516101609a99989796959493929190612c74565b61022d6104f1366004612b72565b610c90565b61016d610504366004612b72565b610d4f565b61016d610517366004612b72565b610d73565b6102d97f000000000000000000000000000000000000000000000000000000000000000081565b60606002805461055290612cf0565b80601f016020809104026020016040519081016040528092919081815260200182805461057e90612cf0565b80156105c95780601f106105a0576101008083540402835291602001916105c9565b820191905f5260205f20905b8154815290600101906020018083116105ac57829003601f168201915b5050505050905090565b5f8080336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461061e576040516282b42960e81b815260040160405180910390fd5b610626610dae565b610631868686610e00565b919450925090506106428785610eba565b8665ffffffffffff19167fa4d3bfbe6e7fe6b8d6c00f6cc61e2087b14a629095e6afdd82cb7842c457d77085858560405161067f93929190612d22565b60405180910390a29450945094915050565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b7009613906106ec90339030906001600160e01b03195f351690600401612d38565b602060405180830381865afa158015610707573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b9190612d65565b610747576040516282b42960e81b815260040160405180910390fd5b61075081610ec9565b50565b61075b612a6e565b610763610f2d565b905090565b6005545f9063ffffffff16428111610825578063ffffffff167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190612d84565b63ffffffff16106108255760405163c32bc49360e01b815260040160405180910390fd5b61082d611079565b91505090565b6005545f90819063ffffffff164281116108f2578063ffffffff167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ce9190612d84565b63ffffffff16106108f25760405163c32bc49360e01b815260040160405180910390fd5b6108fb4261109b565b92509250509091565b5f336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094d576040516282b42960e81b815260040160405180910390fd5b610955610dae565b61095d6110ef565b1561097b57604051636b7ae02b60e11b815260040160405180910390fd5b5f61098e83610989856111a8565b6111cf565b60405191935091507f15391ef1cdeab4c973414c6652cf113cb3c8d26819a60aaebaae91bcb82c83da906109c790859085908590612d22565b60405180910390a150919050565b60606003805461055290612cf0565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610a3f90339030906001600160e01b03195f351690600401612d38565b602060405180830381865afa158015610a5a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7e9190612d65565b610a9a576040516282b42960e81b815260040160405180910390fd5b61075081611217565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610afe90339030906001600160e01b03195f351690600401612d38565b602060405180830381865afa158015610b19573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3d9190612d65565b610b59576040516282b42960e81b815260040160405180910390fd5b610b6483838361129d565b505050565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bb3576040516282b42960e81b815260040160405180910390fd5b610bbb610dae565b610bc36110ef565b15610be157604051636b7ae02b60e11b815260040160405180910390fd5b5f8613610c01576040516390f2286360e01b815260040160405180910390fd5b610c0d868686866113af565b9092509050610c1c8782611467565b6006546001541115610c4157604051637540794960e01b815260040160405180910390fd5b8665ffffffffffff19167f89a302decbf25a038eb274f71951f4be62b45c4e96bdf6e4f3bb246770a24bd4828486604051610c7e93929190612d22565b60405180910390a29550959350505050565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610ceb90339030906001600160e01b03195f351690600401612d38565b602060405180830381865afa158015610d06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2a9190612d65565b610d46576040516282b42960e81b815260040160405180910390fd5b61075081611472565b5f610d586110ef565b15610d6457505f919050565b610d6d826114a7565b92915050565b5f610d7c6110ef565b15610d9a57604051636b7ae02b60e11b815260040160405180910390fd5b610da782610989846114c4565b5092915050565b5f610db8426114da565b9050610dc38161109b565b506008805463ffffffff90931663ffffffff196001600160801b03909316600160201b02929092166001600160a01b031990931692909217179055565b5f5f5f5f610e0c610f2d565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fba55856040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610e6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e909190612d9f565b9050610e9f82828a8a8a6114f2565b91965094509250610eaf8261152f565b505093509350939050565b610ec5825f83611588565b5050565b610ed2816116b3565b6005805463ffffffff60201b1916600160201b63ffffffff8416908102919091179091556040519081527f48c052f6bf1f8a513b946b104b98bee186b737ce4e3f364b2aa7401f82e040ec906020015b60405180910390a150565b610f35612a6e565b60408051610120810182526007546001600160801b038082168352600160801b909104166020820152908101610f6a60015490565b81526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fcb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190612d84565b63ffffffff90811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f0000000000000000000000000000000000000000000000000000000000000000811660408301526004546001600160801b038082166060850152600160801b9091041660808301526005541660a090910152919050565b6007545f90610763906001600160801b0380821691600160801b9004166116ef565b6008545f908190600160201b8104600f0b9063ffffffff16826110c46110bf611079565b611703565b600554600160201b900463ffffffff16945090506110e5838584848a611723565b9450505050915091565b6040516308aafaad60e01b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906308aafaad9061115d907f000000000000000000000000000000000000000000000000000000000000000090600401612b32565b602060405180830381865afa158015611178573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119c9190612db6565b62ffffff161515919050565b5f5f6111b2610f2d565b90506111be81846117b4565b91506111c98161152f565b50919050565b6005545f9081906111f990600160401b90046001600160401b03166111f3866117c7565b906117d3565b905061120481611809565b61120e9084612dec565b91509250929050565b670de0b6b3a7640000816001600160401b031611156112495760405163081ca07f60e01b815260040160405180910390fd5b60058054600160401b600160801b031916600160401b6001600160401b038416021790556040517f208f1b468d3d61f0f085e975bd9d04367c930d599642faad06695229f3eadcd890610f22908390612b89565b5f5f6112bb856001600160801b0316856001600160801b0316611815565b915091507f000000000000000000000000000000000000000000000000000000000000000063ffffffff168363ffffffff16111561130c5760405163c32bc49360e01b815260040160405180910390fd5b815f10801561131a57508082105b61133657604051620ca50360e31b815260040160405180910390fd5b6001600160801b03858116600160801b91861691820281176004556005805463ffffffff191663ffffffff87169081179091556040805192835260208301939093528183015290517f49465dfaf65a9f995d83e80aaabd038e108086e61a6215bd725f698586d5a2239181900360600190a15050505050565b5f5f5f6113ba610f2d565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fba55856040518163ffffffff1660e01b81526004016020604051808303815f875af115801561141a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061143e9190612d9f565b905061144e82828a8a8a8a61183e565b909450925061145c8261152f565b505094509492505050565b610ec55f8383611588565b60068190556040518181527f296dbcad3f3b915b3b636a011bea7d7f633cb1928287f6906ef0ccafe4a7e33f90602001610f22565b5f5f6114b1610f2d565b90506114bd8184611875565b9392505050565b5f5f6114ce610f2d565b90506114bd81846117b4565b5f600160201b82106114ee576114ee611888565b5090565b5f80806115128861150289612e13565b8861150c89612e13565b88611895565b9194509250905061152282612e13565b9150955095509592505050565b805161153a906119ff565b600780546001600160801b0319166001600160801b03929092169190911790556020810151611568906119ff565b600780546001600160801b03928316600160801b02921691909117905550565b611592835f611a13565b156115b3578060015f8282546115a89190612e2d565b909155506116289050565b65ffffffffffff1983165f908152602081905260409020548181101561160a57604051637ec2996b60e01b815265ffffffffffff198516600482015260248101829052604481018390526064015b60405180910390fd5b65ffffffffffff1984165f9081526020819052604090209082900390555b611632825f611a13565b1561164557600180548290039055611663565b65ffffffffffff1982165f9081526020819052604090208054820190555b6040805165ffffffffffff198086168252841660208201529081018290527f48eeac6987cc7ebd298919de8cefd9769858440e7adc718f7e9cbd31ccb5b82c9060600160405180910390a1505050565b63ffffffff8116600a118015906116d25750610e1063ffffffff821611155b610750576040516354c2857360e11b815260040160405180910390fd5b5f6116fa8383611a24565b6114bd90612e13565b5f6001607f1b820160801c611716575090565b61171e611888565b919050565b5f63ffffffff8516816117368685612e40565b60030b9050805f0361174c5787925050506117ab565b81811261175d5784925050506117ab565b5f6117688284612e5c565b89600f0b6117769190612e7b565b61178483600f89900b612e7b565b61178e9190612dec565b905061179a8382612ebe565b90506117a581611703565b93505050505b95945050505050565b5f6114bd836117c284612e13565b611a37565b60ff81901d9081011890565b81810281810483146117f25781156117f25763bac65e5b5f526004601cfd5b670de0b6b3a7640000808206151591040192915050565b5f5f8212611716575090565b5f80611825846305f5e100611ba5565b9150611835836305f5e100611bc1565b90509250929050565b5f806118668861184d89612e13565b8861185789612e13565b8861186189612e13565b611bdd565b91509150965096945050505050565b5f6116fa8361188384612e13565b611dbe565b6335278d125f526004601cfd5b5f5f5f6118a58860400151611809565b6118ae85611809565b6118b89088612e7b565b6118c29190612ebe565b9250876060015188608001511115905080156118e0575f91506119f4565b5f6118ea86611eba565b90505f5f6118f78a611ed9565b61190084611ed9565b1490508015611933578a6040015187611918856117c7565b6119229190612eea565b61192c9190612f01565b9150611958565b6119558b6040015188611945866117c7565b61194f9190612eea565b90611efa565b91505b61196183611ed9565b61196a83611809565b6119749190612e7b565b94508a60400151878c5f015161198a9190612eea565b6119949190612f01565b8b518c906119a3908390612f14565b90525060408b015160208c01516119bb908990612eea565b6119c59190612f01565b8b6020018181516119d69190612f14565b90525060408b0180518891906119ed908390612f14565b9052505050505b955095509592505050565b5f600160801b82106114ee576114ee611888565b65ffffffffffff1990811691161490565b5f6114bd611a328385611f19565b611809565b5f5f611a4284611f5b565b90505f5f611a4f856117c7565b90505f851315611a9057611a64816001612e2d565b865111611a8457604051633582eca960e21b815260040160405180910390fd5b85518190039150611aa0565b8551611a9d908290612e2d565b91505b602086015186515f91611abd91611ab79087611fb7565b90612122565b90505f611ad4611acd8587611fb7565b8390611f19565b9050838860c00151611ae69190612eea565b611af8670de0b6b3a764000083612eea565b1015611b1757604051633582eca960e21b815260040160405180910390fd5b838860e00151611b279190612eea565b611b39670de0b6b3a764000083612eea565b1115611b5857604051633582eca960e21b815260040160405180910390fd5b5f611b668960200151611809565b611b6f83611809565b611b799190612e5c565b858a5260208a018390529050611b98611b9187611809565b8290612151565b9998505050505050505050565b5f6114bd83611bbc84670de0b6b3a7640000612e2d565b6117d3565b5f6114bd83611bd884670de0b6b3a7640000612f14565b612122565b606086015160808701515f91829111801590611c0c57604051635f2a407b60e01b815260040160405180910390fd5b5f8713611c1b57611c1b612f27565b5f611c2587611eba565b9050611c3085611ed9565b611c3982611ed9565b14611c575760405163c510544560e01b815260040160405180910390fd5b805f03611c8b5787611c6887611809565b8b60400151611c779190612eea565b611c819190612f01565b9250859350611d36565b5f611c95826117c7565b90505f611ca1876117c7565b90505f611cad8c611ed9565b611cb685611ed9565b1490508015611ce15782828e60400151611cd09190612eea565b611cda9190612f01565b9550611cf8565b611cf583838f6040015161194f9190612eea565b95505b611d0f611a328e60400151888e61194f9190612eea565b965088871315611d325760405163580ca8fd60e01b815260040160405180910390fd5b5050505b60408a01518a51611d48908590612eea565b611d529190612f01565b8a518b90611d61908390612e2d565b90525060408a015160208b0151611d79908590612eea565b611d839190612f01565b8a602001818151611d949190612e2d565b90525060408a018051849190611dab908390612e2d565b9052509299919850909650505050505050565b5f611dc9838361217b565b91505f611ddd845f01518560200151611a24565b9050600a611df3611dee8386612e5c565b6117c7565b1080611e085750610100840151606085015110155b15611e16575f915050610d6d565b5f611e2084611809565b90505f611e2c86611f5b565b90505f611e41670de0b6b3a764000083612e2d565b602088015188519192505f91611e579085611fb7565b611e619190612eea565b90505f611e9a6002611e8e611e7e670de0b6b3a764000087611f19565b611e888987612f01565b90611fb7565b90808218908210021890565b9050611ea581611809565b8951611eb090611809565b611b989190612e5c565b5f6103e8611ec7836117c7565b10611ed25781610d6d565b5f92915050565b5f5f821315611eea57506001919050565b5f821215611ed257505f19919050565b5f81611f0d576365244e4e5f526004601cfd5b50808206151591040190565b5f7812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f2283108202611f4957637c5f487d5f526004601cfd5b50670de0b6b3a7640000919091020490565b61010081015160608201515f9111611f865760405163c32bc49360e01b815260040160405180910390fd5b610d6d8260a001518360800151611f9d9190612f14565b83606001518460800151611fb19190612f14565b90611f19565b5f815f03611fce5750670de0b6b3a7640000610d6d565b825f03611fdc57505f610d6d565b600160ff1b831061200057604051637304657960e01b815260040160405180910390fd5b82770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532831061203957604051637304657960e01b815260040160405180910390fd5b825f670c7d713b49da0000831380156120595750670f43fc2c04ee000083125b1561208f575f612068846121c4565b9050670de0b6b3a764000080820784020583670de0b6b3a76400008305020191505061209d565b81612099846122e1565b0290505b670de0b6b3a76400009005680238fd42c5cf03ffff1981128015906120cb575068070c1cc73b00c800008113155b61210f5760405162461bcd60e51b815260206004820152601560248201527470726f64756374206f7574206f6620626f756e647360581b6044820152606401611601565b6121188161267f565b9695505050505050565b5f815f19048311156121415781156121415763bac65e5b5f526004601cfd5b50670de0b6b3a764000091020490565b670de0b6b3a76400008281029081058314820261217557635c43740d5f526004601cfd5b05919050565b5f5f5f6121908560c001518660e00151611815565b915091506117ab6121a082611809565b6121b86121ac85611809565b80881290881802871890565b90808218908213021890565b670de0b6b3a7640000025f806a0c097ce7bc90715b34b9f160241b808401906ec097ce7bc90715b34b9f0fffffffff198501028161220457612204612eaa565b0590505f6a0c097ce7bc90715b34b9f160241b82800205905081806a0c097ce7bc90715b34b9f160241b81840205915060038205016a0c097ce7bc90715b34b9f160241b82840205915060058205016a0c097ce7bc90715b34b9f160241b82840205915060078205016a0c097ce7bc90715b34b9f160241b82840205915060098205016a0c097ce7bc90715b34b9f160241b828402059150600b8205016a0c097ce7bc90715b34b9f160241b828402059150600d8205016a0c097ce7bc90715b34b9f160241b828402059150600f82050160020295945050505050565b5f670de0b6b3a764000082121561232057612318826a0c097ce7bc90715b34b9f160241b8161231257612312612eaa565b056122e1565b5f0392915050565b5f775803bcc5cb9634ba4cfb2213f784019318ed4dcb6017880f60361b831261236a5772195e54c5dd42177f53a27172fa9ec63026282760241b830592506806f05b59d3b2000000015b6f8bcc0026baae9e45e470190267a230cf60191b83126123a1576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff008400083126123e9576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312612424576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf850831261245b57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e2831261249257690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d0383126124c75768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb4174612111083126124f257680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312612527576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f1775788937937831261255c576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312612590576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac83126125c4576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b5f68056bc75e2d63100000840168056bc75e2d6310000080860302816125ec576125ec612eaa565b0590505f68056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b5f680238fd42c5cf03ffff1982121580156126a3575068070c1cc73b00c800008213155b6126c05760405163739a565d60e11b815260040160405180910390fd5b5f8212156126f6576126d3825f0361267f565b6a0c097ce7bc90715b34b9f160241b816126ef576126ef612eaa565b0592915050565b5f6806f05b59d3b2000000831261273357506806f05b59d3b1ffffff199091019072195e54c5dd42177f53a27172fa9ec63026282760241b612769565b6803782dace9d9000000831261276557506803782dace9d8ffffff19909101906b1425982cf597cd205cef7380612769565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac6200000084126127b95768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d63100000084126127f5576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b18800000841261282f57682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412612869576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac620000084126128a257680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d6310000084126128db5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412612914576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c40000841261294d5768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b6040518061012001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b803565ffffffffffff198116811461171e575f5ffd5b5f5f5f5f60808587031215612b0f575f5ffd5b612b1885612ae6565b966020860135965060408601359560600135945092505050565b65ffffffffffff1991909116815260200190565b63ffffffff81168114610750575f5ffd5b5f60208284031215612b67575f5ffd5b81356114bd81612b46565b5f60208284031215612b82575f5ffd5b5035919050565b6001600160401b0391909116815260200190565b5f60208284031215612bad575f5ffd5b81356001600160401b03811681146114bd575f5ffd5b5f60208284031215612bd3575f5ffd5b6114bd82612ae6565b80356001600160801b038116811461171e575f5ffd5b5f5f5f60608486031215612c04575f5ffd5b612c0d84612bdc565b9250612c1b60208501612bdc565b91506040840135612c2b81612b46565b809150509250925092565b5f5f5f5f5f60a08688031215612c4a575f5ffd5b612c5386612ae6565b97602087013597506040870135966060810135965060800135945092505050565b6001600160801b038b811682528a8116602083015263ffffffff8a8116604084015289811660608401526001600160401b038916608084015260a0830188905286821660c084015290851660e083015283166101008201526101408101612ce1610120830184600f0b9052565b9b9a5050505050505050505050565b600181811c90821680612d0457607f821691505b6020821081036111c957634e487b7160e01b5f52602260045260245ffd5b9283526020830191909152604082015260600190565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f60208284031215612d75575f5ffd5b815180151581146114bd575f5ffd5b5f60208284031215612d94575f5ffd5b81516114bd81612b46565b5f60208284031215612daf575f5ffd5b5051919050565b5f60208284031215612dc6575f5ffd5b815162ffffff811681146114bd575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018281125f831280158216821582161715612e0b57612e0b612dd8565b505092915050565b5f600160ff1b8201612e2757612e27612dd8565b505f0390565b80820180821115610d6d57610d6d612dd8565b63ffffffff8281168282160390811115610d6d57610d6d612dd8565b8181035f831280158383131683831282161715610da757610da7612dd8565b8082025f8212600160ff1b84141615612e9657612e96612dd8565b8181058314821517610d6d57610d6d612dd8565b634e487b7160e01b5f52601260045260245ffd5b5f82612ecc57612ecc612eaa565b600160ff1b82145f1984141615612ee557612ee5612dd8565b500590565b8082028115828204841417610d6d57610d6d612dd8565b5f82612f0f57612f0f612eaa565b500490565b81810381811115610d6d57610d6d612dd8565b634e487b7160e01b5f52600160045260245ffdfea264697066735822122091f989306df538ccd045ae1b6b72261efe30b0e45809b9ccf3606664473f2aae64736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
