{
  "_format": "hh-sol-artifact-1",
  "contractName": "SortedVaults",
  "sourceName": "contracts/SortedVaults.sol",
  "abi": [
    {
      "inputs": [],
      "name": "AICRMustBePositive",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AddressesAlreadySet",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "DuplicateNode",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ExternalCallerNotAllowed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "IdCannotBeZero",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "IdNotFound",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ListIsFull",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "SizeCannotBeZero",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_id",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_AICR",
          "type": "uint256"
        }
      ],
      "name": "NodeAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "NodeRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "UnderCollateralizedVaultAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "UnderCollateralizedVaultRemoved",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "boostMinuteDecayFactor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_newBoostMinuteDecayFactor",
          "type": "uint256"
        }
      ],
      "name": "changeBoostMinuteDecayFactor",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_newGlobalBoostMultiplier",
          "type": "uint256"
        }
      ],
      "name": "changeGlobalBoostMultiplier",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "contains",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "data",
      "outputs": [
        {
          "internalType": "address",
          "name": "head",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "tail",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "maxSize",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "size",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_boostedAICR",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_prevId",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_nextId",
          "type": "address"
        }
      ],
      "name": "findInsertPosition",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "getBoost",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "getDecayedBoost",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getFirst",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getLast",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getMaxSize",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "getNext",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "getNode",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "getOldBoostedAICR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "getPrev",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getSize",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "getTimeSinceBoostUpdated",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getUnderCollateralizedVaultsSize",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "globalBoostFactor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_size",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_vaultManagerAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_borrowerOperationsAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_vaultManagerRedemptionsAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_vaultedgeControllerAddress",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_AICR",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_prevId",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_nextId",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_feeAsPercentOfTotal",
          "type": "uint256"
        }
      ],
      "name": "insert",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isEmpty",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isFull",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_newAICR",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_prevId",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_nextId",
          "type": "address"
        }
      ],
      "name": "reInsert",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_ids",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_newAICRs",
          "type": "uint256[]"
        },
        {
          "internalType": "address[]",
          "name": "_prevIds",
          "type": "address[]"
        },
        {
          "internalType": "address[]",
          "name": "_nextIds",
          "type": "address[]"
        }
      ],
      "name": "reInsertMany",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_newAICR",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_prevId",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_nextId",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_feeAsPercentOfAddedVC",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_addedVCIn",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_VCBeforeAdjustment",
          "type": "uint256"
        }
      ],
      "name": "reInsertWithNewBoost",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        }
      ],
      "name": "remove",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "underCollateralizedVaults",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "underCollateralizedVaultsSize",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_id",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_isUnderCollateralized",
          "type": "bool"
        }
      ],
      "name": "updateUnderCollateralizedVault",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_boostedAICR",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_prevId",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_nextId",
          "type": "address"
        }
      ],
      "name": "validInsertPosition",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b50611d57806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063681fe70c1161010f5780639d209048116100a2578063dbd59ec611610071578063dbd59ec614610597578063dd2ae6ab1461059f578063de8fa431146105c2578063eda6460c146105ca57600080fd5b80639d20904814610487578063b0f0b72614610549578063b72703ac1461055c578063babd3d9a1461058b57600080fd5b806380ec46e8116100de57806380ec46e81461042c57806383be79a1146104355780638f37e2b814610448578063972108791461045b57600080fd5b8063681fe70c146103925780636ad88d051461039b57806373d4a13a146103ae578063765e0159146103fb57600080fd5b80633fce12d5116101875780635189b08f116101565780635189b08f146103065780635dbe47e81461033257806363e1d57c1461035e57806367ba3d901461036657600080fd5b80633fce12d514610288578063416980dc146102ab5780634d29756f146102de5780634d622831146102f557600080fd5b80632be21260116101c35780632be212601461023c5780633641e0831461024f57806338b1696b146102625780633e5d79471461027557600080fd5b8063078e1d48146101ea5780631e223143146101ff57806329092d0e14610229575b600080fd5b6101fd6101f836600461183c565b6105d3565b005b6006546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b6101fd610237366004611871565b6105e0565b6101fd61024a36600461188c565b6105f4565b6101fd61025d3660046118d9565b61060e565b6101fd610270366004611937565b610803565b6101fd610283366004611973565b6108a1565b61029b6102963660046119c8565b6108db565b6040519015158152602001610220565b6102be6102b93660046119c8565b6108f2565b604080516001600160a01b03938416815292909116602083015201610220565b6102e7600c5481565b604051908152602001610220565b6007546001600160a01b031661020c565b6102e7610314366004611871565b6001600160a01b03166000908152600a602052604090206002015490565b61029b610340366004611871565b6001600160a01b03166000908152600a602052604090205460ff1690565b6008546102e7565b6102e7610374366004611871565b6001600160a01b03166000908152600a602052604090206003015490565b6009541561029b565b6102e76103a9366004611871565b61090d565b6006546007546008546009546103d0936001600160a01b039081169316919084565b604080516001600160a01b039586168152949093166020850152918301526060820152608001610220565b61020c610409366004611871565b6001600160a01b039081166000908152600a602052604090205461010090041690565b6102e760045481565b6101fd610443366004611a04565b610940565b6101fd610456366004611b49565b610a4e565b6102e7610469366004611871565b6001600160a01b03166000908152600a602052604090206004015490565b61050e610495366004611871565b6001600160a01b039081166000908152600a6020908152604091829020825160c081018452815460ff811615158083526101009091048616938201849052600183015490951693810184905260028201546060820181905260038301546080830181905260049093015460a09092018290529495929492565b6040805196151587526001600160a01b03958616602088015293909416928501929092526060840152608083015260a082015260c001610220565b6101fd61055736600461183c565b610ae3565b61020c61056a366004611871565b6001600160a01b039081166000908152600a60205260409020600101541690565b6008546009541461029b565b600c546102e7565b61029b6105ad366004611871565b600b6020526000908152604090205460ff1681565b6009546102e7565b6102e760055481565b6105db610af0565b600555565b6105e8610b1d565b6105f181610b48565b50565b6105fc610d9d565b61060884848484610de1565b50505050565b600054610100900460ff161580801561062e5750600054600160ff909116105b806106485750303b158015610648575060005460ff166001145b6106d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b6000805460ff1916600117905580156106fb576000805461ff0019166101001790555b85600003610735576040517fc41012d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008869055670de05f26061b696d600555600280546001600160a01b03199081166001600160a01b0388811691909117909255600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1662010000888516021790556001805482168684161790556003805490911691841691909117905580156107fb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61080b610b1d565b6001600160a01b0382166000908152600a602052604090205460ff1661084457604051631820c31160e31b815260040160405180910390fd5b8015610877576001600160a01b0382166000908152600b602052604090205460ff166108735761087382610e87565b5050565b6001600160a01b0382166000908152600b602052604090205460ff16156108735761087382610eee565b6108a9610f52565b6000670de0b6b3a7640000600454836108c29190611c60565b6108cc9190611c8d565b90506107fb8686868685610f83565b60006108e88484846112f8565b90505b9392505050565b600080610900858585611437565b915091505b935093915050565b6001600160a01b0381166000908152600a60205260408120600381015460049091015461093a9190611570565b92915050565b610948610f52565b6001600160a01b0387166000908152600a602052604090205460ff1661098157604051631820c31160e31b815260040160405180910390fd5b856000036109a257604051630f1353bb60e41b815260040160405180910390fd5b6001600160a01b0387166000908152600a6020526040812060038101546004909101546109cf9190611570565b90506109da88610b48565b6000670de0b6b3a7640000600454866109f39190611c60565b6109fd9190611c8d565b90506000610a0b8585611ca1565b610a158684611c60565b610a1f8686611c60565b610a299190611ca1565b610a339190611c8d565b9050610a428a8a8a8a85610f83565b50505050505050505050565b610a56610d9d565b835160005b818110156107fb57610ad3868281518110610a7857610a78611cb4565b6020026020010151868381518110610a9257610a92611cb4565b6020026020010151868481518110610aac57610aac611cb4565b6020026020010151868581518110610ac657610ac6611cb4565b6020026020010151610de1565b610adc81611cca565b9050610a5b565b610aeb610af0565b600455565b6003546001600160a01b03163314610b1b57604051631f0b2b4960e31b815260040160405180910390fd5b565b6002546001600160a01b03163314610b1b57604051631f0b2b4960e31b815260040160405180910390fd5b6001600160a01b0381166000908152600a602052604090205460ff16610b8157604051631820c31160e31b815260040160405180910390fd5b60095460011015610cc1576006546001600160a01b0390811690821603610bee576001600160a01b038082166000908152600a602052604080822054600680546001600160a01b031990811661010090930490951691821790558252902060010180549091169055610cde565b6007546001600160a01b0390811690821603610c52576001600160a01b038082166000908152600a602052604080822060010154600780546001600160a01b03191691909416908117909355918152208054610100600160a81b0319169055610cde565b6001600160a01b038082166000908152600a60205260408082208054600180830180548716865284862080546101009485900489168502610100600160a81b03199091161790555492549190910485168452919092200180546001600160a01b03191691909216179055610cde565b600680546001600160a01b03199081169091556007805490911690555b6001600160a01b0381166000908152600a6020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000168155600180820180546001600160a01b0319169055600282018390556003820183905560049091018290556009805491929091610d58908490611ce3565b90915550506040516001600160a01b03821681527fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b906020015b60405180910390a150565b6002546001600160a01b03163314801590610dc357506001546001600160a01b03163314155b15610b1b57604051631f0b2b4960e31b815260040160405180910390fd5b6001600160a01b0384166000908152600a602052604090205460ff16610e1a57604051631820c31160e31b815260040160405180910390fd5b82600003610e3b57604051630f1353bb60e41b815260040160405180910390fd5b6001600160a01b0384166000908152600a602052604081206003810154600490910154610e689190611570565b9050610e7385610b48565b610e808585858585610f83565b5050505050565b600c60008154610e9690611cca565b909155506001600160a01b0381166000818152600b6020908152604091829020805460ff1916600117905590519182527f1a639b64ce113a4821704131b48b1b95856a5432622973ac36ef8f0f3b5cd19c9101610d92565b600c60008154610efd90611cf6565b909155506001600160a01b0381166000818152600b6020908152604091829020805460ff1916905590519182527ffc610bfd6865ebbedb6815b380b8bb0813997fa8cb43210101ff3733a1fed2fc9101610d92565b6000546201000090046001600160a01b03163314610b1b57604051631f0b2b4960e31b815260040160405180910390fd5b60085460095403610fc0576040517f77cd145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152600a602052604090205460ff1615611013576040517f0fa1af0e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516611053576040517f6f25946a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360000361107457604051630f1353bb60e41b815260040160405180910390fd5b60006110808286611ca1565b9050838361108f8383836112f8565b6110a45761109e838383611437565b90925090505b6001600160a01b038089166000908152600a60205260409020805460ff1916600117905582161580156110de57506001600160a01b038116155b1561111357600680546001600160a01b038a166001600160a01b03199182168117909255600780549091169091179055611267565b6001600160a01b03821661118757600680546001600160a01b038a81166000818152600a6020526040808220805495851661010002610100600160a81b0319909616959095179094558454909216825291902060010180546001600160a01b03199081168317909155825416179055611267565b6001600160a01b0381166111f757600780546001600160a01b038a81166000818152600a602052604080822060010180549585166001600160a01b031996871617905585549093168152919091208054610100600160a81b03191661010083021790558254909116179055611267565b6001600160a01b038089166000818152600a60205260408082208054858716610100818102610100600160a81b031993841617845560019384018054988b166001600160a01b0319998a168117909155865284862080549188029190931617909155835291200180549092161790555b6001600160a01b0388166000908152600a6020526040812060028101859055600381018690554260049091015560098054600192906112a7908490611ca1565b9091555050604080516001600160a01b038a168152602081018590527fe02b43adbee0c123de070a04554a71877a0007e2fc161466299cae3c094fe82f910160405180910390a15050505050505050565b60006001600160a01b03831615801561131857506001600160a01b038216155b1561132957600954155b90506108eb565b6001600160a01b038316611374576006546001600160a01b0383811691161480156113225750506001600160a01b0381166000908152600a60205260409020600201548310156108eb565b6001600160a01b0382166113bf576007546001600160a01b0384811691161480156113225750506001600160a01b0382166000908152600a60205260409020600201548311156108eb565b6001600160a01b038381166000908152600a60205260409020546101009004811690831614801561140b57506001600160a01b0383166000908152600a60205260409020600201548411155b80156113225750506001600160a01b0381166000908152600a60205260409020600201548310156108eb565b60008083836001600160a01b03821615611497576001600160a01b0382166000908152600a602052604090205460ff16158061148d57506001600160a01b0382166000908152600a602052604090206002015487115b1561149757600091505b6001600160a01b038116156114f1576001600160a01b0381166000908152600a602052604090205460ff1615806114e857506001600160a01b0381166000908152600a602052604090206002015487105b156114f1575060005b6001600160a01b03821615801561150f57506001600160a01b038116155b156115365760065461152b9088906001600160a01b03166115c1565b935093505050610905565b6001600160a01b03821661154e5761152b878261169c565b6001600160a01b0381166115665761152b87836115c1565b61152b87836115c1565b600080603c61157f8442611ce3565b6115899190611c8d565b905060006115996005548361176f565b9050670de0b6b3a76400006115ae8287611c60565b6115b89190611c8d565b95945050505050565b60065460009081906001600160a01b0384811691161480156115fe57506001600160a01b0383166000908152600a60205260409020600201548410155b1561160e57506000905081611695565b6001600160a01b038084166000908152600a60205260409020548491610100909104165b6001600160a01b0382161580159061165257506116508683836112f8565b155b1561168f57506001600160a01b039081166000908152600a6020526040808220546101009081900484168084529190922054909291900416611632565b90925090505b9250929050565b60075460009081906001600160a01b0384811691161480156116d957506001600160a01b0383166000908152600a60205260409020600201548411155b156116e957508190506000611695565b6001600160a01b038084166000908152600a60205260409020600101548491165b6001600160a01b0382161580159061172a57506117288682846112f8565b155b1561176557506001600160a01b039081166000908152600a60205260408082206001908101548416808452919092209091015490911661170a565b9590945092505050565b6000631f54050082111561178557631f54050091505b8160000361179c5750670de0b6b3a764000061093a565b670de0b6b3a764000083835b60018111156117ec576117bc600282611d0d565b156117ce576117cb8284611800565b92505b6117d88283611800565b91506117e5600282611c8d565b90506117a8565b6117f68284611800565b9695505050505050565b60008061180d8385611c60565b9050670de0b6b3a764000061182a6706f05b59d3b2000083611ca1565b6118349190611c8d565b949350505050565b60006020828403121561184e57600080fd5b5035919050565b80356001600160a01b038116811461186c57600080fd5b919050565b60006020828403121561188357600080fd5b6108eb82611855565b600080600080608085870312156118a257600080fd5b6118ab85611855565b9350602085013592506118c060408601611855565b91506118ce60608601611855565b905092959194509250565b600080600080600060a086880312156118f157600080fd5b8535945061190160208701611855565b935061190f60408701611855565b925061191d60608701611855565b915061192b60808701611855565b90509295509295909350565b6000806040838503121561194a57600080fd5b61195383611855565b91506020830135801515811461196857600080fd5b809150509250929050565b600080600080600060a0868803121561198b57600080fd5b61199486611855565b9450602086013593506119a960408701611855565b92506119b760608701611855565b949793965091946080013592915050565b6000806000606084860312156119dd57600080fd5b833592506119ed60208501611855565b91506119fb60408501611855565b90509250925092565b600080600080600080600060e0888a031215611a1f57600080fd5b611a2888611855565b965060208801359550611a3d60408901611855565b9450611a4b60608901611855565b9699959850939660808101359560a0820135955060c0909101359350915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611aab57611aab611a6c565b604052919050565b600067ffffffffffffffff821115611acd57611acd611a6c565b5060051b60200190565b600082601f830112611ae857600080fd5b81356020611afd611af883611ab3565b611a82565b82815260059290921b84018101918181019086841115611b1c57600080fd5b8286015b84811015611b3e57611b3181611855565b8352918301918301611b20565b509695505050505050565b60008060008060808587031215611b5f57600080fd5b843567ffffffffffffffff80821115611b7757600080fd5b611b8388838901611ad7565b9550602091508187013581811115611b9a57600080fd5b8701601f81018913611bab57600080fd5b8035611bb9611af882611ab3565b81815260059190911b8201840190848101908b831115611bd857600080fd5b928501925b82841015611bf657833582529285019290850190611bdd565b97505050506040870135915080821115611c0f57600080fd5b611c1b88838901611ad7565b93506060870135915080821115611c3157600080fd5b50611c3e87828801611ad7565b91505092959194509250565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761093a5761093a611c4a565b634e487b7160e01b600052601260045260246000fd5b600082611c9c57611c9c611c77565b500490565b8082018082111561093a5761093a611c4a565b634e487b7160e01b600052603260045260246000fd5b600060018201611cdc57611cdc611c4a565b5060010190565b8181038181111561093a5761093a611c4a565b600081611d0557611d05611c4a565b506000190190565b600082611d1c57611d1c611c77565b50069056fea264697066735822122095d7bc7d92ee1dcade25be904b1ac38998d79ddeae58ea0939f5c82eb1c7c75564736f6c63430008130033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101e55760003560e01c8063681fe70c1161010f5780639d209048116100a2578063dbd59ec611610071578063dbd59ec614610597578063dd2ae6ab1461059f578063de8fa431146105c2578063eda6460c146105ca57600080fd5b80639d20904814610487578063b0f0b72614610549578063b72703ac1461055c578063babd3d9a1461058b57600080fd5b806380ec46e8116100de57806380ec46e81461042c57806383be79a1146104355780638f37e2b814610448578063972108791461045b57600080fd5b8063681fe70c146103925780636ad88d051461039b57806373d4a13a146103ae578063765e0159146103fb57600080fd5b80633fce12d5116101875780635189b08f116101565780635189b08f146103065780635dbe47e81461033257806363e1d57c1461035e57806367ba3d901461036657600080fd5b80633fce12d514610288578063416980dc146102ab5780634d29756f146102de5780634d622831146102f557600080fd5b80632be21260116101c35780632be212601461023c5780633641e0831461024f57806338b1696b146102625780633e5d79471461027557600080fd5b8063078e1d48146101ea5780631e223143146101ff57806329092d0e14610229575b600080fd5b6101fd6101f836600461183c565b6105d3565b005b6006546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b6101fd610237366004611871565b6105e0565b6101fd61024a36600461188c565b6105f4565b6101fd61025d3660046118d9565b61060e565b6101fd610270366004611937565b610803565b6101fd610283366004611973565b6108a1565b61029b6102963660046119c8565b6108db565b6040519015158152602001610220565b6102be6102b93660046119c8565b6108f2565b604080516001600160a01b03938416815292909116602083015201610220565b6102e7600c5481565b604051908152602001610220565b6007546001600160a01b031661020c565b6102e7610314366004611871565b6001600160a01b03166000908152600a602052604090206002015490565b61029b610340366004611871565b6001600160a01b03166000908152600a602052604090205460ff1690565b6008546102e7565b6102e7610374366004611871565b6001600160a01b03166000908152600a602052604090206003015490565b6009541561029b565b6102e76103a9366004611871565b61090d565b6006546007546008546009546103d0936001600160a01b039081169316919084565b604080516001600160a01b039586168152949093166020850152918301526060820152608001610220565b61020c610409366004611871565b6001600160a01b039081166000908152600a602052604090205461010090041690565b6102e760045481565b6101fd610443366004611a04565b610940565b6101fd610456366004611b49565b610a4e565b6102e7610469366004611871565b6001600160a01b03166000908152600a602052604090206004015490565b61050e610495366004611871565b6001600160a01b039081166000908152600a6020908152604091829020825160c081018452815460ff811615158083526101009091048616938201849052600183015490951693810184905260028201546060820181905260038301546080830181905260049093015460a09092018290529495929492565b6040805196151587526001600160a01b03958616602088015293909416928501929092526060840152608083015260a082015260c001610220565b6101fd61055736600461183c565b610ae3565b61020c61056a366004611871565b6001600160a01b039081166000908152600a60205260409020600101541690565b6008546009541461029b565b600c546102e7565b61029b6105ad366004611871565b600b6020526000908152604090205460ff1681565b6009546102e7565b6102e760055481565b6105db610af0565b600555565b6105e8610b1d565b6105f181610b48565b50565b6105fc610d9d565b61060884848484610de1565b50505050565b600054610100900460ff161580801561062e5750600054600160ff909116105b806106485750303b158015610648575060005460ff166001145b6106d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b6000805460ff1916600117905580156106fb576000805461ff0019166101001790555b85600003610735576040517fc41012d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008869055670de05f26061b696d600555600280546001600160a01b03199081166001600160a01b0388811691909117909255600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1662010000888516021790556001805482168684161790556003805490911691841691909117905580156107fb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61080b610b1d565b6001600160a01b0382166000908152600a602052604090205460ff1661084457604051631820c31160e31b815260040160405180910390fd5b8015610877576001600160a01b0382166000908152600b602052604090205460ff166108735761087382610e87565b5050565b6001600160a01b0382166000908152600b602052604090205460ff16156108735761087382610eee565b6108a9610f52565b6000670de0b6b3a7640000600454836108c29190611c60565b6108cc9190611c8d565b90506107fb8686868685610f83565b60006108e88484846112f8565b90505b9392505050565b600080610900858585611437565b915091505b935093915050565b6001600160a01b0381166000908152600a60205260408120600381015460049091015461093a9190611570565b92915050565b610948610f52565b6001600160a01b0387166000908152600a602052604090205460ff1661098157604051631820c31160e31b815260040160405180910390fd5b856000036109a257604051630f1353bb60e41b815260040160405180910390fd5b6001600160a01b0387166000908152600a6020526040812060038101546004909101546109cf9190611570565b90506109da88610b48565b6000670de0b6b3a7640000600454866109f39190611c60565b6109fd9190611c8d565b90506000610a0b8585611ca1565b610a158684611c60565b610a1f8686611c60565b610a299190611ca1565b610a339190611c8d565b9050610a428a8a8a8a85610f83565b50505050505050505050565b610a56610d9d565b835160005b818110156107fb57610ad3868281518110610a7857610a78611cb4565b6020026020010151868381518110610a9257610a92611cb4565b6020026020010151868481518110610aac57610aac611cb4565b6020026020010151868581518110610ac657610ac6611cb4565b6020026020010151610de1565b610adc81611cca565b9050610a5b565b610aeb610af0565b600455565b6003546001600160a01b03163314610b1b57604051631f0b2b4960e31b815260040160405180910390fd5b565b6002546001600160a01b03163314610b1b57604051631f0b2b4960e31b815260040160405180910390fd5b6001600160a01b0381166000908152600a602052604090205460ff16610b8157604051631820c31160e31b815260040160405180910390fd5b60095460011015610cc1576006546001600160a01b0390811690821603610bee576001600160a01b038082166000908152600a602052604080822054600680546001600160a01b031990811661010090930490951691821790558252902060010180549091169055610cde565b6007546001600160a01b0390811690821603610c52576001600160a01b038082166000908152600a602052604080822060010154600780546001600160a01b03191691909416908117909355918152208054610100600160a81b0319169055610cde565b6001600160a01b038082166000908152600a60205260408082208054600180830180548716865284862080546101009485900489168502610100600160a81b03199091161790555492549190910485168452919092200180546001600160a01b03191691909216179055610cde565b600680546001600160a01b03199081169091556007805490911690555b6001600160a01b0381166000908152600a6020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000168155600180820180546001600160a01b0319169055600282018390556003820183905560049091018290556009805491929091610d58908490611ce3565b90915550506040516001600160a01b03821681527fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b906020015b60405180910390a150565b6002546001600160a01b03163314801590610dc357506001546001600160a01b03163314155b15610b1b57604051631f0b2b4960e31b815260040160405180910390fd5b6001600160a01b0384166000908152600a602052604090205460ff16610e1a57604051631820c31160e31b815260040160405180910390fd5b82600003610e3b57604051630f1353bb60e41b815260040160405180910390fd5b6001600160a01b0384166000908152600a602052604081206003810154600490910154610e689190611570565b9050610e7385610b48565b610e808585858585610f83565b5050505050565b600c60008154610e9690611cca565b909155506001600160a01b0381166000818152600b6020908152604091829020805460ff1916600117905590519182527f1a639b64ce113a4821704131b48b1b95856a5432622973ac36ef8f0f3b5cd19c9101610d92565b600c60008154610efd90611cf6565b909155506001600160a01b0381166000818152600b6020908152604091829020805460ff1916905590519182527ffc610bfd6865ebbedb6815b380b8bb0813997fa8cb43210101ff3733a1fed2fc9101610d92565b6000546201000090046001600160a01b03163314610b1b57604051631f0b2b4960e31b815260040160405180910390fd5b60085460095403610fc0576040517f77cd145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152600a602052604090205460ff1615611013576040517f0fa1af0e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516611053576040517f6f25946a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360000361107457604051630f1353bb60e41b815260040160405180910390fd5b60006110808286611ca1565b9050838361108f8383836112f8565b6110a45761109e838383611437565b90925090505b6001600160a01b038089166000908152600a60205260409020805460ff1916600117905582161580156110de57506001600160a01b038116155b1561111357600680546001600160a01b038a166001600160a01b03199182168117909255600780549091169091179055611267565b6001600160a01b03821661118757600680546001600160a01b038a81166000818152600a6020526040808220805495851661010002610100600160a81b0319909616959095179094558454909216825291902060010180546001600160a01b03199081168317909155825416179055611267565b6001600160a01b0381166111f757600780546001600160a01b038a81166000818152600a602052604080822060010180549585166001600160a01b031996871617905585549093168152919091208054610100600160a81b03191661010083021790558254909116179055611267565b6001600160a01b038089166000818152600a60205260408082208054858716610100818102610100600160a81b031993841617845560019384018054988b166001600160a01b0319998a168117909155865284862080549188029190931617909155835291200180549092161790555b6001600160a01b0388166000908152600a6020526040812060028101859055600381018690554260049091015560098054600192906112a7908490611ca1565b9091555050604080516001600160a01b038a168152602081018590527fe02b43adbee0c123de070a04554a71877a0007e2fc161466299cae3c094fe82f910160405180910390a15050505050505050565b60006001600160a01b03831615801561131857506001600160a01b038216155b1561132957600954155b90506108eb565b6001600160a01b038316611374576006546001600160a01b0383811691161480156113225750506001600160a01b0381166000908152600a60205260409020600201548310156108eb565b6001600160a01b0382166113bf576007546001600160a01b0384811691161480156113225750506001600160a01b0382166000908152600a60205260409020600201548311156108eb565b6001600160a01b038381166000908152600a60205260409020546101009004811690831614801561140b57506001600160a01b0383166000908152600a60205260409020600201548411155b80156113225750506001600160a01b0381166000908152600a60205260409020600201548310156108eb565b60008083836001600160a01b03821615611497576001600160a01b0382166000908152600a602052604090205460ff16158061148d57506001600160a01b0382166000908152600a602052604090206002015487115b1561149757600091505b6001600160a01b038116156114f1576001600160a01b0381166000908152600a602052604090205460ff1615806114e857506001600160a01b0381166000908152600a602052604090206002015487105b156114f1575060005b6001600160a01b03821615801561150f57506001600160a01b038116155b156115365760065461152b9088906001600160a01b03166115c1565b935093505050610905565b6001600160a01b03821661154e5761152b878261169c565b6001600160a01b0381166115665761152b87836115c1565b61152b87836115c1565b600080603c61157f8442611ce3565b6115899190611c8d565b905060006115996005548361176f565b9050670de0b6b3a76400006115ae8287611c60565b6115b89190611c8d565b95945050505050565b60065460009081906001600160a01b0384811691161480156115fe57506001600160a01b0383166000908152600a60205260409020600201548410155b1561160e57506000905081611695565b6001600160a01b038084166000908152600a60205260409020548491610100909104165b6001600160a01b0382161580159061165257506116508683836112f8565b155b1561168f57506001600160a01b039081166000908152600a6020526040808220546101009081900484168084529190922054909291900416611632565b90925090505b9250929050565b60075460009081906001600160a01b0384811691161480156116d957506001600160a01b0383166000908152600a60205260409020600201548411155b156116e957508190506000611695565b6001600160a01b038084166000908152600a60205260409020600101548491165b6001600160a01b0382161580159061172a57506117288682846112f8565b155b1561176557506001600160a01b039081166000908152600a60205260408082206001908101548416808452919092209091015490911661170a565b9590945092505050565b6000631f54050082111561178557631f54050091505b8160000361179c5750670de0b6b3a764000061093a565b670de0b6b3a764000083835b60018111156117ec576117bc600282611d0d565b156117ce576117cb8284611800565b92505b6117d88283611800565b91506117e5600282611c8d565b90506117a8565b6117f68284611800565b9695505050505050565b60008061180d8385611c60565b9050670de0b6b3a764000061182a6706f05b59d3b2000083611ca1565b6118349190611c8d565b949350505050565b60006020828403121561184e57600080fd5b5035919050565b80356001600160a01b038116811461186c57600080fd5b919050565b60006020828403121561188357600080fd5b6108eb82611855565b600080600080608085870312156118a257600080fd5b6118ab85611855565b9350602085013592506118c060408601611855565b91506118ce60608601611855565b905092959194509250565b600080600080600060a086880312156118f157600080fd5b8535945061190160208701611855565b935061190f60408701611855565b925061191d60608701611855565b915061192b60808701611855565b90509295509295909350565b6000806040838503121561194a57600080fd5b61195383611855565b91506020830135801515811461196857600080fd5b809150509250929050565b600080600080600060a0868803121561198b57600080fd5b61199486611855565b9450602086013593506119a960408701611855565b92506119b760608701611855565b949793965091946080013592915050565b6000806000606084860312156119dd57600080fd5b833592506119ed60208501611855565b91506119fb60408501611855565b90509250925092565b600080600080600080600060e0888a031215611a1f57600080fd5b611a2888611855565b965060208801359550611a3d60408901611855565b9450611a4b60608901611855565b9699959850939660808101359560a0820135955060c0909101359350915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611aab57611aab611a6c565b604052919050565b600067ffffffffffffffff821115611acd57611acd611a6c565b5060051b60200190565b600082601f830112611ae857600080fd5b81356020611afd611af883611ab3565b611a82565b82815260059290921b84018101918181019086841115611b1c57600080fd5b8286015b84811015611b3e57611b3181611855565b8352918301918301611b20565b509695505050505050565b60008060008060808587031215611b5f57600080fd5b843567ffffffffffffffff80821115611b7757600080fd5b611b8388838901611ad7565b9550602091508187013581811115611b9a57600080fd5b8701601f81018913611bab57600080fd5b8035611bb9611af882611ab3565b81815260059190911b8201840190848101908b831115611bd857600080fd5b928501925b82841015611bf657833582529285019290850190611bdd565b97505050506040870135915080821115611c0f57600080fd5b611c1b88838901611ad7565b93506060870135915080821115611c3157600080fd5b50611c3e87828801611ad7565b91505092959194509250565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761093a5761093a611c4a565b634e487b7160e01b600052601260045260246000fd5b600082611c9c57611c9c611c77565b500490565b8082018082111561093a5761093a611c4a565b634e487b7160e01b600052603260045260246000fd5b600060018201611cdc57611cdc611c4a565b5060010190565b8181038181111561093a5761093a611c4a565b600081611d0557611d05611c4a565b506000190190565b600082611d1c57611d1c611c77565b50069056fea264697066735822122095d7bc7d92ee1dcade25be904b1ac38998d79ddeae58ea0939f5c82eb1c7c75564736f6c63430008130033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
