{
  "_format": "hh-sol-artifact-1",
  "contractName": "GoodMarketMaker",
  "sourceName": "contracts/reserve/GoodMarketMaker.sol",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "previousAdmin",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "AdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "reserveToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "returnAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "totalSupply",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "reserveBalance",
          "type": "uint256"
        }
      ],
      "name": "BalancesUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "beacon",
          "type": "address"
        }
      ],
      "name": "BeaconUpgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "nom",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "denom",
          "type": "uint256"
        }
      ],
      "name": "ReserveRatioUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "avatar",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_tokenAmount",
          "type": "uint256"
        }
      ],
      "name": "buy",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_tokenAmount",
          "type": "uint256"
        }
      ],
      "name": "buyReturn",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "calculateMintExpansion",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "toMint",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_addTokenSupply",
          "type": "uint256"
        }
      ],
      "name": "calculateMintInterest",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "toMint",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "calculateNewReserveRatio",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "currentPrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "dao",
      "outputs": [
        {
          "internalType": "contract Controller",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "expandReserveRatio",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getBancor",
      "outputs": [
        {
          "internalType": "contract BancorFormula",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract INameService",
          "name": "_ns",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_nom",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_denom",
          "type": "uint256"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gdSupply",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_tokenSupply",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "_reserveRatio",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "_lastExpansion",
          "type": "uint256"
        }
      ],
      "name": "initializeToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "mintExpansion",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gdAmount",
          "type": "uint256"
        }
      ],
      "name": "mintFromReserveRatio",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_addTokenSupply",
          "type": "uint256"
        }
      ],
      "name": "mintInterest",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "toMint",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nameService",
      "outputs": [
        {
          "internalType": "contract INameService",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nativeToken",
      "outputs": [
        {
          "internalType": "contract IGoodDollar",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "reserveRatioDailyExpansion",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "reserveTokens",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "reserveSupply",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "reserveRatio",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "gdSupply",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "lastExpansion",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gdAmount",
          "type": "uint256"
        }
      ],
      "name": "sellReturn",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gdAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_contributionGdAmount",
          "type": "uint256"
        }
      ],
      "name": "sellWithContribution",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_nom",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_denom",
          "type": "uint256"
        }
      ],
      "name": "setReserveRatioDailyExpansion",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "updateAvatar",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        }
      ],
      "name": "upgradeTo",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    }
  ],
  "bytecode": "0x60a06040523060805234801561001457600080fd5b506080516121a061004c600039600081816108080152818161084801528181610b1a01528181610b5a0152610bd601526121a06000f3fe6080604052600436106101315760003560e01c80630b184866146101365780631b3c90a8146101695780633659cfe614610180578063371d52dc146101a05780633e21374e146101d55780633e6326fc146101f55780634162169f1461022d57806346f7cb231461024d5780634f1ef2861461026d57806352d1902d146102805780635aef7de6146102955780635cf3a7a9146102b55780636a989e6e146102d55780636cb4b4c1146102f557806374920d301461030b5780637a1ac61e1461032b578063835bbd551461034b5780638c495962146103b95780638ee090fb146103ce5780639f2d0d07146103ee578063bc179d451461040e578063cce7ec131461042e578063d5dc7eda1461044e578063e1758bd81461046e578063e72a083314610483578063e9833c2f146104a3575b600080fd5b34801561014257600080fd5b50610156610151366004611bf9565b6104c3565b6040519081526020015b60405180910390f35b34801561017557600080fd5b5061017e6106d7565b005b34801561018c57600080fd5b5061017e61019b366004611c2e565b6107fe565b3480156101ac57600080fd5b506101c06101bb366004611c2e565b6108c6565b60405163ffffffff9091168152602001610160565b3480156101e157600080fd5b506101566101f0366004611c2e565b6109b8565b34801561020157600080fd5b50606754610215906001600160a01b031681565b6040516001600160a01b039091168152602001610160565b34801561023957600080fd5b50606554610215906001600160a01b031681565b34801561025957600080fd5b506101c0610268366004611c2e565b610a65565b61017e61027b366004611c61565b610b10565b34801561028c57600080fd5b50610156610bc9565b3480156102a157600080fd5b50606654610215906001600160a01b031681565b3480156102c157600080fd5b506101566102d0366004611d24565b610c77565b3480156102e157600080fd5b506101566102f0366004611d24565b610d54565b34801561030157600080fd5b50610156609b5481565b34801561031757600080fd5b50610156610326366004611d24565b610de6565b34801561033757600080fd5b5061017e610346366004611bf9565b610e69565b34801561035757600080fd5b50610394610366366004611c2e565b609a602052600090815260409020805460018201546002830154600390930154919263ffffffff9091169184565b6040805194855263ffffffff9093166020850152918301526060820152608001610160565b3480156103c557600080fd5b50610215610fad565b3480156103da57600080fd5b5061017e6103e9366004611d50565b61103f565b3480156103fa57600080fd5b5061017e610409366004611dab565b6110db565b34801561041a57600080fd5b50610156610429366004611d24565b6111eb565b34801561043a57600080fd5b50610156610449366004611d24565b611251565b34801561045a57600080fd5b5061017e610469366004611d24565b611303565b34801561047a57600080fd5b50610215611430565b34801561048f57600080fd5b5061015661049e366004611c2e565b61147c565b3480156104af57600080fd5b506101566104be366004611c2e565b6114e0565b60006104cd611552565b6104d6846116d1565b818310156105435760405162461bcd60e51b815260206004820152602f60248201527f474420616d6f756e74206973206c6f776572207468616e2074686520636f6e7460448201526e1c9a589d5d1a5bdb88185b5bdd5b9d608a1b60648201526084015b60405180910390fd5b6001600160a01b0384166000908152609a6020526040902060028101548411156105c15760405162461bcd60e51b815260206004820152602960248201527f474420616d6f756e7420697320686967686572207468616e2074686520746f74604482015268616c20737570706c7960b81b606482015260840161053a565b60006105cd8486611de3565b905060006105db8783610d54565b9050818360020160008282546105f19190611de3565b909155505082548190849060009061060a908490611de3565b9091555050841561068f57600183015460028401546000916106349163ffffffff90911690611df6565b905060008685600201546106489190611de3565b905060006106568284611e23565b60018701805463ffffffff191663ffffffff83161790556002870180549192508991600090610686908490611de3565b90915550505050505b600283015483546040516001600160a01b038a1692339260008051602061214b833981519152926106c3928b928892611e37565b60405180910390a3925050505b9392505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa15801561073a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075e9190611e52565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa1580156107b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dc9190611e52565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108465760405162461bcd60e51b815260040161053a90611e6f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661087861173a565b6001600160a01b03161461089e5760405162461bcd60e51b815260040161053a90611ea9565b6108a781611756565b604080516000808252602082019092526108c39183919061175e565b50565b6001600160a01b0381166000908152609a60209081526040808320815160808101835281548152600182015463ffffffff16938101849052600282015492810192909252600301546060820152908083036109215750620f42405b610934683635c9adc5dea0000082611df6565b905060006201518083606001514261094c9190611de3565b6109569190611e23565b905060005b8181101561099b57676765c793fa10079d601b1b609b548461097d9190611df6565b6109879190611e23565b92508061099381611ee3565b91505061095b565b506109af683635c9adc5dea0000083611e23565b95945050505050565b6001600160a01b0381166000908152609a60209081526040808320815160808101835281548152600182015463ffffffff169381019390935260028101549183019190915260030154606082015281610a10846108c6565b90508063ffffffff168163ffffffff168360400151610a2f9190611df6565b836020015163ffffffff168460400151610a499190611df6565b610a539190611de3565b610a5d9190611e23565b949350505050565b6000610a6f611552565b610a78826116d1565b6001600160a01b0382166000908152609a602052604081206001810154909163ffffffff90911690819003610aad5750620f42405b610ab6846108c6565b60018301805463ffffffff191663ffffffff9290921691909117905560038201546201518090610ae69042611de3565b610af09190611efc565b610afa9042611de3565b6003830155506001015463ffffffff1692915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610b585760405162461bcd60e51b815260040161053a90611e6f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b8a61173a565b6001600160a01b031614610bb05760405162461bcd60e51b815260040161053a90611ea9565b610bb982611756565b610bc58282600161175e565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b606482015260840161053a565b5060008051602061210483398151915290565b6001600160a01b0382166000908152609a60209081526040808320815160808101835281548152600182015463ffffffff1693810193909352600281015491830191909152600301546060820152610ccd610fad565b604080830151835160208501519251630a68039f60e21b81526001600160a01b0394909416936329a00e7c93610d099392918990600401611f10565b602060405180830381865afa158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a9190611f31565b9150505b92915050565b6001600160a01b0382166000908152609a60209081526040808320815160808101835281548152600182015463ffffffff1693810193909352600281015491830191909152600301546060820152610daa610fad565b6040808301518351602085015192516349f9b0f760e01b81526001600160a01b0394909416936349f9b0f793610d099392918990600401611f10565b6000610df0611552565b610df9836116d1565b81600003610e0957506000610d4e565b610e1383836111eb565b6001600160a01b0384166000908152609a602052604081206002810180549394509092849290610e44908490611f4a565b9091555050805483908290600090610e5d908490611f4a565b90915550505092915050565b600054610100900460ff1615808015610e895750600054600160ff909116105b80610eaa5750610e98306118ce565b158015610eaa575060005460ff166001145b610f0d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161053a565b6000805460ff191660011790558015610f30576000805461ff0019166101001790555b81610f4684676765c793fa10079d601b1b611df6565b610f509190611e23565b609b556002609c55610f61846118dd565b8015610fa7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60675460405163bf40fac160e01b815260206004820152600e60248201526d42414e434f525f464f524d554c4160901b60448201526000916001600160a01b03169063bf40fac1906064015b602060405180830381865afa158015611016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103a9190611e52565b905090565b611047611552565b60405180608001604052808481526020018363ffffffff16815260200185815260200182600014611078578261107a565b425b90526001600160a01b03959095166000908152609a6020908152604091829020875181559087015160018201805463ffffffff191663ffffffff90921691909117905590860151600282015560609095015160039095019490945550505050565b6110e3611552565b600081116111315760405162461bcd60e51b815260206004820152601b60248201527a064656e6f6d696e61746f72206d7573742062652061626f7665203602c1b604482015260640161053a565b8061114783676765c793fa10079d601b1b611df6565b6111519190611e23565b609b819055676765c793fa10079d601b1b116111ac5760405162461bcd60e51b815260206004820152601a602482015279496e76616c6964206e6f6d206f722064656e6f6d2076616c756560301b604482015260640161053a565b604080518381526020810183905233917fcd3db955892df8543ef392cb55c3f36e13ad4c38e151c8315101b3006ef105df910160405180910390a25050565b6001600160a01b0382166000908152609a6020908152604080832081516080810183528154808252600183015463ffffffff16948201949094526002820154928101839052600390910154606082015291906112479085611df6565b610d4a9190611e23565b600061125b611552565b611264836116d1565b60006112708484610c77565b6001600160a01b0385166000908152609a6020526040812060028101805493945090928492906112a1908490611f4a565b90915550508054849082906000906112ba908490611f4a565b9091555050600281015481546040516001600160a01b03881692339260008051602061214b833981519152926112f3928a928992611e37565b60405180910390a3509392505050565b61130b611552565b611314826116d1565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113789190611f5d565b6113869060ff16601b611de3565b6001600160a01b0384166000908152609a602052604081209192506113aa856114e0565b9050838260020160008282546113c09190611f4a565b909155506113d1905083600a612064565b8183600201546113e19190611df6565b83546113f890676765c793fa10079d601b1b611df6565b6114029190611e23565b61140c9190611e23565b600192909201805463ffffffff191663ffffffff9093169290921790915550505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac190606401610ff9565b6000611486611552565b61148f826116d1565b600061149a836109b8565b6001600160a01b0384166000908152609a60205260408120600201805492935083929091906114ca908490611f4a565b909155506114d9905083610a65565b5092915050565b6001600160a01b0381166000908152609a60209081526040808320815160808101835281548152600182015463ffffffff16938101849052600282015492810183905260039091015460608201529161153891611df6565b8151611548906305f5e100611df6565b6106d09190611e23565b60675460405163bf40fac160e01b81526020600482015260076024820152665245534552564560c81b604482015233916001600160a01b03169063bf40fac190606401602060405180830381865afa1580156115b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d69190611e52565b6001600160a01b03161480611674575060675460405163bf40fac160e01b815260206004820152600660248201526520ab20aa20a960d11b604482015233916001600160a01b03169063bf40fac190606401602060405180830381865afa158015611645573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116699190611e52565b6001600160a01b0316145b6116cf5760405162461bcd60e51b815260206004820152602660248201527f476f6f644d61726b65744d616b65723a206e6f742052657365727665206f722060448201526520bb30ba30b960d11b606482015260840161053a565b565b6001600160a01b0381166000908152609a602052604090206002810154610bc55760405162461bcd60e51b815260206004820152601d60248201527f5265736572766520746f6b656e206e6f7420696e697469616c697a6564000000604482015260640161053a565b600080516020612104833981519152546001600160a01b031690565b6108c3611900565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561179657611791836119c3565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156117f0575060408051601f3d908101601f191682019092526117ed91810190611f31565b60015b6118535760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b606482015260840161053a565b60008051602061210483398151915281146118c25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b606482015260840161053a565b50611791838383611a5d565b6001600160a01b03163b151590565b606780546001600160a01b0319166001600160a01b0383161790556108c36106d7565b60655460408051632d77bef360e11b8152905133926001600160a01b031691635aef7de69160048083019260209291908290030181865afa158015611949573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196d9190611e52565b6001600160a01b0316146116cf5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206176617461722063616e2063616c6c2074686973206d6574686f64604482015260640161053a565b6119cc816118ce565b611a2e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161053a565b60008051602061210483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611a6683611a82565b600082511180611a735750805b1561179157610fa78383611ac2565b611a8b816119c3565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060611acd836118ce565b611b285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161053a565b600080846001600160a01b031684604051611b439190612094565b600060405180830381855af49150503d8060008114611b7e576040519150601f19603f3d011682016040523d82523d6000602084013e611b83565b606091505b50915091506109af82826040518060600160405280602781526020016121246027913960608315611bb55750816106d0565b6106d08383815115611bca5781518083602001fd5b8060405162461bcd60e51b815260040161053a91906120b0565b6001600160a01b03811681146108c357600080fd5b600080600060608486031215611c0e57600080fd5b8335611c1981611be4565b95602085013595506040909401359392505050565b600060208284031215611c4057600080fd5b81356106d081611be4565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215611c7457600080fd5b8235611c7f81611be4565b915060208301356001600160401b0380821115611c9b57600080fd5b818501915085601f830112611caf57600080fd5b813581811115611cc157611cc1611c4b565b604051601f8201601f19908116603f01168101908382118183101715611ce957611ce9611c4b565b81604052828152886020848701011115611d0257600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060408385031215611d3757600080fd5b8235611d4281611be4565b946020939093013593505050565b600080600080600060a08688031215611d6857600080fd5b8535611d7381611be4565b94506020860135935060408601359250606086013563ffffffff81168114611d9a57600080fd5b949793965091946080013592915050565b60008060408385031215611dbe57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b81810381811115610d4e57610d4e611dcd565b8082028115828204841417610d4e57610d4e611dcd565b634e487b7160e01b600052601260045260246000fd5b600082611e3257611e32611e0d565b500490565b93845260208401929092526040830152606082015260800190565b600060208284031215611e6457600080fd5b81516106d081611be4565b6020808252602c908201526000805160206120e483398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201526000805160206120e483398151915260408201526b6163746976652070726f787960a01b606082015260800190565b600060018201611ef557611ef5611dcd565b5060010190565b600082611f0b57611f0b611e0d565b500690565b938452602084019290925263ffffffff166040830152606082015260800190565b600060208284031215611f4357600080fd5b5051919050565b80820180821115610d4e57610d4e611dcd565b600060208284031215611f6f57600080fd5b815160ff811681146106d057600080fd5b600181815b80851115611fbb578160001904821115611fa157611fa1611dcd565b80851615611fae57918102915b93841c9390800290611f85565b509250929050565b600082611fd257506001610d4e565b81611fdf57506000610d4e565b8160018114611ff55760028114611fff5761201b565b6001915050610d4e565b60ff84111561201057612010611dcd565b50506001821b610d4e565b5060208310610133831016604e8410600b841016171561203e575081810a610d4e565b6120488383611f80565b806000190482111561205c5761205c611dcd565b029392505050565b60006106d08383611fc3565b60005b8381101561208b578181015183820152602001612073565b50506000910152565b600082516120a6818460208701612070565b9190910192915050565b60208152600082518060208401526120cf816040850160208701612070565b601f01601f1916919091016040019291505056fe46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564ed639966d5b0a89f5ac16d6359c7707785de6e51a00f07dd3197e5fbf0a30374a26469706673582212200b3bd34e1ed64dfd745f70253d2074a3b8f0348835732039e8f6cba24df2396664736f6c63430008130033",
  "deployedBytecode": "0x6080604052600436106101315760003560e01c80630b184866146101365780631b3c90a8146101695780633659cfe614610180578063371d52dc146101a05780633e21374e146101d55780633e6326fc146101f55780634162169f1461022d57806346f7cb231461024d5780634f1ef2861461026d57806352d1902d146102805780635aef7de6146102955780635cf3a7a9146102b55780636a989e6e146102d55780636cb4b4c1146102f557806374920d301461030b5780637a1ac61e1461032b578063835bbd551461034b5780638c495962146103b95780638ee090fb146103ce5780639f2d0d07146103ee578063bc179d451461040e578063cce7ec131461042e578063d5dc7eda1461044e578063e1758bd81461046e578063e72a083314610483578063e9833c2f146104a3575b600080fd5b34801561014257600080fd5b50610156610151366004611bf9565b6104c3565b6040519081526020015b60405180910390f35b34801561017557600080fd5b5061017e6106d7565b005b34801561018c57600080fd5b5061017e61019b366004611c2e565b6107fe565b3480156101ac57600080fd5b506101c06101bb366004611c2e565b6108c6565b60405163ffffffff9091168152602001610160565b3480156101e157600080fd5b506101566101f0366004611c2e565b6109b8565b34801561020157600080fd5b50606754610215906001600160a01b031681565b6040516001600160a01b039091168152602001610160565b34801561023957600080fd5b50606554610215906001600160a01b031681565b34801561025957600080fd5b506101c0610268366004611c2e565b610a65565b61017e61027b366004611c61565b610b10565b34801561028c57600080fd5b50610156610bc9565b3480156102a157600080fd5b50606654610215906001600160a01b031681565b3480156102c157600080fd5b506101566102d0366004611d24565b610c77565b3480156102e157600080fd5b506101566102f0366004611d24565b610d54565b34801561030157600080fd5b50610156609b5481565b34801561031757600080fd5b50610156610326366004611d24565b610de6565b34801561033757600080fd5b5061017e610346366004611bf9565b610e69565b34801561035757600080fd5b50610394610366366004611c2e565b609a602052600090815260409020805460018201546002830154600390930154919263ffffffff9091169184565b6040805194855263ffffffff9093166020850152918301526060820152608001610160565b3480156103c557600080fd5b50610215610fad565b3480156103da57600080fd5b5061017e6103e9366004611d50565b61103f565b3480156103fa57600080fd5b5061017e610409366004611dab565b6110db565b34801561041a57600080fd5b50610156610429366004611d24565b6111eb565b34801561043a57600080fd5b50610156610449366004611d24565b611251565b34801561045a57600080fd5b5061017e610469366004611d24565b611303565b34801561047a57600080fd5b50610215611430565b34801561048f57600080fd5b5061015661049e366004611c2e565b61147c565b3480156104af57600080fd5b506101566104be366004611c2e565b6114e0565b60006104cd611552565b6104d6846116d1565b818310156105435760405162461bcd60e51b815260206004820152602f60248201527f474420616d6f756e74206973206c6f776572207468616e2074686520636f6e7460448201526e1c9a589d5d1a5bdb88185b5bdd5b9d608a1b60648201526084015b60405180910390fd5b6001600160a01b0384166000908152609a6020526040902060028101548411156105c15760405162461bcd60e51b815260206004820152602960248201527f474420616d6f756e7420697320686967686572207468616e2074686520746f74604482015268616c20737570706c7960b81b606482015260840161053a565b60006105cd8486611de3565b905060006105db8783610d54565b9050818360020160008282546105f19190611de3565b909155505082548190849060009061060a908490611de3565b9091555050841561068f57600183015460028401546000916106349163ffffffff90911690611df6565b905060008685600201546106489190611de3565b905060006106568284611e23565b60018701805463ffffffff191663ffffffff83161790556002870180549192508991600090610686908490611de3565b90915550505050505b600283015483546040516001600160a01b038a1692339260008051602061214b833981519152926106c3928b928892611e37565b60405180910390a3925050505b9392505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa15801561073a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075e9190611e52565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa1580156107b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dc9190611e52565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108465760405162461bcd60e51b815260040161053a90611e6f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661087861173a565b6001600160a01b03161461089e5760405162461bcd60e51b815260040161053a90611ea9565b6108a781611756565b604080516000808252602082019092526108c39183919061175e565b50565b6001600160a01b0381166000908152609a60209081526040808320815160808101835281548152600182015463ffffffff16938101849052600282015492810192909252600301546060820152908083036109215750620f42405b610934683635c9adc5dea0000082611df6565b905060006201518083606001514261094c9190611de3565b6109569190611e23565b905060005b8181101561099b57676765c793fa10079d601b1b609b548461097d9190611df6565b6109879190611e23565b92508061099381611ee3565b91505061095b565b506109af683635c9adc5dea0000083611e23565b95945050505050565b6001600160a01b0381166000908152609a60209081526040808320815160808101835281548152600182015463ffffffff169381019390935260028101549183019190915260030154606082015281610a10846108c6565b90508063ffffffff168163ffffffff168360400151610a2f9190611df6565b836020015163ffffffff168460400151610a499190611df6565b610a539190611de3565b610a5d9190611e23565b949350505050565b6000610a6f611552565b610a78826116d1565b6001600160a01b0382166000908152609a602052604081206001810154909163ffffffff90911690819003610aad5750620f42405b610ab6846108c6565b60018301805463ffffffff191663ffffffff9290921691909117905560038201546201518090610ae69042611de3565b610af09190611efc565b610afa9042611de3565b6003830155506001015463ffffffff1692915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610b585760405162461bcd60e51b815260040161053a90611e6f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b8a61173a565b6001600160a01b031614610bb05760405162461bcd60e51b815260040161053a90611ea9565b610bb982611756565b610bc58282600161175e565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c645760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b606482015260840161053a565b5060008051602061210483398151915290565b6001600160a01b0382166000908152609a60209081526040808320815160808101835281548152600182015463ffffffff1693810193909352600281015491830191909152600301546060820152610ccd610fad565b604080830151835160208501519251630a68039f60e21b81526001600160a01b0394909416936329a00e7c93610d099392918990600401611f10565b602060405180830381865afa158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a9190611f31565b9150505b92915050565b6001600160a01b0382166000908152609a60209081526040808320815160808101835281548152600182015463ffffffff1693810193909352600281015491830191909152600301546060820152610daa610fad565b6040808301518351602085015192516349f9b0f760e01b81526001600160a01b0394909416936349f9b0f793610d099392918990600401611f10565b6000610df0611552565b610df9836116d1565b81600003610e0957506000610d4e565b610e1383836111eb565b6001600160a01b0384166000908152609a602052604081206002810180549394509092849290610e44908490611f4a565b9091555050805483908290600090610e5d908490611f4a565b90915550505092915050565b600054610100900460ff1615808015610e895750600054600160ff909116105b80610eaa5750610e98306118ce565b158015610eaa575060005460ff166001145b610f0d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161053a565b6000805460ff191660011790558015610f30576000805461ff0019166101001790555b81610f4684676765c793fa10079d601b1b611df6565b610f509190611e23565b609b556002609c55610f61846118dd565b8015610fa7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60675460405163bf40fac160e01b815260206004820152600e60248201526d42414e434f525f464f524d554c4160901b60448201526000916001600160a01b03169063bf40fac1906064015b602060405180830381865afa158015611016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103a9190611e52565b905090565b611047611552565b60405180608001604052808481526020018363ffffffff16815260200185815260200182600014611078578261107a565b425b90526001600160a01b03959095166000908152609a6020908152604091829020875181559087015160018201805463ffffffff191663ffffffff90921691909117905590860151600282015560609095015160039095019490945550505050565b6110e3611552565b600081116111315760405162461bcd60e51b815260206004820152601b60248201527a064656e6f6d696e61746f72206d7573742062652061626f7665203602c1b604482015260640161053a565b8061114783676765c793fa10079d601b1b611df6565b6111519190611e23565b609b819055676765c793fa10079d601b1b116111ac5760405162461bcd60e51b815260206004820152601a602482015279496e76616c6964206e6f6d206f722064656e6f6d2076616c756560301b604482015260640161053a565b604080518381526020810183905233917fcd3db955892df8543ef392cb55c3f36e13ad4c38e151c8315101b3006ef105df910160405180910390a25050565b6001600160a01b0382166000908152609a6020908152604080832081516080810183528154808252600183015463ffffffff16948201949094526002820154928101839052600390910154606082015291906112479085611df6565b610d4a9190611e23565b600061125b611552565b611264836116d1565b60006112708484610c77565b6001600160a01b0385166000908152609a6020526040812060028101805493945090928492906112a1908490611f4a565b90915550508054849082906000906112ba908490611f4a565b9091555050600281015481546040516001600160a01b03881692339260008051602061214b833981519152926112f3928a928992611e37565b60405180910390a3509392505050565b61130b611552565b611314826116d1565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113789190611f5d565b6113869060ff16601b611de3565b6001600160a01b0384166000908152609a602052604081209192506113aa856114e0565b9050838260020160008282546113c09190611f4a565b909155506113d1905083600a612064565b8183600201546113e19190611df6565b83546113f890676765c793fa10079d601b1b611df6565b6114029190611e23565b61140c9190611e23565b600192909201805463ffffffff191663ffffffff9093169290921790915550505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac190606401610ff9565b6000611486611552565b61148f826116d1565b600061149a836109b8565b6001600160a01b0384166000908152609a60205260408120600201805492935083929091906114ca908490611f4a565b909155506114d9905083610a65565b5092915050565b6001600160a01b0381166000908152609a60209081526040808320815160808101835281548152600182015463ffffffff16938101849052600282015492810183905260039091015460608201529161153891611df6565b8151611548906305f5e100611df6565b6106d09190611e23565b60675460405163bf40fac160e01b81526020600482015260076024820152665245534552564560c81b604482015233916001600160a01b03169063bf40fac190606401602060405180830381865afa1580156115b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d69190611e52565b6001600160a01b03161480611674575060675460405163bf40fac160e01b815260206004820152600660248201526520ab20aa20a960d11b604482015233916001600160a01b03169063bf40fac190606401602060405180830381865afa158015611645573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116699190611e52565b6001600160a01b0316145b6116cf5760405162461bcd60e51b815260206004820152602660248201527f476f6f644d61726b65744d616b65723a206e6f742052657365727665206f722060448201526520bb30ba30b960d11b606482015260840161053a565b565b6001600160a01b0381166000908152609a602052604090206002810154610bc55760405162461bcd60e51b815260206004820152601d60248201527f5265736572766520746f6b656e206e6f7420696e697469616c697a6564000000604482015260640161053a565b600080516020612104833981519152546001600160a01b031690565b6108c3611900565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561179657611791836119c3565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156117f0575060408051601f3d908101601f191682019092526117ed91810190611f31565b60015b6118535760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b606482015260840161053a565b60008051602061210483398151915281146118c25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b606482015260840161053a565b50611791838383611a5d565b6001600160a01b03163b151590565b606780546001600160a01b0319166001600160a01b0383161790556108c36106d7565b60655460408051632d77bef360e11b8152905133926001600160a01b031691635aef7de69160048083019260209291908290030181865afa158015611949573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196d9190611e52565b6001600160a01b0316146116cf5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206176617461722063616e2063616c6c2074686973206d6574686f64604482015260640161053a565b6119cc816118ce565b611a2e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161053a565b60008051602061210483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611a6683611a82565b600082511180611a735750805b1561179157610fa78383611ac2565b611a8b816119c3565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060611acd836118ce565b611b285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161053a565b600080846001600160a01b031684604051611b439190612094565b600060405180830381855af49150503d8060008114611b7e576040519150601f19603f3d011682016040523d82523d6000602084013e611b83565b606091505b50915091506109af82826040518060600160405280602781526020016121246027913960608315611bb55750816106d0565b6106d08383815115611bca5781518083602001fd5b8060405162461bcd60e51b815260040161053a91906120b0565b6001600160a01b03811681146108c357600080fd5b600080600060608486031215611c0e57600080fd5b8335611c1981611be4565b95602085013595506040909401359392505050565b600060208284031215611c4057600080fd5b81356106d081611be4565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215611c7457600080fd5b8235611c7f81611be4565b915060208301356001600160401b0380821115611c9b57600080fd5b818501915085601f830112611caf57600080fd5b813581811115611cc157611cc1611c4b565b604051601f8201601f19908116603f01168101908382118183101715611ce957611ce9611c4b565b81604052828152886020848701011115611d0257600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060408385031215611d3757600080fd5b8235611d4281611be4565b946020939093013593505050565b600080600080600060a08688031215611d6857600080fd5b8535611d7381611be4565b94506020860135935060408601359250606086013563ffffffff81168114611d9a57600080fd5b949793965091946080013592915050565b60008060408385031215611dbe57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b81810381811115610d4e57610d4e611dcd565b8082028115828204841417610d4e57610d4e611dcd565b634e487b7160e01b600052601260045260246000fd5b600082611e3257611e32611e0d565b500490565b93845260208401929092526040830152606082015260800190565b600060208284031215611e6457600080fd5b81516106d081611be4565b6020808252602c908201526000805160206120e483398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201526000805160206120e483398151915260408201526b6163746976652070726f787960a01b606082015260800190565b600060018201611ef557611ef5611dcd565b5060010190565b600082611f0b57611f0b611e0d565b500690565b938452602084019290925263ffffffff166040830152606082015260800190565b600060208284031215611f4357600080fd5b5051919050565b80820180821115610d4e57610d4e611dcd565b600060208284031215611f6f57600080fd5b815160ff811681146106d057600080fd5b600181815b80851115611fbb578160001904821115611fa157611fa1611dcd565b80851615611fae57918102915b93841c9390800290611f85565b509250929050565b600082611fd257506001610d4e565b81611fdf57506000610d4e565b8160018114611ff55760028114611fff5761201b565b6001915050610d4e565b60ff84111561201057612010611dcd565b50506001821b610d4e565b5060208310610133831016604e8410600b841016171561203e575081810a610d4e565b6120488383611f80565b806000190482111561205c5761205c611dcd565b029392505050565b60006106d08383611fc3565b60005b8381101561208b578181015183820152602001612073565b50506000910152565b600082516120a6818460208701612070565b9190910192915050565b60208152600082518060208401526120cf816040850160208701612070565b601f01601f1916919091016040019291505056fe46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564ed639966d5b0a89f5ac16d6359c7707785de6e51a00f07dd3197e5fbf0a30374a26469706673582212200b3bd34e1ed64dfd745f70253d2074a3b8f0348835732039e8f6cba24df2396664736f6c63430008130033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
